^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* Xen-specific pieces of head.S, intended to be included in the right
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) place in head.S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #ifdef CONFIG_XEN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/elfnote.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/boot.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/asm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/msr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/page_types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <asm/percpu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/unwind_hints.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <xen/interface/elfnote.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <xen/interface/features.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <xen/interface/xen.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <xen/interface/xen-mca.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <asm/xen/interface.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #ifdef CONFIG_XEN_PV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) __INIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) SYM_CODE_START(startup_xen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) UNWIND_HINT_EMPTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) cld
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) /* Clear .bss */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) xor %eax,%eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) mov $__bss_start, %_ASM_DI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) mov $__bss_stop, %_ASM_CX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) sub %_ASM_DI, %_ASM_CX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) shr $__ASM_SEL(2, 3), %_ASM_CX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) rep __ASM_SIZE(stos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) mov %_ASM_SI, xen_start_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) mov initial_stack(%rip), %rsp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /* Set up %gs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * The base of %gs always points to fixed_percpu_data. If the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * stack protector canary is enabled, it is located at %gs:40.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * Note that, on SMP, the boot cpu uses init data section until
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * the per cpu areas are set up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) movl $MSR_GS_BASE,%ecx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) movq $INIT_PER_CPU_VAR(fixed_percpu_data),%rax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) cdq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) wrmsr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) call xen_start_kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) SYM_CODE_END(startup_xen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) __FINIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #ifdef CONFIG_XEN_PV_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .pushsection .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) SYM_CODE_START(asm_cpu_bringup_and_idle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) UNWIND_HINT_EMPTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) call cpu_bringup_and_idle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) SYM_CODE_END(asm_cpu_bringup_and_idle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .popsection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .pushsection .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) .balign PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) SYM_CODE_START(hypercall_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .rept (PAGE_SIZE / 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) UNWIND_HINT_EMPTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .skip 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .endr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define HYPERCALL(n) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) .equ xen_hypercall_##n, hypercall_page + __HYPERVISOR_##n * 32; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .type xen_hypercall_##n, @function; .size xen_hypercall_##n, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #include <asm/xen-hypercalls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #undef HYPERCALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) SYM_CODE_END(hypercall_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .popsection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz "linux")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION, .asciz "2.6")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz "xen-3.0")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #ifdef CONFIG_X86_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE, _ASM_PTR __PAGE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE, _ASM_PTR __START_KERNEL_map)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* Map the p2m table to a 512GB-aligned user address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) ELFNOTE(Xen, XEN_ELFNOTE_INIT_P2M, .quad (PUD_SIZE * PTRS_PER_PUD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #ifdef CONFIG_XEN_PV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, _ASM_PTR startup_xen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, _ASM_PTR hypercall_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) .ascii "!writable_page_tables|pae_pgdir_above_4gb")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) ELFNOTE(Xen, XEN_ELFNOTE_SUPPORTED_FEATURES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .long (1 << XENFEAT_writable_page_tables) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) (1 << XENFEAT_dom0) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) (1 << XENFEAT_linux_rsdp_unrestricted))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE, .asciz "yes")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz "generic")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .quad _PAGE_PRESENT; .quad _PAGE_PRESENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) ELFNOTE(Xen, XEN_ELFNOTE_MOD_START_PFN, .long 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW, _ASM_PTR __HYPERVISOR_VIRT_START)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, _ASM_PTR 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #endif /*CONFIG_XEN */