xref: /kvm-unit-tests/x86/efi/efistart64.S (revision dca3f4c041143c8e8dc70c6890a19a5730310230)
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