1#include "../common/asm.h"
2
3
4.align 0x1000  // 按照4k对齐
5
6.section .text
7.code16
8
9ENTRY(_apu_boot_start)
10_apu_boot_base = .
11    cli
12    wbinvd  // 将处理器缓存同步到内存中
13
14    mov %cs, %ax
15    mov %ax, %ds
16    mov %ax, %es
17    mov %ax, %ss
18    mov %ax, %fs
19    mov %ax, %gs
20
21    // 设置栈指针
22    movl $(_apu_boot_tmp_stack_end - _apu_boot_base), %esp
23
24    // 计算ap处理器引导程序的基地址
25    mov %cs, %ax
26    movzx %ax, %esi
27    shll $4, %esi
28
29
30    // set gdt and 32bit/64bit code addr
31
32    leal (_apu_code32 - _apu_boot_base)(%esi), %eax
33    movl %eax, (_apu_code32_vector - _apu_boot_base)
34
35    leal (_apu_code64 - _apu_boot_base)(%esi), %eax
36    movl %eax, (_apu_code64_vector - _apu_boot_base)
37
38    leal (_apu_tmp_gdt - _apu_boot_base)(%esi), %eax
39    movl %eax, (_apu_tmp_gdt + 2 - _apu_boot_base)
40
41// 从实模式切换到保护模式
42
43    lidtl _apu_tmp_idt - _apu_boot_base
44    lgdtl _apu_tmp_gdt - _apu_boot_base
45
46    // 操作cr0控制器,使能保护模式
47    smsw %ax
48    bts $0, %ax
49    lmsw %ax
50
51    // 转到保护模式
52    ljmpl *(_apu_code32_vector - _apu_boot_base)
53
54
55.code32
56.align 0x1000
57_apu_code32:
58    # 转到长模式
59
60    mov $0x10, %ax
61    mov %ax, %ds
62    mov %ax, %es
63    mov %ax, %ss
64    mov %ax, %fs
65    mov %ax, %gs
66
67// 设置栈指针
68    leal (_apu_boot_tmp_stack_end - _apu_boot_base)(%esi), %eax
69    movl %eax, %esp
70
71    // 1. 允许 PAE
72    mov %cr4, %eax
73    or $(1<<5), %eax
74    mov %eax, %cr4
75
76    movl $enter_head_from_ap_boot, %eax
77    jmpl	*%eax
78    hlt
79
80
81
82.code64
83.align 0x1000
84_apu_code64:
85
86    hlt
87
88
89.align 0x1000
90_apu_tmp_idt:
91	.word	0
92	.word	0,0
93
94.align 0x1000
95_apu_tmp_gdt:
96    .short _apu_tmp_gdt_end - _apu_tmp_gdt -1
97    .long _apu_tmp_gdt - _apu_boot_base
98    .short 0
99    .quad	0x00cf9a000000ffff
100	.quad	0x00cf92000000ffff
101	.quad	0x0020980000000000
102	.quad	0x0000920000000000
103_apu_tmp_gdt_end:
104
105.align 0x1000
106_apu_code32_vector:
107	.long	_apu_code32 - _apu_boot_base
108	.word	0x08,0
109
110.align 0x1000
111_apu_code64_vector:
112	.long	_apu_code64 - _apu_boot_base
113	.word	0x18,0
114
115.align 0x1000
116_apu_boot_tmp_stack_start:
117//	.org	0x400
118_apu_boot_tmp_stack_end:
119
120ENTRY(_apu_boot_end)
121
122