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

This commit is contained in:
Rafal Kupiec 2023-02-04 00:17:07 +01:00
parent f37722b6e6
commit f181215341
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
2 changed files with 35 additions and 4 deletions

View File

@ -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).
*

View File

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