Initialize AMD64 processor registers
All checks were successful
ci/woodpecker/push/build Pipeline was successful

This commit is contained in:
2023-02-04 23:40:03 +01:00
parent f181215341
commit 55cdae7c83
5 changed files with 99 additions and 12 deletions

View File

@@ -63,6 +63,9 @@ ArInitializeProcessor(VOID)
/* Set GS base */
ArWriteModelSpecificRegister(X86_MSR_GSBASE, (ULONGLONG)ProcessorBlock);
ArWriteModelSpecificRegister(X86_MSR_KERNEL_GSBASE, (ULONGLONG)ProcessorBlock);
/* Initialize processor registers */
ArpInitializeProcessorRegisters();
}
/**
@@ -195,6 +198,57 @@ ArpInitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBlock,
ProcessorBlock->Prcb.MxCsr = INITIAL_MXCSR;
}
/**
* Initializes processor registers and other boot structures.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
ArpInitializeProcessorRegisters(VOID)
{
/* Enable FXSAVE restore */
ArWriteControlRegister(4, ArReadControlRegister(4) | CR4_FXSR);
/* Enable XMMI exceptions */
ArWriteControlRegister(4, ArReadControlRegister(4) | CR4_XMMEXCPT);
/* Set debugger extension */
ArWriteControlRegister(4, ArReadControlRegister(4) | CR4_DE);
/* Enable global paging support */
ArWriteControlRegister(4, ArReadControlRegister(4) | CR4_PGE);
/* Enable large pages */
ArWriteControlRegister(4, ArReadControlRegister(4) | CR4_PSE);
/* Enable write-protection */
ArWriteControlRegister(0, ArReadControlRegister(0) | CR0_WP);
/* Set alignment mask */
ArWriteControlRegister(0, ArReadControlRegister(0) | CR0_AM);
/* Disable FPU monitoring */
ArWriteControlRegister(0, ArReadControlRegister(0) & ~CR0_MP);
/* Disable x87 FPU exceptions */
ArWriteControlRegister(0, ArReadControlRegister(0) & ~CR0_NE);
/* Initialize system calls MSR */
ArWriteModelSpecificRegister(X86_MSR_STAR, (((ULONG64)KGDT_R3_CMCODE | RPL_MASK) << 48) | ((ULONG64)KGDT_R0_CODE << 32));
ArWriteModelSpecificRegister(X86_MSR_CSTAR, (ULONG64)&ArpHandleSystemCall32);
ArWriteModelSpecificRegister(X86_MSR_LSTAR, (ULONG64)&ArpHandleSystemCall64);
ArWriteModelSpecificRegister(X86_MSR_FMASK, X86_EFLAGS_IF_MASK | X86_EFLAGS_TF_MASK);
/* Enable system call extensions (SCE) in EFER MSR */
ArWriteModelSpecificRegister(X86_MSR_EFER, ArReadModelSpecificRegister(X86_MSR_EFER) | X86_MSR_EFER_SCE);
/* Enable No-Execute (NXE) in EFER MSR */
ArWriteModelSpecificRegister(X86_MSR_EFER, ArReadModelSpecificRegister(X86_MSR_EFER) | X86_MSR_EFER_NXE);
}
/**
* Initializes segment registers.
*

View File

@@ -9,6 +9,20 @@
#include <xtos.h>
XTCDECL
VOID
ArpHandleSystemCall32()
{
LdrPrint(L"Handled 32-bit system call!\n");
}
XTCDECL
VOID
ArpHandleSystemCall64()
{
LdrPrint(L"Handled 64-bit system call!\n");
}
/**
* Handles the trap 0x00 when a Divide By Zero exception occurs.
*

View File

@@ -12,6 +12,14 @@
#include <xtos.h>
XTCDECL
VOID
ArpHandleSystemCall32();
XTCDECL
VOID
ArpHandleSystemCall64();
XTCDECL
VOID
ArpHandleTrap00();
@@ -116,6 +124,10 @@ ArpInitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBlock,
IN PKTSS Tss,
IN PVOID DpcStack);
XTAPI
VOID
ArpInitializeProcessorRegisters(VOID);
XTAPI
VOID
ArpInitializeSegments(VOID);

View File

@@ -20,21 +20,9 @@ XTAPI
VOID
KepArchInitialize(VOID)
{
/* Enable global paging support */
ArWriteControlRegister(4, ArReadControlRegister(4) | CR4_PGE);
/* Enable write-protection */
ArWriteControlRegister(0, ArReadControlRegister(0) | CR0_WP);
/* Set alignment mask */
ArWriteControlRegister(0, ArReadControlRegister(0) | CR0_AM);
/* Re-enable IDE interrupts */
HlIoPortOutByte(0x376, 0);
HlIoPortOutByte(0x3F6, 0);
/* Set system call extensions (SCE) flag in EFER MSR */
ArWriteModelSpecificRegister(X86_MSR_EFER, ArReadModelSpecificRegister(X86_MSR_EFER) | X86_MSR_EFER_SCE);
}
/**