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