namespace XFESystem.NativeKernel;
public static unsafe class Cpu
{
public static uint MaximumLeaf, ApicId;
public static ulong BreakpointCount;
public static bool BreakpointStackMatches;
static ulong _expectedAddress, _expectedRip, _resumeRip, _expectedError;
static bool _faultPending, _faultObserved;
// IRQ entry must preserve the interrupted System V red zone. Each scheduled
// thread owns its own IST3 stack, including any suspended interrupt frame.
// The caller masks interrupts before changing the active thread and this TSS.
public static bool SetInterruptStack(ulong top)
{
byte* tss = (byte*)Native.Storage(2);
if (tss == null || top == 0 || (top & 15) != 0) return false;
*(ulong*)(tss + 52) = top;
Native.MemoryBarrier();
return true;
}
public static bool ProtectionProbe(ulong address, uint kind)
{
if (_faultPending || kind > 2) return false;
_expectedAddress = address;
_expectedRip = kind == 2 ? address : Native.ProbeInfo(kind * 2);
_resumeRip = Native.ProbeInfo(kind == 2 ? 4u : kind * 2 + 1);
_expectedError = kind == 0 ? 0UL : kind == 1 ? 3UL : 17UL;
_faultObserved = false;
_faultPending = true;
Native.ProbeAccess(address, kind);
bool observed = _faultObserved;
_faultPending = false;
return observed;
}
public static bool HandleExpectedFault(InterruptFrame* frame, ulong address)
{
if (!_faultPending || frame == null || frame->Vector != 14 || frame->Rip != _expectedRip ||
address != _expectedAddress || (frame->Error & 31) != _expectedError) return false;
frame->Rip = _resumeRip;
_faultObserved = true;
_faultPending = false;
return true;
}
public static bool Initialize()
{
uint* result = stackalloc uint[4];
Native.CpuId(0, 0, result);
MaximumLeaf = result[0];
if (MaximumLeaf < 1) return false;
Native.CpuId(1, 0, result);
ApicId = result[1] >> 24;
if ((result[3] & (1u << 26)) == 0) return false; // bflat x64 baseline SSE2
Native.CpuId(0x80000000, 0, result);
if (result[0] < 0x80000001) return false;
Native.CpuId(0x80000001, 0, result);
return (result[3] & (1u << 29)) != 0 && (Native.ReadCr3() & ~4095UL) != 0;
}
public static bool InstallDescriptors()
{
ulong* gdt = (ulong*)Native.Storage(0);
InterruptGate* idt = (InterruptGate*)Native.Storage(1);
byte* tss = (byte*)Native.Storage(2);
if (gdt == null || idt == null || tss == null) return false;
gdt[0] = 0;
gdt[1] = 0x00af9a000000ffff;
gdt[2] = 0x00cf92000000ffff;
for (uint i = 0; i < 104; i++) tss[i] = 0;
*(ulong*)(tss + 36) = (ulong)Native.Storage(3); // IST1, private double-fault stack
*(ulong*)(tss + 44) = (ulong)Native.Storage(11); // IST2, dedicated #DE/#PF recovery stack
*(ushort*)(tss + 102) = 104; // I/O bitmap absent
ulong address = (ulong)tss;
gdt[3] = 103UL | ((address & 0xffffff) << 16) | (0x89UL << 40) | ((address & 0xff000000) << 32);
gdt[4] = address >> 32;
DescriptorPointer gdtr = new DescriptorPointer { Limit = 39, Base = (ulong)gdt };
Native.LoadGdt(&gdtr);
Native.LoadTss(24);
for (uint i = 0; i < 256; i++)
{
ulong target = Native.IsrAddress(i);
if (target == 0) return false;
idt[i].OffsetLow = (ushort)target;
idt[i].Selector = 8;
idt[i].Ist = i == 8 ? (byte)1 : i == 0 || i == 14 ? (byte)2 : i >= 32 ? (byte)3 : (byte)0;
idt[i].Attributes = 0x8e;
idt[i].OffsetMiddle = (ushort)(target >> 16);
idt[i].OffsetHigh = (uint)(target >> 32);
idt[i].Reserved = 0;
}
DescriptorPointer idtr = new DescriptorPointer { Limit = 4095, Base = (ulong)idt };
Native.LoadIdt(&idtr);
DescriptorPointer actualGdt = new DescriptorPointer(), actualIdt = new DescriptorPointer();
Native.ReadGdt(&actualGdt);
Native.ReadIdt(&actualIdt);
if (actualGdt.Base != gdtr.Base || actualGdt.Limit != gdtr.Limit ||
actualIdt.Base != idtr.Base || actualIdt.Limit != idtr.Limit) return false;
ulong prior = BreakpointCount;
Native.Breakpoint();
return BreakpointCount == prior + 1 && BreakpointStackMatches;
}
}
namespace XFESystem.NativeKernel;
public static unsafe class Cpu
{
public static uint MaximumLeaf, ApicId;
public static ulong BreakpointCount;
public static bool BreakpointStackMatches;
static ulong _expectedAddress, _expectedRip, _resumeRip, _expectedError;
static bool _faultPending, _faultObserved;
// IRQ entry must preserve the interrupted System V red zone. Each scheduled
// thread owns its own IST3 stack, including any suspended interrupt frame.
// The caller masks interrupts before changing the active thread and this TSS.
public static bool SetInterruptStack(ulong top)
{
byte* tss = (byte*)Native.Storage(2);
if (tss == null || top == 0 || (top & 15) != 0) return false;
*(ulong*)(tss + 52) = top;
Native.MemoryBarrier();
return true;
}
public static bool ProtectionProbe(ulong address, uint kind)
{
if (_faultPending || kind > 2) return false;
_expectedAddress = address;
_expectedRip = kind == 2 ? address : Native.ProbeInfo(kind * 2);
_resumeRip = Native.ProbeInfo(kind == 2 ? 4u : kind * 2 + 1);
_expectedError = kind == 0 ? 0UL : kind == 1 ? 3UL : 17UL;
_faultObserved = false;
_faultPending = true;
Native.ProbeAccess(address, kind);
bool observed = _faultObserved;
_faultPending = false;
return observed;
}
public static bool HandleExpectedFault(InterruptFrame* frame, ulong address)
{
if (!_faultPending || frame == null || frame->Vector != 14 || frame->Rip != _expectedRip ||
address != _expectedAddress || (frame->Error & 31) != _expectedError) return false;
frame->Rip = _resumeRip;
_faultObserved = true;
_faultPending = false;
return true;
}
public static bool Initialize()
{
uint* result = stackalloc uint[4];
Native.CpuId(0, 0, result);
MaximumLeaf = result[0];
if (MaximumLeaf < 1) return false;
Native.CpuId(1, 0, result);
ApicId = result[1] >> 24;
if ((result[3] & (1u << 26)) == 0) return false; // bflat x64 baseline SSE2
Native.CpuId(0x80000000, 0, result);
if (result[0] < 0x80000001) return false;
Native.CpuId(0x80000001, 0, result);
return (result[3] & (1u << 29)) != 0 && (Native.ReadCr3() & ~4095UL) != 0;
}
public static bool InstallDescriptors()
{
ulong* gdt = (ulong*)Native.Storage(0);
InterruptGate* idt = (InterruptGate*)Native.Storage(1);
byte* tss = (byte*)Native.Storage(2);
if (gdt == null || idt == null || tss == null) return false;
gdt[0] = 0;
gdt[1] = 0x00af9a000000ffff;
gdt[2] = 0x00cf92000000ffff;
for (uint i = 0; i < 104; i++) tss[i] = 0;
*(ulong*)(tss + 36) = (ulong)Native.Storage(3); // IST1, private double-fault stack
*(ulong*)(tss + 44) = (ulong)Native.Storage(11); // IST2, dedicated #DE/#PF recovery stack
*(ushort*)(tss + 102) = 104; // I/O bitmap absent
ulong address = (ulong)tss;
gdt[3] = 103UL | ((address & 0xffffff) << 16) | (0x89UL << 40) | ((address & 0xff000000) << 32);
gdt[4] = address >> 32;
DescriptorPointer gdtr = new DescriptorPointer { Limit = 39, Base = (ulong)gdt };
Native.LoadGdt(&gdtr);
Native.LoadTss(24);
for (uint i = 0; i < 256; i++)
{
ulong target = Native.IsrAddress(i);
if (target == 0) return false;
idt[i].OffsetLow = (ushort)target;
idt[i].Selector = 8;
idt[i].Ist = i == 8 ? (byte)1 : i == 0 || i == 14 ? (byte)2 : i >= 32 ? (byte)3 : (byte)0;
idt[i].Attributes = 0x8e;
idt[i].OffsetMiddle = (ushort)(target >> 16);
idt[i].OffsetHigh = (uint)(target >> 32);
idt[i].Reserved = 0;
}
DescriptorPointer idtr = new DescriptorPointer { Limit = 4095, Base = (ulong)idt };
Native.LoadIdt(&idtr);
DescriptorPointer actualGdt = new DescriptorPointer(), actualIdt = new DescriptorPointer();
Native.ReadGdt(&actualGdt);
Native.ReadIdt(&actualIdt);
if (actualGdt.Base != gdtr.Base || actualGdt.Limit != gdtr.Limit ||
actualIdt.Base != idtr.Base || actualIdt.Limit != idtr.Limit) return false;
ulong prior = BreakpointCount;
Native.Breakpoint();
return BreakpointCount == prior + 1 && BreakpointStackMatches;
}
}