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