xref: /kvm-unit-tests/x86/cstart64.S (revision d6d3a3bd85095f4554d0ea01fe0c88b99a4413f9)
1
2#include "apic-defs.h"
3
4ipi_vector = 0x20
5
6max_cpus = MAX_TEST_CPUS
7
8.bss
9
10	. = . + 4096 * max_cpus
11	.align 16
12stacktop:
13
14.data
15
16.align 4096
17ptl2:
18i = 0
19	.rept 512 * 4
20	.quad 0x1e7 | (i << 21)
21	i = i + 1
22	.endr
23
24.align 4096
25ptl3:
26	.quad ptl2 + 7 + 0 * 4096
27	.quad ptl2 + 7 + 1 * 4096
28	.quad ptl2 + 7 + 2 * 4096
29	.quad ptl2 + 7 + 3 * 4096
30
31.align 4096
32ptl4:
33	.quad ptl3 + 7
34
35.align 4096
36ptl5:
37	.quad ptl4 + 7
38
39.align 4096
40
41mb_boot_info:	.quad 0
42
43pt_root:	.quad ptl4
44
45#include "trampolines.S"
46
47.section .init
48.code32
49
50mb_magic = 0x1BADB002
51mb_flags = 0x0
52
53	# multiboot header
54	.long mb_magic, mb_flags, 0 - (mb_magic + mb_flags)
55mb_cmdline = 16
56
57.macro load_tss
58	movq %rsp, %rdi
59	call setup_tss
60	ltr %ax
61.endm
62
63.globl start
64start:
65	mov %ebx, mb_boot_info
66	mov $stacktop, %esp
67	setup_percpu_area
68	call prepare_64
69	jmpl $8, $start64
70
71switch_to_5level:
72	/* Disable CR4.PCIDE */
73	mov %cr4, %eax
74	btr $17, %eax
75	mov %eax, %cr4
76
77	mov %cr0, %eax
78	btr $31, %eax
79	mov %eax, %cr0
80
81	mov $ptl5, %eax
82	mov %eax, pt_root
83
84	/* Enable CR4.LA57 */
85	mov %cr4, %eax
86	bts $12, %eax
87	mov %eax, %cr4
88
89	mov $0x10, %ax
90	mov %ax, %ss
91
92	call enter_long_mode
93	jmpl $8, $lvl5
94
95smp_stacktop:	.long stacktop - 4096
96
97.align 16
98
99gdt32:
100	.quad 0
101	.quad 0x00cf9b000000ffff // flat 32-bit code segment
102	.quad 0x00cf93000000ffff // flat 32-bit data segment
103gdt32_end:
104
105.code64
106start64:
107	call load_idt
108	load_tss
109	call reset_apic
110	call mask_pic_interrupts
111	call enable_apic
112	call save_id
113	mov mb_boot_info(%rip), %rbx
114	mov %rbx, %rdi
115	call setup_multiboot
116	call setup_libcflat
117	mov mb_cmdline(%rbx), %eax
118	mov %rax, __args(%rip)
119	call __setup_args
120
121	call bsp_rest_init
122
123	mov __argc(%rip), %edi
124	lea __argv(%rip), %rsi
125	lea __environ(%rip), %rdx
126	call main
127	mov %eax, %edi
128	call exit
129
130.globl setup_5level_page_table
131setup_5level_page_table:
132	/* Check if 5-level paging has already enabled */
133	mov %cr4, %rax
134	test $0x1000, %eax
135	jnz lvl5
136
137	pushq $32
138	pushq $switch_to_5level
139	lretq
140lvl5:
141	retq
142