xref: /kvm-unit-tests/x86/cstart.S (revision dca3f4c041143c8e8dc70c6890a19a5730310230)
1
2#include "apic-defs.h"
3#include "smp.h"
4
5.global online_cpus
6
7ipi_vector = 0x20
8
9per_cpu_size = PER_CPU_SIZE
10max_cpus = MAX_TEST_CPUS
11
12.bss
13.align 4096
14	. = . + PER_CPU_SIZE * max_cpus
15stacktop:
16
17.data
18
19.align 4096
20pt:
21i = 0
22        .rept 1024
23        .long 0x1e7 | (i << 22)
24        i = i + 1
25        .endr
26
27.section .init
28
29.code32
30
31mb_magic = 0x1BADB002
32mb_flags = 0x0
33
34	# multiboot header
35	.long mb_magic, mb_flags, 0 - (mb_magic + mb_flags)
36mb_cmdline = 16
37
38.macro setup_tr_and_percpu
39	call load_idt
40	push %esp
41	call setup_tss
42	addl $4, %esp
43	ltr %ax
44	add $(max_cpus * 8), %ax
45	mov %ax, %gs
46.endm
47
48.macro setup_segments
49	mov $0x10, %ax
50	mov %ax, %ds
51	mov %ax, %es
52	mov %ax, %fs
53	mov %ax, %gs
54	mov %ax, %ss
55.endm
56
57.globl start
58start:
59        lgdtl gdt_descr
60        setup_segments
61        mov $stacktop, %esp
62
63        push %ebx
64        call setup_multiboot
65        addl $4, %esp
66        call setup_libcflat
67        mov mb_cmdline(%ebx), %eax
68        mov %eax, __args
69        call __setup_args
70        call prepare_32
71        jmpl $8, $start32
72
73prepare_32:
74	mov $(1 << 4), %eax // pse
75	mov %eax, %cr4
76
77	mov $pt, %eax
78	mov %eax, %cr3
79
80	mov %cr0, %eax
81	bts $0, %eax
82	bts $31, %eax
83	mov %eax, %cr0
84	ret
85
86smp_stacktop:	.long stacktop - per_cpu_size
87
88save_id:
89	movl $(APIC_DEFAULT_PHYS_BASE + APIC_ID), %eax
90	movl (%eax), %eax
91	shrl $24, %eax
92	lock btsl %eax, online_cpus
93	retl
94
95ap_start32:
96	setup_segments
97	mov $-per_cpu_size, %esp
98	lock xaddl %esp, smp_stacktop
99	setup_tr_and_percpu
100	call prepare_32
101	call reset_apic
102	call save_id
103	call enable_apic
104	call enable_x2apic
105	call ap_online
106
107	/* ap_online() should never return */
108	ud2
109
110start32:
111	setup_tr_and_percpu
112	call reset_apic
113	call save_id
114	call mask_pic_interrupts
115	call enable_apic
116	call bsp_rest_init
117        push $__environ
118        push $__argv
119        push __argc
120        call main
121	push %eax
122	call exit
123
124#include "trampolines.S"
125