xref: /kvm-unit-tests/x86/cstart.S (revision f3f338619e4938c2509f5c691adc1f331b07c203)
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	push %esp
40	call setup_tss
41	addl $4, %esp
42	ltr %ax
43	add $(max_cpus * 8), %ax
44	mov %ax, %gs
45.endm
46
47.macro setup_segments
48	mov $0x10, %ax
49	mov %ax, %ds
50	mov %ax, %es
51	mov %ax, %fs
52	mov %ax, %gs
53	mov %ax, %ss
54.endm
55
56.globl start
57start:
58        lgdtl gdt_descr
59        setup_segments
60        mov $stacktop, %esp
61
62        push %ebx
63        call setup_multiboot
64        addl $4, %esp
65        call setup_libcflat
66        mov mb_cmdline(%ebx), %eax
67        mov %eax, __args
68        call __setup_args
69        call prepare_32
70        jmpl $8, $start32
71
72prepare_32:
73	mov $(1 << 4), %eax // pse
74	mov %eax, %cr4
75
76	mov $pt, %eax
77	mov %eax, %cr3
78
79	mov %cr0, %eax
80	bts $0, %eax
81	bts $31, %eax
82	mov %eax, %cr0
83	ret
84
85smp_stacktop:	.long stacktop - per_cpu_size
86
87save_id:
88	movl $(APIC_DEFAULT_PHYS_BASE + APIC_ID), %eax
89	movl (%eax), %eax
90	shrl $24, %eax
91	lock btsl %eax, online_cpus
92	retl
93
94ap_start32:
95	setup_segments
96	mov $-per_cpu_size, %esp
97	lock xaddl %esp, smp_stacktop
98	setup_tr_and_percpu
99	call load_idt
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 setup_idt
113	call reset_apic
114	call save_id
115	call mask_pic_interrupts
116	call enable_apic
117	call bsp_rest_init
118        push $__environ
119        push $__argv
120        push __argc
121        call main
122	push %eax
123	call exit
124
125#include "trampolines.S"
126