XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8
using Mono.Cecil;
using Mono.Cecil.Cil;

namespace XfeBootPlatformPatch;

/// <summary>Exact IL-only latency policy; no queue, IRQ, wait, GC or mode-setting algorithms are replaced.</summary>
public static class LatencyPolicyPatch
{
    public const string DriversName = "Cosmos.Kernel.Drivers";
    public const string CoreLibName = "System.Private.CoreLib";
    public const string DriversOriginalSha256 = "c65e80e18b9d63a35c2f77384d104624ed9aa69a26db024514847e2997ed32bc";
    public const string OfficialPlugsSha256 = "0118211a282ab2255ab46526cef0d3d0e78311db5804118e39ab42c9d203a2ba";
    public const string OfficialCoreLibSha256 = "64db826d55e769d4d3d639425e0e9f02b847e5ed1be13e4ab0619b2a7eefbec5";
    public const string OriginalSchedulerTimer = "362c3257ae8fcf4dbcaaefb06abdae2989fb079f0e33a9907e0d925045d71c17";
    public const string PatchedSchedulerTimer = "2f751a9978bdc5e83756ee02eaf113d8e8e1d862534e1c06719a0207fc4aa1bd";
    public const string OriginalHotPlug = "dcff5eeeeb7afb3856fcf7773049db5da29dcf27972f9e3af3101e6de0a75594";
    public const string PatchedHotPlug = "b3b037c814637cfddd7c36b2e2ea951d2b49b05f73698c8bf785d382080595bb";
    public const uint SchedulerTimerIntervalMs = 1;
    public const uint XhciPolledDrainIntervalMs = 1;
    public const int SuppressedMonitorLogCalls = 9;
    public sealed record MonitorContract(string Name, string Original, string Patched, int[] LogInstructions);
    public static readonly MonitorContract[] Monitors =
    [
        new("LowLevelMonitor_Acquire", "36d5d38821e2684f4b8036649ac83598b8ce8c4d632504240bb896e874538fb6", "6c80108dd9bddbbb17ba195889745eafe5bac395d0c459b3f165629312b98b64", [..Enumerable.Range(0,5), ..Enumerable.Range(11,5)]),
        new("LowLevelMonitor_Release", "bb8534bad23caf86559ae0db0b5079b7e51661242f4b0b8ea36cd847136db9f7", "4700737d3f2a0aff39342b5484b420d6021652225e9ab764b6cb3a6d23cbc218", [..Enumerable.Range(0,5)]),
        new("LowLevelMonitor_Wait", "ddf1d761ce8d47159e518768c3bf6a786390d1ded79a3aa429c11843bb8e668d", "4acf7905e491ecc8c858463e4a49b739fa413b23855cced3a9ab18aaaf7d731b", [..Enumerable.Range(0,5), ..Enumerable.Range(11,5)]),
        new("LowLevelMonitor_TimedWait", "84ba9b1954ef67fa6ad1aa30e72b2edfa105cb7120569b176bfbfbd2d0845a8c", "6e56962fd277334f026c5d566b385fd0fe734c401c6c41a0fac4ad4283d310ae", [..Enumerable.Range(0,12)]),
        new("LowLevelMonitor_Signal_Release", "94811f783f1b8326228711eee7830e1dcf24714e1cf5fe0937fb662f3be07b0f", "4964a8d107dd450506690b195012a06eb51f760549376b29040e3328801c02e5", [..Enumerable.Range(0,5)])
    ];

    public static MethodDefinition SchedulerTimer(AssemblyDefinition hal) => hal.MainModule.Types.Single(type =>
        type.FullName == "Cosmos.Kernel.HAL.X64.X64PlatformInitializer").Methods.Single(method => method.Name == "StartSchedulerTimer");
    public static MethodDefinition HotPlug(AssemblyDefinition drivers) => drivers.MainModule.Types.Single(type =>
        type.FullName == "Cosmos.Kernel.Drivers.Pci.Bus.Xhci.XhciState").Methods.Single(method => method.Name == "HotPlugMain");
    public static MethodDefinition Monitor(AssemblyDefinition corelib, string name) => corelib.MainModule.Types.Single(type => type.FullName == "Interop")
        .NestedTypes.Single(type => type.FullName == "Interop/Sys").Methods.Single(method => method.Name == name);

    public static void ApplySchedulerTimer(AssemblyDefinition hal)
    {
        var method = SchedulerTimer(hal);
        Require(method, OriginalSchedulerTimer, "original x64 scheduler timer setup");
        var call = method.Body.Instructions.Single(instruction => instruction.Operand is MethodReference target &&
            target.FullName == "System.Void Cosmos.Kernel.Core.X64.Cpu.LocalApic::StartPeriodicTimer(System.UInt32)");
        if (call.Previous.OpCode != OpCodes.Ldarg_1) throw new InvalidOperationException("The LAPIC period is no longer the expected argument.");
        call.Previous.OpCode = OpCodes.Ldc_I4_1; call.Previous.Operand = null;
        Require(method, PatchedSchedulerTimer, "1 ms scheduler timer setup");
    }

    public static void ApplyIo(AssemblyDefinition drivers, AssemblyDefinition corelib)
    {
        VerifyDrivers(drivers);
        var hot = HotPlug(drivers);
        Require(hot, OriginalHotPlug, "original xHCI fallback drain");
        RequireMonitorState(corelib, false);
        var sleep = hot.Body.Instructions.Single(instruction => instruction.Operand is MethodReference target &&
            target.FullName == "System.Void Cosmos.Kernel.HAL.DriverKit.DeviceBinding::Sleep(System.UInt32)");
        if (sleep.Previous.OpCode != OpCodes.Ldc_I4_S || !Equals(sleep.Previous.Operand, (sbyte)20))
            throw new InvalidOperationException("The fallback xHCI period is no longer exactly 20 ms.");
        sleep.Previous.OpCode = OpCodes.Ldc_I4_1; sleep.Previous.Operand = null;
        foreach (var contract in Monitors)
        {
            var method = Monitor(corelib, contract.Name);
            foreach (int index in contract.LogInstructions)
            { method.Body.Instructions[index].OpCode = OpCodes.Nop; method.Body.Instructions[index].Operand = null; }
        }
        VerifyIo(drivers, corelib);
    }

    public static bool OriginalMonitorState(AssemblyDefinition corelib)
    {
        CoreLibIdentity(corelib);
        bool original = Monitors.All(contract => PlatformPatch.Fingerprint(Monitor(corelib, contract.Name)) == contract.Original);
        bool patched = Monitors.All(contract => PlatformPatch.Fingerprint(Monitor(corelib, contract.Name)) == contract.Patched);
        if (!original && !patched) throw new InvalidOperationException("Unknown or partial monitor log IL; refusing to replace waiting semantics.");
        return original;
    }

    public static void VerifyIo(AssemblyDefinition drivers, AssemblyDefinition corelib)
    {
        VerifyDrivers(drivers);
        Require(HotPlug(drivers), PatchedHotPlug, "1 ms no-MSI xHCI drain");
        RequireMonitorState(corelib, true);
    }

    private static void RequireMonitorState(AssemblyDefinition corelib, bool patched)
    {
        CoreLibIdentity(corelib);
        foreach (var contract in Monitors) Require(Monitor(corelib, contract.Name), patched ? contract.Patched : contract.Original, contract.Name);
    }
    private static void CoreLibIdentity(AssemblyDefinition corelib)
    {
        if (corelib.Name.Name != CoreLibName || corelib.Name.Version != new Version(10, 0, 0, 0))
            throw new InvalidOperationException("Only the pinned .NET 10 Cosmos-patched CoreLib is supported.");
    }
    private static void VerifyDrivers(AssemblyDefinition drivers)
    {
        if (drivers.Name.Name != DriversName || drivers.Name.Version != new Version(3, 0, 94, 0))
            throw new InvalidOperationException("Only the pinned Cosmos drivers 3.0.94 assembly is supported.");
    }
    private static void Require(MethodDefinition method, string expected, string description)
    {
        if (!method.HasBody || PlatformPatch.Fingerprint(method) != expected)
            throw new InvalidOperationException("Pinned " + description + " IL differs; no target instruction is guessed.");
    }
}