xref: /kvm-unit-tests/x86/cstart.S (revision dca3f4c041143c8e8dc70c6890a19a5730310230)
17d36db35SAvi Kivity
2dfe6cb66SJason Wang#include "apic-defs.h"
3*d467e659SSean Christopherson#include "smp.h"
4dfe6cb66SJason Wang
518a34cceSNadav Amit.global online_cpus
618a34cceSNadav Amit
7dfe6cb66SJason Wangipi_vector = 0x20
8dfe6cb66SJason Wang
92821b32dSSean Christophersonper_cpu_size = PER_CPU_SIZE
1018a34cceSNadav Amitmax_cpus = MAX_TEST_CPUS
117d36db35SAvi Kivity
127d36db35SAvi Kivity.bss
13a95dd6beSSean Christopherson.align 4096
142821b32dSSean Christopherson	. = . + PER_CPU_SIZE * max_cpus
15dfe6cb66SJason Wangstacktop:
16dfe6cb66SJason Wang
17dfe6cb66SJason Wang.data
18dfe6cb66SJason Wang
19dfe6cb66SJason Wang.align 4096
20dfe6cb66SJason Wangpt:
21dfe6cb66SJason Wangi = 0
22dfe6cb66SJason Wang        .rept 1024
23dfe6cb66SJason Wang        .long 0x1e7 | (i << 22)
24dfe6cb66SJason Wang        i = i + 1
25dfe6cb66SJason Wang        .endr
26dfe6cb66SJason Wang
277d36db35SAvi Kivity.section .init
287d36db35SAvi Kivity
29dfe6cb66SJason Wang.code32
30dfe6cb66SJason Wang
317d36db35SAvi Kivitymb_magic = 0x1BADB002
327d36db35SAvi Kivitymb_flags = 0x0
337d36db35SAvi Kivity
347d36db35SAvi Kivity	# multiboot header
357d36db35SAvi Kivity	.long mb_magic, mb_flags, 0 - (mb_magic + mb_flags)
36ea7d43d0SAvi Kivitymb_cmdline = 16
377d36db35SAvi Kivity
387e33895dSPaolo Bonzini.macro setup_tr_and_percpu
39b397e5a5SVarad Gautam	call load_idt
407e33895dSPaolo Bonzini	push %esp
417e33895dSPaolo Bonzini	call setup_tss
427e33895dSPaolo Bonzini	addl $4, %esp
437e33895dSPaolo Bonzini	ltr %ax
447e33895dSPaolo Bonzini	add $(max_cpus * 8), %ax
459eef583dSPaolo Bonzini	mov %ax, %gs
46dfe6cb66SJason Wang.endm
47dfe6cb66SJason Wang
48d68a795aSNadav Amit.macro setup_segments
49d68a795aSNadav Amit	mov $0x10, %ax
50d68a795aSNadav Amit	mov %ax, %ds
51d68a795aSNadav Amit	mov %ax, %es
52d68a795aSNadav Amit	mov %ax, %fs
53d68a795aSNadav Amit	mov %ax, %gs
54d68a795aSNadav Amit	mov %ax, %ss
55d68a795aSNadav Amit.endm
56d68a795aSNadav Amit
577d36db35SAvi Kivity.globl start
587d36db35SAvi Kivitystart:
595ed10141SPaolo Bonzini        lgdtl gdt_descr
60ded41057SPaolo Bonzini        setup_segments
61cae10b5bSClaudio Imbrenda        mov $stacktop, %esp
62ded41057SPaolo Bonzini
6393dd2aa3SAndrew Jones        push %ebx
64716cea8aSPaolo Bonzini        call setup_multiboot
654108903cSPaolo Bonzini        addl $4, %esp
66716cea8aSPaolo Bonzini        call setup_libcflat
67ea7d43d0SAvi Kivity        mov mb_cmdline(%ebx), %eax
68ea7d43d0SAvi Kivity        mov %eax, __args
69ea7d43d0SAvi Kivity        call __setup_args
70dfe6cb66SJason Wang        call prepare_32
71dfe6cb66SJason Wang        jmpl $8, $start32
72dfe6cb66SJason Wang
73dfe6cb66SJason Wangprepare_32:
74b4f3421fSClaudio Imbrenda	mov $(1 << 4), %eax // pse
75dfe6cb66SJason Wang	mov %eax, %cr4
76dfe6cb66SJason Wang
77dfe6cb66SJason Wang	mov $pt, %eax
78dfe6cb66SJason Wang	mov %eax, %cr3
79dfe6cb66SJason Wang
80dfe6cb66SJason Wang	mov %cr0, %eax
81dfe6cb66SJason Wang	bts $0, %eax
82dfe6cb66SJason Wang	bts $31, %eax
83dfe6cb66SJason Wang	mov %eax, %cr0
84dfe6cb66SJason Wang	ret
85dfe6cb66SJason Wang
862821b32dSSean Christophersonsmp_stacktop:	.long stacktop - per_cpu_size
87dfe6cb66SJason Wang
8818a34cceSNadav Amitsave_id:
8918a34cceSNadav Amit	movl $(APIC_DEFAULT_PHYS_BASE + APIC_ID), %eax
9018a34cceSNadav Amit	movl (%eax), %eax
9118a34cceSNadav Amit	shrl $24, %eax
9218a34cceSNadav Amit	lock btsl %eax, online_cpus
9318a34cceSNadav Amit	retl
9418a34cceSNadav Amit
95dfe6cb66SJason Wangap_start32:
96d68a795aSNadav Amit	setup_segments
972821b32dSSean Christopherson	mov $-per_cpu_size, %esp
982d331a4dSRoman Bolshakov	lock xaddl %esp, smp_stacktop
997e33895dSPaolo Bonzini	setup_tr_and_percpu
100dfe6cb66SJason Wang	call prepare_32
101d6e8f863SNadav Amit	call reset_apic
10218a34cceSNadav Amit	call save_id
103dfe6cb66SJason Wang	call enable_apic
104dfe6cb66SJason Wang	call enable_x2apic
105cd6bfb1dSSean Christopherson	call ap_online
106dfe6cb66SJason Wang
107cd6bfb1dSSean Christopherson	/* ap_online() should never return */
108cd6bfb1dSSean Christopherson	ud2
109dfe6cb66SJason Wang
110dfe6cb66SJason Wangstart32:
1117e33895dSPaolo Bonzini	setup_tr_and_percpu
112d6e8f863SNadav Amit	call reset_apic
11318a34cceSNadav Amit	call save_id
114dfe6cb66SJason Wang	call mask_pic_interrupts
115dfe6cb66SJason Wang	call enable_apic
116d6d3a3bdSSean Christopherson	call bsp_rest_init
1173c7d322eSAndrew Jones        push $__environ
118dfe6cb66SJason Wang        push $__argv
119dfe6cb66SJason Wang        push __argc
1207d36db35SAvi Kivity        call main
1217d36db35SAvi Kivity	push %eax
1227d36db35SAvi Kivity	call exit
1237d36db35SAvi Kivity
124c8ab4c00SVarad Gautam#include "trampolines.S"
125