xref: /kvm-unit-tests/x86/cstart.S (revision d6d3a3bd85095f4554d0ea01fe0c88b99a4413f9)
17d36db35SAvi Kivity
2dfe6cb66SJason Wang#include "apic-defs.h"
3dfe6cb66SJason Wang
418a34cceSNadav Amit.global online_cpus
518a34cceSNadav Amit
6dfe6cb66SJason Wangipi_vector = 0x20
7dfe6cb66SJason Wang
818a34cceSNadav Amitmax_cpus = MAX_TEST_CPUS
97d36db35SAvi Kivity
107d36db35SAvi Kivity.bss
117d36db35SAvi Kivity
12dfe6cb66SJason Wang	. = . + 4096 * max_cpus
13dfe6cb66SJason Wang	.align 16
14dfe6cb66SJason Wangstacktop:
15dfe6cb66SJason Wang
16dfe6cb66SJason Wang.data
17dfe6cb66SJason Wang
18dfe6cb66SJason Wang.align 4096
19dfe6cb66SJason Wangpt:
20dfe6cb66SJason Wangi = 0
21dfe6cb66SJason Wang        .rept 1024
22dfe6cb66SJason Wang        .long 0x1e7 | (i << 22)
23dfe6cb66SJason Wang        i = i + 1
24dfe6cb66SJason Wang        .endr
25dfe6cb66SJason Wang
267d36db35SAvi Kivity.section .init
277d36db35SAvi Kivity
28dfe6cb66SJason Wang.code32
29dfe6cb66SJason Wang
307d36db35SAvi Kivitymb_magic = 0x1BADB002
317d36db35SAvi Kivitymb_flags = 0x0
327d36db35SAvi Kivity
337d36db35SAvi Kivity	# multiboot header
347d36db35SAvi Kivity	.long mb_magic, mb_flags, 0 - (mb_magic + mb_flags)
35ea7d43d0SAvi Kivitymb_cmdline = 16
367d36db35SAvi Kivity
377e33895dSPaolo Bonzini.macro setup_tr_and_percpu
38b397e5a5SVarad Gautam	call load_idt
397e33895dSPaolo Bonzini	push %esp
407e33895dSPaolo Bonzini	call setup_tss
417e33895dSPaolo Bonzini	addl $4, %esp
427e33895dSPaolo Bonzini	ltr %ax
437e33895dSPaolo Bonzini	add $(max_cpus * 8), %ax
449eef583dSPaolo Bonzini	mov %ax, %gs
45dfe6cb66SJason Wang.endm
46dfe6cb66SJason Wang
47d68a795aSNadav Amit.macro setup_segments
48d68a795aSNadav Amit	mov $0x10, %ax
49d68a795aSNadav Amit	mov %ax, %ds
50d68a795aSNadav Amit	mov %ax, %es
51d68a795aSNadav Amit	mov %ax, %fs
52d68a795aSNadav Amit	mov %ax, %gs
53d68a795aSNadav Amit	mov %ax, %ss
54d68a795aSNadav Amit.endm
55d68a795aSNadav Amit
567d36db35SAvi Kivity.globl start
577d36db35SAvi Kivitystart:
585ed10141SPaolo Bonzini        lgdtl gdt_descr
59ded41057SPaolo Bonzini        setup_segments
60cae10b5bSClaudio Imbrenda        mov $stacktop, %esp
61ded41057SPaolo Bonzini
6293dd2aa3SAndrew Jones        push %ebx
63716cea8aSPaolo Bonzini        call setup_multiboot
644108903cSPaolo Bonzini        addl $4, %esp
65716cea8aSPaolo Bonzini        call setup_libcflat
66ea7d43d0SAvi Kivity        mov mb_cmdline(%ebx), %eax
67ea7d43d0SAvi Kivity        mov %eax, __args
68ea7d43d0SAvi Kivity        call __setup_args
69dfe6cb66SJason Wang        call prepare_32
70dfe6cb66SJason Wang        jmpl $8, $start32
71dfe6cb66SJason Wang
72dfe6cb66SJason Wangprepare_32:
73b4f3421fSClaudio Imbrenda	mov $(1 << 4), %eax // pse
74dfe6cb66SJason Wang	mov %eax, %cr4
75dfe6cb66SJason Wang
76dfe6cb66SJason Wang	mov $pt, %eax
77dfe6cb66SJason Wang	mov %eax, %cr3
78dfe6cb66SJason Wang
79dfe6cb66SJason Wang	mov %cr0, %eax
80dfe6cb66SJason Wang	bts $0, %eax
81dfe6cb66SJason Wang	bts $31, %eax
82dfe6cb66SJason Wang	mov %eax, %cr0
83dfe6cb66SJason Wang	ret
84dfe6cb66SJason Wang
85d589407fSNadav Amitsmp_stacktop:	.long stacktop - 4096
86dfe6cb66SJason Wang
8718a34cceSNadav Amitsave_id:
8818a34cceSNadav Amit	movl $(APIC_DEFAULT_PHYS_BASE + APIC_ID), %eax
8918a34cceSNadav Amit	movl (%eax), %eax
9018a34cceSNadav Amit	shrl $24, %eax
9118a34cceSNadav Amit	lock btsl %eax, online_cpus
9218a34cceSNadav Amit	retl
9318a34cceSNadav Amit
94dfe6cb66SJason Wangap_start32:
95d68a795aSNadav Amit	setup_segments
96dfe6cb66SJason Wang	mov $-4096, %esp
972d331a4dSRoman Bolshakov	lock xaddl %esp, smp_stacktop
987e33895dSPaolo Bonzini	setup_tr_and_percpu
99dfe6cb66SJason Wang	call prepare_32
100d6e8f863SNadav Amit	call reset_apic
10118a34cceSNadav Amit	call save_id
102dfe6cb66SJason Wang	call enable_apic
103dfe6cb66SJason Wang	call enable_x2apic
104cd6bfb1dSSean Christopherson	call ap_online
105dfe6cb66SJason Wang
106cd6bfb1dSSean Christopherson	/* ap_online() should never return */
107cd6bfb1dSSean Christopherson	ud2
108dfe6cb66SJason Wang
109dfe6cb66SJason Wangstart32:
1107e33895dSPaolo Bonzini	setup_tr_and_percpu
111d6e8f863SNadav Amit	call reset_apic
11218a34cceSNadav Amit	call save_id
113dfe6cb66SJason Wang	call mask_pic_interrupts
114dfe6cb66SJason Wang	call enable_apic
115*d6d3a3bdSSean Christopherson	call bsp_rest_init
1163c7d322eSAndrew Jones        push $__environ
117dfe6cb66SJason Wang        push $__argv
118dfe6cb66SJason Wang        push __argc
1197d36db35SAvi Kivity        call main
1207d36db35SAvi Kivity	push %eax
1217d36db35SAvi Kivity	call exit
1227d36db35SAvi Kivity
123c8ab4c00SVarad Gautam#include "trampolines.S"
124