Basic context, frames and exceptions definitions
All checks were successful
ci/woodpecker/push/build Pipeline was successful

This commit is contained in:
2023-01-07 23:31:37 +01:00
parent f74ba62f24
commit ca1d7ddfe8
10 changed files with 459 additions and 9 deletions

View File

@@ -9,12 +9,19 @@
#ifndef __XTDK_AMD64_KETYPES_H
#define __XTDK_AMD64_KETYPES_H
#include <xtbase.h>
#include <xttypes.h>
/* 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 */

View File

@@ -9,10 +9,21 @@
#ifndef __XTDK_AMD64_XTSTRUCT_H
#define __XTDK_AMD64_XTSTRUCT_H
#include <xtdefs.h>
/* 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 */