using System.Runtime.InteropServices;
namespace XFESystem.NativeKernel;
[StructLayout(LayoutKind.Sequential)]
public unsafe struct NativeBootInfo
{
public ulong ProtocolSupported, Hhdm;
public MemoryMapEntry** MemoryEntries;
public ulong MemoryEntryCount;
public LimineFramebuffer* Framebuffer;
public ulong Rsdp;
public ulong EfiSystemTable;
}
[StructLayout(LayoutKind.Sequential)]
public struct MemoryMapEntry { public ulong Base, Length, Kind; }
// Only the mandatory revision-zero framebuffer prefix is consumed.
[StructLayout(LayoutKind.Sequential)]
public unsafe struct LimineFramebuffer
{
public byte* Address;
public ulong Width, Height, Pitch;
public ushort BitsPerPixel;
public byte MemoryModel, RedSize, RedShift, GreenSize, GreenShift, BlueSize, BlueShift;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DescriptorPointer { public ushort Limit; public ulong Base; }
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct InterruptGate
{
public ushort OffsetLow, Selector;
public byte Ist, Attributes;
public ushort OffsetMiddle;
public uint OffsetHigh, Reserved;
}
[StructLayout(LayoutKind.Sequential)]
public struct InterruptFrame
{
public ulong R15, R14, R13, R12, R11, R10, R9, R8, Rsi, Rdi, Rbp, Rdx, Rcx, Rbx, Rax;
public ulong Vector, Error, Rip, Cs, Rflags;
public ulong Rsp, Ss; // Long-mode interrupt stack frame; verified by INT3 self-test.
}
[StructLayout(LayoutKind.Sequential)]
public struct NativeFrameSurface
{
public ulong Address, MappedBytes;
public uint Width, Height, PitchBytes, BitsPerPixel;
public uint RedMaskSize, RedMaskShift, GreenMaskSize, GreenMaskShift, BlueMaskSize, BlueMaskShift;
}
public static unsafe class Native
{
const string Library = "xfe_native";
[DllImport(Library, EntryPoint = "xfe_in8")] public static extern byte In8(ushort port);
[DllImport(Library, EntryPoint = "xfe_out8")] public static extern void Out8(ushort port, byte value);
[DllImport(Library, EntryPoint = "xfe_pause")] public static extern void Pause();
[DllImport(Library, EntryPoint = "xfe_halt")] public static extern void Halt();
[DllImport(Library, EntryPoint = "xfe_idle")] public static extern void Idle();
[DllImport(Library, EntryPoint = "xfe_irq_save")] public static extern ulong IrqSave();
[DllImport(Library, EntryPoint = "xfe_irq_restore")] public static extern void IrqRestore(ulong flags);
[DllImport(Library, EntryPoint = "xfe_mmio_read32")] public static extern uint MmioRead32(ulong address);
[DllImport(Library, EntryPoint = "xfe_mmio_write32")] public static extern void MmioWrite32(ulong address, uint value);
[DllImport(Library, EntryPoint = "xfe_context_switch")] public static extern void ContextSwitch(void* current, void* next);
[DllImport(Library, EntryPoint = "xfe_context_initialize")] public static extern void ContextInitialize(void* context);
[DllImport(Library, EntryPoint = "xfe_thread_trampoline_address")] public static extern ulong ThreadTrampolineAddress();
[DllImport(Library, EntryPoint = "xfe_thread_probe_address")] public static extern ulong ThreadProbeAddress();
[DllImport(Library, EntryPoint = "xfe_boot_stack_top")] public static extern ulong BootStackTop();
[DllImport(Library, EntryPoint = "xfe_breakpoint_stack")] public static extern ulong BreakpointStack();
[DllImport(Library, EntryPoint = "xfe_thread_tls_create")] public static extern ulong ThreadTlsCreate();
[DllImport(Library, EntryPoint = "xfe_thread_tls_release")] public static extern int ThreadTlsRelease(ulong control);
[DllImport(Library, EntryPoint = "xfe_thread_runtime_exit")] public static extern int ThreadRuntimeExit(void* runtimeThread);
[DllImport(Library, EntryPoint = "xfe_thread_try_hijack")] public static extern int TryHijack(void* runtimeThread, void* limitedContext);
[DllImport(Library, EntryPoint = "xfe_runtime_hardware_exception_bridge")]
public static extern int HardwareException(InterruptFrame* frame, ulong faultAddress, void* fxSave);
[DllImport(Library, EntryPoint = "xfe_cpuid")] public static extern void CpuId(uint leaf, uint subleaf, uint* result);
[DllImport(Library, EntryPoint = "xfe_read_cr2")] public static extern ulong ReadCr2();
[DllImport(Library, EntryPoint = "xfe_read_cr3")] public static extern ulong ReadCr3();
[DllImport(Library, EntryPoint = "xfe_read_cr4")] public static extern ulong ReadCr4();
[DllImport(Library, EntryPoint = "xfe_read_msr")] public static extern ulong ReadMsr(uint register);
[DllImport(Library, EntryPoint = "xfe_write_msr")] public static extern void WriteMsr(uint register, ulong value);
[DllImport(Library, EntryPoint = "xfe_invalidate_page")] public static extern void InvalidatePage(ulong address);
[DllImport(Library, EntryPoint = "xfe_libc_selftest")] public static extern int LibcSelfTest();
[DllImport(Library, EntryPoint = "xfe_loaded_elf_selftest")] public static extern int LoadedElfSelfTest();
[DllImport(Library, EntryPoint = "xfe_stdio_selftest")] public static extern int StdioSelfTest();
[DllImport(Library, EntryPoint = "xfe_probe_info")] public static extern ulong ProbeInfo(uint kind);
[DllImport(Library, EntryPoint = "xfe_probe_access")] public static extern void ProbeAccess(ulong address, uint kind);
[DllImport(Library, EntryPoint = "xfe_read_tsc")] public static extern ulong ReadTsc();
[DllImport(Library, EntryPoint = "xfe_storage")] public static extern void* Storage(uint kind);
[DllImport(Library, EntryPoint = "xfe_kernel_image_start")] public static extern ulong KernelImageStart();
[DllImport(Library, EntryPoint = "xfe_kernel_image_end")] public static extern ulong KernelImageEnd();
[DllImport(Library, EntryPoint = "xfe_load_gdt")] public static extern void LoadGdt(DescriptorPointer* pointer);
[DllImport(Library, EntryPoint = "xfe_load_idt")] public static extern void LoadIdt(DescriptorPointer* pointer);
[DllImport(Library, EntryPoint = "xfe_read_gdt")] public static extern void ReadGdt(DescriptorPointer* pointer);
[DllImport(Library, EntryPoint = "xfe_read_idt")] public static extern void ReadIdt(DescriptorPointer* pointer);
[DllImport(Library, EntryPoint = "xfe_load_tss")] public static extern void LoadTss(ushort selector);
[DllImport(Library, EntryPoint = "xfe_isr_address")] public static extern ulong IsrAddress(uint vector);
[DllImport(Library, EntryPoint = "xfe_breakpoint")] public static extern void Breakpoint();
[DllImport(Library, EntryPoint = "xfe_memory_barrier")] public static extern void MemoryBarrier();
}
using System.Runtime.InteropServices;
namespace XFESystem.NativeKernel;
[StructLayout(LayoutKind.Sequential)]
public unsafe struct NativeBootInfo
{
public ulong ProtocolSupported, Hhdm;
public MemoryMapEntry** MemoryEntries;
public ulong MemoryEntryCount;
public LimineFramebuffer* Framebuffer;
public ulong Rsdp;
public ulong EfiSystemTable;
}
[StructLayout(LayoutKind.Sequential)]
public struct MemoryMapEntry { public ulong Base, Length, Kind; }
// Only the mandatory revision-zero framebuffer prefix is consumed.
[StructLayout(LayoutKind.Sequential)]
public unsafe struct LimineFramebuffer
{
public byte* Address;
public ulong Width, Height, Pitch;
public ushort BitsPerPixel;
public byte MemoryModel, RedSize, RedShift, GreenSize, GreenShift, BlueSize, BlueShift;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DescriptorPointer { public ushort Limit; public ulong Base; }
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct InterruptGate
{
public ushort OffsetLow, Selector;
public byte Ist, Attributes;
public ushort OffsetMiddle;
public uint OffsetHigh, Reserved;
}
[StructLayout(LayoutKind.Sequential)]
public struct InterruptFrame
{
public ulong R15, R14, R13, R12, R11, R10, R9, R8, Rsi, Rdi, Rbp, Rdx, Rcx, Rbx, Rax;
public ulong Vector, Error, Rip, Cs, Rflags;
public ulong Rsp, Ss; // Long-mode interrupt stack frame; verified by INT3 self-test.
}
[StructLayout(LayoutKind.Sequential)]
public struct NativeFrameSurface
{
public ulong Address, MappedBytes;
public uint Width, Height, PitchBytes, BitsPerPixel;
public uint RedMaskSize, RedMaskShift, GreenMaskSize, GreenMaskShift, BlueMaskSize, BlueMaskShift;
}
public static unsafe class Native
{
const string Library = "xfe_native";
[DllImport(Library, EntryPoint = "xfe_in8")] public static extern byte In8(ushort port);
[DllImport(Library, EntryPoint = "xfe_out8")] public static extern void Out8(ushort port, byte value);
[DllImport(Library, EntryPoint = "xfe_pause")] public static extern void Pause();
[DllImport(Library, EntryPoint = "xfe_halt")] public static extern void Halt();
[DllImport(Library, EntryPoint = "xfe_idle")] public static extern void Idle();
[DllImport(Library, EntryPoint = "xfe_irq_save")] public static extern ulong IrqSave();
[DllImport(Library, EntryPoint = "xfe_irq_restore")] public static extern void IrqRestore(ulong flags);
[DllImport(Library, EntryPoint = "xfe_mmio_read32")] public static extern uint MmioRead32(ulong address);
[DllImport(Library, EntryPoint = "xfe_mmio_write32")] public static extern void MmioWrite32(ulong address, uint value);
[DllImport(Library, EntryPoint = "xfe_context_switch")] public static extern void ContextSwitch(void* current, void* next);
[DllImport(Library, EntryPoint = "xfe_context_initialize")] public static extern void ContextInitialize(void* context);
[DllImport(Library, EntryPoint = "xfe_thread_trampoline_address")] public static extern ulong ThreadTrampolineAddress();
[DllImport(Library, EntryPoint = "xfe_thread_probe_address")] public static extern ulong ThreadProbeAddress();
[DllImport(Library, EntryPoint = "xfe_boot_stack_top")] public static extern ulong BootStackTop();
[DllImport(Library, EntryPoint = "xfe_breakpoint_stack")] public static extern ulong BreakpointStack();
[DllImport(Library, EntryPoint = "xfe_thread_tls_create")] public static extern ulong ThreadTlsCreate();
[DllImport(Library, EntryPoint = "xfe_thread_tls_release")] public static extern int ThreadTlsRelease(ulong control);
[DllImport(Library, EntryPoint = "xfe_thread_runtime_exit")] public static extern int ThreadRuntimeExit(void* runtimeThread);
[DllImport(Library, EntryPoint = "xfe_thread_try_hijack")] public static extern int TryHijack(void* runtimeThread, void* limitedContext);
[DllImport(Library, EntryPoint = "xfe_runtime_hardware_exception_bridge")]
public static extern int HardwareException(InterruptFrame* frame, ulong faultAddress, void* fxSave);
[DllImport(Library, EntryPoint = "xfe_cpuid")] public static extern void CpuId(uint leaf, uint subleaf, uint* result);
[DllImport(Library, EntryPoint = "xfe_read_cr2")] public static extern ulong ReadCr2();
[DllImport(Library, EntryPoint = "xfe_read_cr3")] public static extern ulong ReadCr3();
[DllImport(Library, EntryPoint = "xfe_read_cr4")] public static extern ulong ReadCr4();
[DllImport(Library, EntryPoint = "xfe_read_msr")] public static extern ulong ReadMsr(uint register);
[DllImport(Library, EntryPoint = "xfe_write_msr")] public static extern void WriteMsr(uint register, ulong value);
[DllImport(Library, EntryPoint = "xfe_invalidate_page")] public static extern void InvalidatePage(ulong address);
[DllImport(Library, EntryPoint = "xfe_libc_selftest")] public static extern int LibcSelfTest();
[DllImport(Library, EntryPoint = "xfe_loaded_elf_selftest")] public static extern int LoadedElfSelfTest();
[DllImport(Library, EntryPoint = "xfe_stdio_selftest")] public static extern int StdioSelfTest();
[DllImport(Library, EntryPoint = "xfe_probe_info")] public static extern ulong ProbeInfo(uint kind);
[DllImport(Library, EntryPoint = "xfe_probe_access")] public static extern void ProbeAccess(ulong address, uint kind);
[DllImport(Library, EntryPoint = "xfe_read_tsc")] public static extern ulong ReadTsc();
[DllImport(Library, EntryPoint = "xfe_storage")] public static extern void* Storage(uint kind);
[DllImport(Library, EntryPoint = "xfe_kernel_image_start")] public static extern ulong KernelImageStart();
[DllImport(Library, EntryPoint = "xfe_kernel_image_end")] public static extern ulong KernelImageEnd();
[DllImport(Library, EntryPoint = "xfe_load_gdt")] public static extern void LoadGdt(DescriptorPointer* pointer);
[DllImport(Library, EntryPoint = "xfe_load_idt")] public static extern void LoadIdt(DescriptorPointer* pointer);
[DllImport(Library, EntryPoint = "xfe_read_gdt")] public static extern void ReadGdt(DescriptorPointer* pointer);
[DllImport(Library, EntryPoint = "xfe_read_idt")] public static extern void ReadIdt(DescriptorPointer* pointer);
[DllImport(Library, EntryPoint = "xfe_load_tss")] public static extern void LoadTss(ushort selector);
[DllImport(Library, EntryPoint = "xfe_isr_address")] public static extern ulong IsrAddress(uint vector);
[DllImport(Library, EntryPoint = "xfe_breakpoint")] public static extern void Breakpoint();
[DllImport(Library, EntryPoint = "xfe_memory_barrier")] public static extern void MemoryBarrier();
}