Files
exectos/xtoskrnl/ar/amd64/archsmp.S
2024-08-14 13:03:05 +02:00

86 lines
2.0 KiB
ArmAsm

/**
* PROJECT: ExectOS
* COPYRIGHT: See COPYING.md in the top level directory
* FILE: xtoskrnl/ar/amd64/archsmp.S
* DESCRIPTION: AP bootstrap code for AMD64 architecture
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
*/
#include <amd64/asmsup.h>
.altmacro
.text
.global ArBootstrapPageMap
.global ArStartApplicationProcessor
ArStartApplicationProcessor:
/* 16-bit code (real mode) */
.code16
/* Turn off interrupts and clear direction flag */
cli
cld
/* 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) */
.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) */
.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: