DragonOS/kernel/smp/apu_boot.S
2022-08-01 23:18:54 +08:00

122 lines
2.1 KiB
ArmAsm
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "../common/asm.h"
.align 0x1000 // 4k
.section .text
.code16
ENTRY(_apu_boot_start)
_apu_boot_base = .
cli
wbinvd //
mov %cs, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %ss
mov %ax, %fs
mov %ax, %gs
//
movl $(_apu_boot_tmp_stack_end - _apu_boot_base), %esp
// ap
mov %cs, %ax
movzx %ax, %esi
shll $4, %esi
// set gdt and 32bit/64bit code addr
leal (_apu_code32 - _apu_boot_base)(%esi), %eax
movl %eax, (_apu_code32_vector - _apu_boot_base)
leal (_apu_code64 - _apu_boot_base)(%esi), %eax
movl %eax, (_apu_code64_vector - _apu_boot_base)
leal (_apu_tmp_gdt - _apu_boot_base)(%esi), %eax
movl %eax, (_apu_tmp_gdt + 2 - _apu_boot_base)
//
lidtl _apu_tmp_idt - _apu_boot_base
lgdtl _apu_tmp_gdt - _apu_boot_base
// cr0使
smsw %ax
bts $0, %ax
lmsw %ax
//
ljmpl *(_apu_code32_vector - _apu_boot_base)
.code32
.align 0x1000
_apu_code32:
#
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %ss
mov %ax, %fs
mov %ax, %gs
//
leal (_apu_boot_tmp_stack_end - _apu_boot_base)(%esi), %eax
movl %eax, %esp
// 1. PAE
mov %cr4, %eax
or $(1<<5), %eax
mov %eax, %cr4
movl $enter_head_from_ap_boot, %eax
jmpl *%eax
hlt
.code64
.align 0x1000
_apu_code64:
hlt
.align 0x1000
_apu_tmp_idt:
.word 0
.word 0,0
.align 0x1000
_apu_tmp_gdt:
.short _apu_tmp_gdt_end - _apu_tmp_gdt -1
.long _apu_tmp_gdt - _apu_boot_base
.short 0
.quad 0x00cf9a000000ffff
.quad 0x00cf92000000ffff
.quad 0x0020980000000000
.quad 0x0000920000000000
_apu_tmp_gdt_end:
.align 0x1000
_apu_code32_vector:
.long _apu_code32 - _apu_boot_base
.word 0x08,0
.align 0x1000
_apu_code64_vector:
.long _apu_code64 - _apu_boot_base
.word 0x18,0
.align 0x1000
_apu_boot_tmp_stack_start:
// .org 0x400
_apu_boot_tmp_stack_end:
ENTRY(_apu_boot_end)