update AP bootstrap code

This commit is contained in:
Aiken Harris 2024-08-14 13:03:05 +02:00
parent d7a1b01b63
commit 5670398077
2 changed files with 63 additions and 1 deletions

View File

@ -12,17 +12,74 @@
.text .text
.global ArBootstrapPageMap
.global ArStartApplicationProcessor .global ArStartApplicationProcessor
ArStartApplicationProcessor: ArStartApplicationProcessor:
/* 16-bit code (real mode) */ /* 16-bit code (real mode) */
.code16 .code16
/* Turn off interrupts and clear direction flag */
cli cli
cld cld
hlt
/* Load temporary GDT */
lgdt (ArpApTemporaryGdtSize - ArStartApplicationProcessor + 0x1000)
/* Enable bit 0 in CR0 to enable Protected Mode */
movl %cr0, %eax
orl $0x1, %eax
movl %eax, %cr0
/* Long jump into 32bits */
ljmpl $0x8, $(ApplicationProcessor32 - ArStartApplicationProcessor + 0x1000)
/* 32-bit code (protected mode) */ /* 32-bit code (protected mode) */
.code32 .code32
ApplicationProcessor32:
/* Fix segment registers */
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
mov %ax, %ss
/* Enable LM and NX in the EFER. */
mov $0xC0000080, %ecx
rdmsr
or $0x900, %eax
wrmsr
/* Enable PAE and PSE */
mov %cr4, %eax
or $0x668, %eax
mov %eax, %cr4
/* Install page map in CR3 */
mov (ArBootstrapPageMap - ArStartApplicationProcessor + 0x1000), %eax
mov %eax, %cr3
/* Enable paging */
mov %cr0, %eax
or $0x80010000, %eax
mov %eax, %cr0
/* Long jump into 64bits */
ljmpl $0x8, $(ApplicationProcessor64 - ArStartApplicationProcessor + 0x1000)
/* 64-bit code (long mode) */ /* 64-bit code (long mode) */
.code64 .code64
ApplicationProcessor64:
/* HALT CPU in long mode */
hlt
.align 8
ArpApTemporaryGdtDesc: .quad 0x0000000000000000, 0x00CF9A000000FFFF, 0x00CF92000000FFFF, 0x00AF9A000000FFFF
ArpApTemporaryGdtSize: .short ArpApTemporaryGdtSize - ArpApTemporaryGdtDesc - 1
ArpApTemporaryGdtBase: .long ArpApTemporaryGdtDesc - ArStartApplicationProcessor + 0x1000
ArBootstrapPageMap: .quad 0x0000000000000000
ArStartApplicationProcessorEnd:

View File

@ -79,6 +79,8 @@ HlStartProcessor(IN ULONG CpuId,
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
extern ULONG_PTR ArBootstrapPageMap;
XTAPI XTAPI
XTSTATUS XTSTATUS
HlStartAllProcessors(VOID) HlStartAllProcessors(VOID)
@ -95,6 +97,9 @@ HlStartAllProcessors(VOID)
/* Check if at least one AP is present */ /* Check if at least one AP is present */
if(HlpSystemInfo.CpuCount > 1) if(HlpSystemInfo.CpuCount > 1)
{ {
/* Save page map address in the bootstrap code */
ArBootstrapPageMap = ArReadControlRegister(3);
/* Allocate 5 pages for AP bootstrap code and ensure it is low memory */ /* Allocate 5 pages for AP bootstrap code and ensure it is low memory */
Status = MmAllocateHardwareMemory(AP_SPINUP_PAGE_COUNT, FALSE, &ApPhysicalAddress); Status = MmAllocateHardwareMemory(AP_SPINUP_PAGE_COUNT, FALSE, &ApPhysicalAddress);
if(Status != STATUS_SUCCESS || ApPhysicalAddress.QuadPart > (0x100000 - AP_SPINUP_PAGE_COUNT * MM_PAGE_SIZE)) if(Status != STATUS_SUCCESS || ApPhysicalAddress.QuadPart > (0x100000 - AP_SPINUP_PAGE_COUNT * MM_PAGE_SIZE))