From f181215341f9c19d7e43e9f4a69a6b30ebf77482 Mon Sep 17 00:00:00 2001 From: belliash Date: Sat, 4 Feb 2023 00:17:07 +0100 Subject: [PATCH] Initialize segment registers --- xtoskrnl/ar/amd64/procsup.c | 35 +++++++++++++++++++++++++++++++---- xtoskrnl/includes/arpfuncs.h | 4 ++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/xtoskrnl/ar/amd64/procsup.c b/xtoskrnl/ar/amd64/procsup.c index b64ab7b..37faa35 100644 --- a/xtoskrnl/ar/amd64/procsup.c +++ b/xtoskrnl/ar/amd64/procsup.c @@ -53,13 +53,16 @@ ArInitializeProcessor(VOID) ArLoadInterruptDescriptorTable(&IdtDescriptor.Limit); ArLoadTaskRegister((UINT)KGDT_SYS_TSS); - /* Set GS base */ - ArWriteModelSpecificRegister(X86_MSR_GSBASE, (ULONGLONG)ProcessorBlock); - ArWriteModelSpecificRegister(X86_MSR_KERNEL_GSBASE, (ULONGLONG)ProcessorBlock); - /* Enter passive IRQ level */ ProcessorBlock->Irql = PASSIVE_LEVEL; ArWriteControlRegister(8, PASSIVE_LEVEL); + + /* Initialize segment registers */ + ArpInitializeSegments(); + + /* Set GS base */ + ArWriteModelSpecificRegister(X86_MSR_GSBASE, (ULONGLONG)ProcessorBlock); + ArWriteModelSpecificRegister(X86_MSR_KERNEL_GSBASE, (ULONGLONG)ProcessorBlock); } /** @@ -192,6 +195,30 @@ ArpInitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBlock, ProcessorBlock->Prcb.MxCsr = INITIAL_MXCSR; } +/** + * Initializes segment registers. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +ArpInitializeSegments(VOID) +{ + asm volatile("mov %0, %%ax\n" + "mov %%ax, %%fs\n" + "mov %1, %%ax\n" + "mov %%ax, %%ds\n" + "mov %%ax, %%es\n" + "mov %%ax, %%gs\n" + "swapgs\n" + "mov %%ax, %%gs\n" + : + : "i" (KGDT_R3_CMTEB | RPL_MASK), + "i" (KGDT_R3_DATA | RPL_MASK)); +} + /** * Initializes the kernel's Task State Segment (TSS). * diff --git a/xtoskrnl/includes/arpfuncs.h b/xtoskrnl/includes/arpfuncs.h index d9c2e6b..c7f1677 100644 --- a/xtoskrnl/includes/arpfuncs.h +++ b/xtoskrnl/includes/arpfuncs.h @@ -116,6 +116,10 @@ ArpInitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBlock, IN PKTSS Tss, IN PVOID DpcStack); +XTAPI +VOID +ArpInitializeSegments(VOID); + XTAPI VOID ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock);