Linux Audio

Check our new training course

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