14143d8a7SZixuan Wang/* Startup code and pre-defined data structures */ 24143d8a7SZixuan Wang 33298643cSZixuan Wang#include "apic-defs.h" 43298643cSZixuan Wang#include "asm-generic/page.h" 54143d8a7SZixuan Wang#include "crt0-efi-x86_64.S" 6*d467e659SSean Christopherson#include "smp.h" 7d316d12aSVarad Gautam 8d316d12aSVarad Gautam/* Reserve stack in .data */ 9e6f65fa4SZixuan Wang.data 10d316d12aSVarad Gautam.align PAGE_SIZE 11d316d12aSVarad Gautam . = . + PAGE_SIZE * MAX_TEST_CPUS 12d316d12aSVarad Gautam.globl stacktop 13d316d12aSVarad Gautamstacktop: 14e6f65fa4SZixuan Wang 151542cd7bSVarad Gautam.globl smp_stacktop 161542cd7bSVarad Gautamsmp_stacktop: .long 0 171542cd7bSVarad Gautam 18e6f65fa4SZixuan Wang.align PAGE_SIZE 19e6f65fa4SZixuan Wang.globl ptl2 20e6f65fa4SZixuan Wangptl2: 21e6f65fa4SZixuan Wang . = . + 4 * PAGE_SIZE 22e6f65fa4SZixuan Wang.align PAGE_SIZE 23e6f65fa4SZixuan Wang 24e6f65fa4SZixuan Wang.globl ptl3 25e6f65fa4SZixuan Wangptl3: 26e6f65fa4SZixuan Wang . = . + PAGE_SIZE 27e6f65fa4SZixuan Wang.align PAGE_SIZE 28e6f65fa4SZixuan Wang 29e6f65fa4SZixuan Wang.globl ptl4 30e6f65fa4SZixuan Wangptl4: 31e6f65fa4SZixuan Wang . = . + PAGE_SIZE 32e6f65fa4SZixuan Wang.align PAGE_SIZE 33e6f65fa4SZixuan Wang 344143d8a7SZixuan Wang.section .init 354143d8a7SZixuan Wang.code64 364143d8a7SZixuan Wang.text 374143d8a7SZixuan Wang 38d36b378fSVarad Gautam.code16 39d36b378fSVarad Gautam 40d36b378fSVarad Gautam.globl rm_trampoline 41d36b378fSVarad Gautamrm_trampoline: 42d36b378fSVarad Gautam 43d36b378fSVarad Gautam.globl sipi_entry 44d36b378fSVarad Gautamsipi_entry: 451542cd7bSVarad Gautam mov %cr0, %eax 461542cd7bSVarad Gautam or $1, %eax 471542cd7bSVarad Gautam mov %eax, %cr0 481542cd7bSVarad Gautam 491542cd7bSVarad Gautam /* Retrieve relocated ap_rm_gdt_descr address at REALMODE_GDT_LOWMEM. */ 501542cd7bSVarad Gautam mov (REALMODE_GDT_LOWMEM), %ebx 511542cd7bSVarad Gautam lgdtl (%ebx) 521542cd7bSVarad Gautam 531542cd7bSVarad Gautam lcall $0x18, $0x0 541542cd7bSVarad Gautam 551542cd7bSVarad Gautam.globl ap_rm_gdt 561542cd7bSVarad Gautamap_rm_gdt: 571542cd7bSVarad Gautam .quad 0 581542cd7bSVarad Gautam .quad 0x00cf9b000000ffff // flat 32-bit code segment 591542cd7bSVarad Gautam .quad 0x00cf93000000ffff // flat 32-bit data segment 601542cd7bSVarad Gautam .quad 0 // call gate to 32-bit AP entrypoint 611542cd7bSVarad Gautam.globl ap_rm_gdt_end 621542cd7bSVarad Gautamap_rm_gdt_end: 631542cd7bSVarad Gautam 641542cd7bSVarad Gautam.globl ap_rm_gdt_descr 651542cd7bSVarad Gautamap_rm_gdt_descr: 661542cd7bSVarad Gautam .word 0 671542cd7bSVarad Gautam .long 0 68d36b378fSVarad Gautam 69d36b378fSVarad Gautam.globl sipi_end 70d36b378fSVarad Gautamsipi_end: 71d36b378fSVarad Gautam 72d36b378fSVarad Gautam.globl rm_trampoline_end 73d36b378fSVarad Gautamrm_trampoline_end: 741542cd7bSVarad Gautam 751542cd7bSVarad Gautam#include "../trampolines.S" 76