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

This commit is contained in:
Rafal Kupiec 2023-01-07 23:31:37 +01:00
parent f74ba62f24
commit ca1d7ddfe8
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
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 */

View File

@ -9,6 +9,7 @@
#ifndef __XTDK_I686_KETYPES_H
#define __XTDK_I686_KETYPES_H
#include <xtstruct.h>
#include <xttypes.h>
@ -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 */

View File

@ -9,14 +9,24 @@
#ifndef __XTDK_I686_XTSTRUCT_H
#define __XTDK_I686_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 _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 */

21
sdk/xtdk/kertptr.h Normal file
View File

@ -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 <belliash@codingworkshop.eu.org>
*/
#ifndef __XTDK_KERTPTR_H
#define __XTDK_KERTPTR_H
#include <xtstruct.h>
#include <xttarget.h>
#include <xttypes.h>
#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 */

48
sdk/xtdk/ketypes.h Normal file
View File

@ -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 <belliash@codingworkshop.eu.org>
*/
#ifndef __XTDK_KETYPES_H
#define __XTDK_KETYPES_H
#include <kertptr.h>
#include <xtstruct.h>
#include <xttarget.h>
#include <xttypes.h>
/* 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 */

View File

@ -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
{

View File

@ -7,10 +7,10 @@
*/
/* Base XT headers */
#include <xttarget.h>
#include <xttypes.h>
#include <xtdefs.h>
#include <xtstatus.h>
#include <xttarget.h>
#include <xttypes.h>
/* XT forward references */
#include <xtstruct.h>
@ -21,15 +21,16 @@
/* Architecture-independent XT API */
#include <xtbase.h>
#include <xtdebug.h>
#include <xtfw.h>
#include <xtimage.h>
#include <xtuefi.h>
#include <xtfw.h>
/* Low level data types headers */
#include <rtltypes.h>
#include <ldrtypes.h>
#include <hltypes.h>
#include <iotypes.h>
#include <ketypes.h>
#include <ldrtypes.h>
#include <rtltypes.h>
/* 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 <kertptr.h>

View File

@ -12,6 +12,9 @@
#include <xtdefs.h>
/* 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;

View File

@ -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);