86 lines
2.0 KiB
ArmAsm
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:
|