xen-head.S 3.1 KB

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