diff --git a/sdk/xtdk/amd64/ketypes.h b/sdk/xtdk/amd64/ketypes.h index 4ff38f7..c177871 100644 --- a/sdk/xtdk/amd64/ketypes.h +++ b/sdk/xtdk/amd64/ketypes.h @@ -9,12 +9,19 @@ #ifndef __XTDK_AMD64_KETYPES_H #define __XTDK_AMD64_KETYPES_H +#include #include +/* Size of the exception area */ +#define EXCEPTION_AREA_SIZE 64 + /* IOPM Definitions */ #define IO_ACCESS_MAP_NONE 0 +/* Size of the FNSAVE/FRSTOR save area */ +#define FLOATING_SAVE_AREA_SIZE ((sizeof(FLOATING_SAVE_AREA) + 15) & ~15) + /* Static Kernel-Mode address start */ #define KSEG0_BASE 0xFFFFF80000000000 @@ -24,6 +31,104 @@ /* XTOS Kernel stack size */ #define KERNEL_STACK_SIZE 0x8000 +/* Kernel frames */ +#define KEXCEPTION_FRAME_SIZE sizeof(KEXCEPTION_FRAME) +#define KSWITCH_FRAME_SIZE sizeof(KSWITCH_FRAME) +#define KTRAP_FRAME_ALIGN 0x10 +#define KTRAP_FRAME_SIZE sizeof(KTRAP_FRAME) + +/* Size of legacy 387 registers */ +#define SIZE_OF_80387_REGISTERS 80 + +/* Floating point state storing structure */ +typedef struct _FLOATING_SAVE_AREA +{ + USHORT ControlWord; + USHORT StatusWord; + USHORT TagWord; + ULONG ErrorOffset; + USHORT ErrorSelector; + USHORT ErrorOpcode; + ULONG DataOffset; + USHORT DataSelector; + UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; +} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; + +/* Context frame structure definition */ +typedef struct ALIGN(16) _CONTEXT +{ + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5Home; + ULONG64 P6Home; + ULONG ContextFlags; + ULONG MxCsr; + USHORT SegCs; + USHORT SegDs; + USHORT SegEs; + USHORT SegFs; + USHORT SegGs; + USHORT SegSs; + ULONG EFlags; + ULONG64 Dr0; + ULONG64 Dr1; + ULONG64 Dr2; + ULONG64 Dr3; + ULONG64 Dr6; + ULONG64 Dr7; + ULONG64 Rax; + ULONG64 Rcx; + ULONG64 Rdx; + ULONG64 Rbx; + ULONG64 Rsp; + ULONG64 Rbp; + ULONG64 Rsi; + ULONG64 Rdi; + ULONG64 R8; + ULONG64 R9; + ULONG64 R10; + ULONG64 R11; + ULONG64 R12; + ULONG64 R13; + ULONG64 R14; + ULONG64 R15; + ULONG64 Rip; + union + { + FLOATING_SAVE_AREA FloatSave; + struct + { + M128 Header[2]; + M128 Legacy[8]; + M128 Xmm0; + M128 Xmm1; + M128 Xmm2; + M128 Xmm3; + M128 Xmm4; + M128 Xmm5; + M128 Xmm6; + M128 Xmm7; + M128 Xmm8; + M128 Xmm9; + M128 Xmm10; + M128 Xmm11; + M128 Xmm12; + M128 Xmm13; + M128 Xmm14; + M128 Xmm15; + }; + }; + M128 VectorRegister[26]; + ULONG64 VectorControl; + ULONG64 DebugControl; + ULONG64 LastBranchToRip; + ULONG64 LastBranchFromRip; + ULONG64 LastExceptionToRip; + ULONG64 LastExceptionFromRip; +} CONTEXT, *PCONTEXT; + /* Global Descriptor Table (GDT) entry union definition */ typedef union _KGDTENTRY { @@ -91,4 +196,142 @@ typedef struct _KTSS USHORT IoMapBase; } KTSS, *PKTSS; +/* Exception frame definition */ +typedef struct _KEXCEPTION_FRAME +{ + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5; + ULONG64 InitialStack; + M128 Xmm6; + M128 Xmm7; + M128 Xmm8; + M128 Xmm9; + M128 Xmm10; + M128 Xmm11; + M128 Xmm12; + M128 Xmm13; + M128 Xmm14; + M128 Xmm15; + ULONG64 TrapFrame; + ULONG64 CallbackStack; + ULONG64 OutputBuffer; + ULONG64 OutputLength; + UCHAR ExceptionRecord[EXCEPTION_AREA_SIZE]; + ULONG64 MxCsr; + ULONG64 Rbp; + ULONG64 Rbx; + ULONG64 Rdi; + ULONG64 Rsi; + ULONG64 R12; + ULONG64 R13; + ULONG64 R14; + ULONG64 R15; + ULONG64 Return; +} KEXCEPTION_FRAME, *PKEXCEPTION_FRAME; + +/* Switch frame definition */ +typedef struct _KSWITCH_FRAME +{ + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5Home; + ULONG MxCsr; + KIRQL ApcBypass; + UCHAR Fill1[3]; + ULONG64 Rbp; + ULONG64 Return; +} KSWITCH_FRAME, *PKSWITCH_FRAME; + +/* Trap frame definition */ +typedef struct _KTRAP_FRAME +{ + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5; + KPROCESSOR_MODE PreviousMode; + KIRQL PreviousIrql; + UCHAR FaultIndicator; + UCHAR ExceptionActive; + ULONG MxCsr; + ULONG64 Rax; + ULONG64 Rcx; + ULONG64 Rdx; + ULONG64 R8; + ULONG64 R9; + ULONG64 R10; + ULONG64 R11; + union + { + ULONG64 GsBase; + ULONG64 GsSwap; + }; + M128 Xmm0; + M128 Xmm1; + M128 Xmm2; + M128 Xmm3; + M128 Xmm4; + M128 Xmm5; + union + { + ULONG64 FaultAddress; + ULONG64 ContextRecord; + ULONG64 TimeStampCKCL; + }; + ULONG64 Dr0; + ULONG64 Dr1; + ULONG64 Dr2; + ULONG64 Dr3; + ULONG64 Dr6; + ULONG64 Dr7; + union + { + struct + { + ULONG64 DebugControl; + ULONG64 LastBranchToRip; + ULONG64 LastBranchFromRip; + ULONG64 LastExceptionToRip; + ULONG64 LastExceptionFromRip; + }; + struct + { + ULONG64 LastBranchControl; + ULONG LastBranchMSR; + }; + }; + USHORT SegDs; + USHORT SegEs; + USHORT SegFs; + USHORT SegGs; + ULONG64 TrapFrame; + ULONG64 Rbx; + ULONG64 Rdi; + ULONG64 Rsi; + ULONG64 Rbp; + union + { + ULONG64 ErrorCode; + ULONG64 ExceptionFrame; + ULONG64 TimeStampKlog; + }; + ULONG64 Rip; + USHORT SegCs; + UCHAR Fill0; + UCHAR Logging; + USHORT Fill1[2]; + ULONG EFlags; + ULONG Fill2; + ULONG64 Rsp; + USHORT SegSs; + USHORT Fill3; + ULONG CodePatchCycle; +} KTRAP_FRAME, *PKTRAP_FRAME; + #endif /* __XTDK_AMD64_KETYPES_H */ diff --git a/sdk/xtdk/amd64/xtstruct.h b/sdk/xtdk/amd64/xtstruct.h index 0998f92..9d18943 100644 --- a/sdk/xtdk/amd64/xtstruct.h +++ b/sdk/xtdk/amd64/xtstruct.h @@ -9,10 +9,21 @@ #ifndef __XTDK_AMD64_XTSTRUCT_H #define __XTDK_AMD64_XTSTRUCT_H +#include + + +/* Architecture-related enumeration lists forward references */ +typedef enum _CPUID_FEATURES CPUID_FEATURES, *PCPUID_FEATURES; +typedef enum _CPUID_REQUESTS CPUID_REQUESTS, *PCPUID_REQUESTS; /* Architecture-related structures forward references */ +typedef struct ALIGN(16) _CONTEXT CONTEXT, *PCONTEXT; typedef struct _CPUID_REGISTERS CPUID_REGISTERS, *PCPUID_REGISTERS; +typedef struct _FLOATING_SAVE_AREA FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; typedef struct _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE; +typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME; +typedef struct _KSWITCH_FRAME KSWITCH_FRAME, *PKSWITCH_FRAME; +typedef struct _KTRAP_FRAME KTRAP_FRAME, *PKTRAP_FRAME; typedef struct _KTSS KTSS, *PKTSS; /* Architecture-related unions forward references */ diff --git a/sdk/xtdk/i686/ketypes.h b/sdk/xtdk/i686/ketypes.h index ad503c4..5192f6f 100644 --- a/sdk/xtdk/i686/ketypes.h +++ b/sdk/xtdk/i686/ketypes.h @@ -9,6 +9,7 @@ #ifndef __XTDK_I686_KETYPES_H #define __XTDK_I686_KETYPES_H +#include #include @@ -28,6 +29,61 @@ /* XTOS Kernel stack size */ #define KERNEL_STACK_SIZE 0x4000 +/* Kernel frames */ +#define KTRAP_FRAME_ALIGN 0x08 +#define KTRAP_FRAME_SIZE sizeof(KTRAP_FRAME) +#define NPX_FRAME_SIZE 0x210 + +/* Number of supported extensions */ +#define MAXIMUM_SUPPORTED_EXTENSION 512 + +/* Size of 387 registers */ +#define SIZE_OF_80387_REGISTERS 80 + +/* Floating point state storing structure */ +typedef struct _FLOATING_SAVE_AREA +{ + ULONG ControlWord; + ULONG StatusWord; + ULONG TagWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; + ULONG Cr0NpxState; +} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; + +/* Context frame structure definition */ +typedef struct _CONTEXT +{ + ULONG ContextFlags; + ULONG Dr0; + ULONG Dr1; + ULONG Dr2; + ULONG Dr3; + ULONG Dr6; + ULONG Dr7; + FLOATING_SAVE_AREA FloatSave; + ULONG SegGs; + ULONG SegFs; + ULONG SegEs; + ULONG SegDs; + ULONG Edi; + ULONG Esi; + ULONG Ebx; + ULONG Edx; + ULONG Ecx; + ULONG Eax; + ULONG Ebp; + ULONG Eip; + ULONG SegCs; + ULONG EFlags; + ULONG Esp; + ULONG SegSs; + UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; +} CONTEXT, *PCONTEXT; + /* Global Descriptor Table (GDT) entry structure definition */ typedef struct _KGDTENTRY { @@ -59,7 +115,8 @@ typedef struct _KGDTENTRY } KGDTENTRY, *PKGDTENTRY; /* Interrupt Descriptor Table (IDT) entry structure definition */ -typedef struct _KIDTENTRY { +typedef struct _KIDTENTRY +{ USHORT Offset; USHORT Selector; USHORT Access; @@ -67,13 +124,15 @@ typedef struct _KIDTENTRY { } KIDTENTRY, *PKIDTENTRY; /* Interrupt direction access map structure definition */ -typedef struct _KIIO_ACCESS_MAP { +typedef struct _KIIO_ACCESS_MAP +{ UCHAR DirectionMap[IOPM_DIRECTION_MAP_SIZE]; UCHAR IoMap[IOPM_FULL_SIZE]; } KIIO_ACCESS_MAP, *PKIIO_ACCESS_MAP; /* Task State Segment (TSS) structure definition */ -typedef struct _KTSS { +typedef struct _KTSS +{ USHORT Backlink; USHORT Reserved0; ULONG Esp0; @@ -111,4 +170,50 @@ typedef struct _KTSS { UCHAR IntDirectionMap[IOPM_DIRECTION_MAP_SIZE]; } KTSS, *PKTSS; +/* Exception frame definition (not available on ia32) */ +typedef struct _KEXCEPTION_FRAME +{ + ULONG PlaceHolder; +} KEXCEPTION_FRAME, *PKEXCEPTION_FRAME; + +/* Trap frame definition */ +typedef struct _KTRAP_FRAME +{ + ULONG DbgEbp; + ULONG DbgEip; + ULONG DbgArgMark; + ULONG DbgArgPointer; + ULONG TempSegCs; + ULONG TempEsp; + ULONG Dr0; + ULONG Dr1; + ULONG Dr2; + ULONG Dr3; + ULONG Dr6; + ULONG Dr7; + ULONG SegGs; + ULONG SegEs; + ULONG SegDs; + ULONG Edx; + ULONG Ecx; + ULONG Eax; + ULONG PreviousPreviousMode; + PEXCEPTION_REGISTRATION_RECORD ExceptionList; + ULONG SegFs; + ULONG Edi; + ULONG Esi; + ULONG Ebx; + ULONG Ebp; + ULONG ErrCode; + ULONG Eip; + ULONG SegCs; + ULONG EFlags; + ULONG HardwareEsp; + ULONG HardwareSegSs; + ULONG V86Es; + ULONG V86Ds; + ULONG V86Fs; + ULONG V86Gs; +} KTRAP_FRAME, *PKTRAP_FRAME; + #endif /* __XTDK_I686_KETYPES_H */ diff --git a/sdk/xtdk/i686/xtstruct.h b/sdk/xtdk/i686/xtstruct.h index 5cd8f9a..a87be3b 100644 --- a/sdk/xtdk/i686/xtstruct.h +++ b/sdk/xtdk/i686/xtstruct.h @@ -9,14 +9,24 @@ #ifndef __XTDK_I686_XTSTRUCT_H #define __XTDK_I686_XTSTRUCT_H +#include + + +/* Architecture-related enumeration lists forward references */ +typedef enum _CPUID_FEATURES CPUID_FEATURES, *PCPUID_FEATURES; +typedef enum _CPUID_REQUESTS CPUID_REQUESTS, *PCPUID_REQUESTS; /* Architecture-related structures forward references */ +typedef struct _CONTEXT CONTEXT, *PCONTEXT; typedef struct _CPUID_REGISTERS CPUID_REGISTERS, *PCPUID_REGISTERS; +typedef struct _FLOATING_SAVE_AREA FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; typedef struct _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE; typedef struct _HARDWARE_PTE_PAE HARDWARE_PTE_PAE, *PHARDWARE_PTE_PAE; +typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME, *PKEXCEPTION_FRAME; typedef struct _KGDTENTRY KGDTENTRY, *PKGDTENTRY; typedef struct _KIDTENTRY KIDTENTRY, *PKIDTENTRY; typedef struct _KIIO_ACCESS_MAP KIIO_ACCESS_MAP, *PKIIO_ACCESS_MAP; +typedef struct _KTRAP_FRAME KTRAP_FRAME, *PKTRAP_FRAME; typedef struct _KTSS KTSS, *PKTSS; #endif /* __XTDK_I686_XTSTRUCT_H */ diff --git a/sdk/xtdk/kertptr.h b/sdk/xtdk/kertptr.h new file mode 100644 index 0000000..546d838 --- /dev/null +++ b/sdk/xtdk/kertptr.h @@ -0,0 +1,21 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: sdk/xtdk/kertptr.h + * DESCRIPTION: XT kernel core handlers and routine pointers + * DEVELOPERS: Rafal Kupiec + */ + +#ifndef __XTDK_KERTPTR_H +#define __XTDK_KERTPTR_H + +#include +#include +#include +#include ARCH_HEADER(ketypes.h) + + +/* Kernel routine callbacks */ +typedef EXCEPTION_DISPOSITION (*PEXCEPTION_ROUTINE)(IN PEXCEPTION_RECORD ExceptionRecord, IN PVOID EstablisherFrame, IN OUT PCONTEXT ContextRecord, IN OUT PVOID DispatcherContext); + +#endif /* __XTDK_KERTPTR_H */ diff --git a/sdk/xtdk/ketypes.h b/sdk/xtdk/ketypes.h new file mode 100644 index 0000000..4e4175a --- /dev/null +++ b/sdk/xtdk/ketypes.h @@ -0,0 +1,48 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: sdk/xtdk/ketypes.h + * DESCRIPTION: XT kernel core structures definitions + * DEVELOPERS: Rafal Kupiec + */ + +#ifndef __XTDK_KETYPES_H +#define __XTDK_KETYPES_H + +#include +#include +#include +#include + + +/* Maximum number of exception parameters */ +#define EXCEPTION_MAXIMUM_PARAMETERS 15 + +/* Exception disposition return values */ +typedef enum _EXCEPTION_DISPOSITION +{ + ExceptionContinueExecution, + ExceptionContinueSearch, + ExceptionNestedException, + ExceptionCollidedUnwind, +} EXCEPTION_DISPOSITION, *PEXCEPTION_DISPOSITION; + +/* Exception record structure definition */ +typedef struct _EXCEPTION_RECORD +{ + XTSTATUS ExceptionCode; + ULONG ExceptionFlags; + PEXCEPTION_RECORD ExceptionRecord; + PVOID ExceptionAddress; + ULONG NumberParameters; + ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +} EXCEPTION_RECORD, *PEXCEPTION_RECORD; + +/* Exception registration record structure definition */ +typedef struct _EXCEPTION_REGISTRATION_RECORD +{ + PEXCEPTION_REGISTRATION_RECORD Next; + PEXCEPTION_ROUTINE Handler; +} EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD; + +#endif /* __XTDK_KEFUNCS_H */ diff --git a/sdk/xtdk/xtbase.h b/sdk/xtdk/xtbase.h index 2164546..429edfc 100644 --- a/sdk/xtdk/xtbase.h +++ b/sdk/xtdk/xtbase.h @@ -17,6 +17,9 @@ /* Interrupt Request Level (IRQL) */ typedef UCHAR KIRQL, *PKIRQL; +/* Processor modes */ +typedef CHAR KPROCESSOR_MODE, *PKPROCESSOR_MODE; + /* 128-bit buffer containing a unique identifier value */ typedef struct _GUID { diff --git a/sdk/xtdk/xtkmapi.h b/sdk/xtdk/xtkmapi.h index 72d06e4..312c89a 100644 --- a/sdk/xtdk/xtkmapi.h +++ b/sdk/xtdk/xtkmapi.h @@ -7,10 +7,10 @@ */ /* Base XT headers */ -#include -#include #include #include +#include +#include /* XT forward references */ #include @@ -21,15 +21,16 @@ /* Architecture-independent XT API */ #include #include +#include #include #include -#include /* Low level data types headers */ -#include -#include #include #include +#include +#include +#include /* Architecture-specific low level data types headers */ #include ARCH_HEADER(hltypes.h) @@ -43,3 +44,6 @@ /* Architecture specific XT routines*/ #include ARCH_HEADER(hlfuncs.h) + +/* Callbacks */ +#include diff --git a/sdk/xtdk/xtstruct.h b/sdk/xtdk/xtstruct.h index 284db94..b1b4973 100644 --- a/sdk/xtdk/xtstruct.h +++ b/sdk/xtdk/xtstruct.h @@ -12,6 +12,9 @@ #include +/* Enumeration lists forward references */ +typedef enum _EXCEPTION_DISPOSITION EXCEPTION_DISPOSITION, *PEXCEPTION_DISPOSITION; + /* Structures forward references */ typedef struct _CPPORT CPPORT, *PCPPORT; typedef struct _EFI_1394_DEVICE_PATH EFI_1394_DEVICE_PATH, *PEFI_1394_DEVICE_PATH; @@ -148,6 +151,8 @@ typedef struct _EFI_USB_DEVICE_PATH EFI_USB_DEVICE_PATH, *PEFI_USB_DEVICE_PATH; typedef struct _EFI_USB_WWID_DEVICE_PATH EFI_USB_WWID_DEVICE_PATH, *PEFI_USB_WWID_DEVICE_PATH; typedef struct _EFI_VENDOR_DEVICE_PATH EFI_VENDOR_DEVICE_PATH, *PEFI_VENDOR_DEVICE_PATH; typedef struct _EFI_VLAN_DEVICE_PATH EFI_VLAN_DEVICE_PATH, *PEFI_VLAN_DEVICE_PATH; +typedef struct _EXCEPTION_RECORD EXCEPTION_RECORD, *PEXCEPTION_RECORD; +typedef struct _EXCEPTION_REGISTRATION_RECORD EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD; typedef struct _FIRMWARE_INFORMATION_BLOCK FIRMWARE_INFORMATION_BLOCK, *PFIRMWARE_INFORMATION_BLOCK; typedef struct _GUID GUID, *PGUID; typedef struct _KERNEL_INITIALIZATION_BLOCK KERNEL_INITIALIZATION_BLOCK, *PKERNEL_INITIALIZATION_BLOCK; diff --git a/sdk/xtdk/xtuefi.h b/sdk/xtdk/xtuefi.h index 901e782..eb11d55 100644 --- a/sdk/xtdk/xtuefi.h +++ b/sdk/xtdk/xtuefi.h @@ -493,7 +493,7 @@ typedef enum _EFI_PXE_BASE_CODE_CALLBACK_STATUS EFI_PXE_BASE_CODE_CALLBACK_STATUS_LAST } EFI_PXE_BASE_CODE_CALLBACK_STATUS, *PEFI_PXE_BASE_CODE_CALLBACK_STATUS; -/* EFI routines forward references */ +/* EFI routine callbacks */ typedef EFI_STATUS (*PEFI_CONVERT_POINTER)(IN UINT_PTR DebugDisposition, IN OUT PVOID *Address); typedef EFI_STATUS (*PEFI_ALLOCATE_PAGES)(IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINT_PTR NoPages, OUT PEFI_PHYSICAL_ADDRESS Memory); typedef EFI_STATUS (*PEFI_ALLOCATE_POOL)(IN EFI_MEMORY_TYPE PoolType, IN UINT_PTR Size, OUT PVOID *Buffer);