1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun #include <linux/acpi.h> 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #include <xen/hvc-console.h> 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <asm/io_apic.h> 7*4882a593Smuzhiyun #include <asm/hypervisor.h> 8*4882a593Smuzhiyun #include <asm/e820/api.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <xen/xen.h> 11*4882a593Smuzhiyun #include <asm/xen/interface.h> 12*4882a593Smuzhiyun #include <asm/xen/hypercall.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <xen/interface/memory.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include "xen-ops.h" 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* 19*4882a593Smuzhiyun * PVH variables. 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * The variable xen_pvh needs to live in the data segment since it is used 22*4882a593Smuzhiyun * after startup_{32|64} is invoked, which will clear the .bss segment. 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun bool xen_pvh __section(".data") = 0; 25*4882a593Smuzhiyun xen_pvh_init(struct boot_params * boot_params)26*4882a593Smuzhiyunvoid __init xen_pvh_init(struct boot_params *boot_params) 27*4882a593Smuzhiyun { 28*4882a593Smuzhiyun u32 msr; 29*4882a593Smuzhiyun u64 pfn; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun xen_pvh = 1; 32*4882a593Smuzhiyun xen_domain_type = XEN_HVM_DOMAIN; 33*4882a593Smuzhiyun xen_start_flags = pvh_start_info.flags; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun msr = cpuid_ebx(xen_cpuid_base() + 2); 36*4882a593Smuzhiyun pfn = __pa(hypercall_page); 37*4882a593Smuzhiyun wrmsr_safe(msr, (u32)pfn, (u32)(pfn >> 32)); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun xen_efi_init(boot_params); 40*4882a593Smuzhiyun } 41*4882a593Smuzhiyun mem_map_via_hcall(struct boot_params * boot_params_p)42*4882a593Smuzhiyunvoid __init mem_map_via_hcall(struct boot_params *boot_params_p) 43*4882a593Smuzhiyun { 44*4882a593Smuzhiyun struct xen_memory_map memmap; 45*4882a593Smuzhiyun int rc; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun memmap.nr_entries = ARRAY_SIZE(boot_params_p->e820_table); 48*4882a593Smuzhiyun set_xen_guest_handle(memmap.buffer, boot_params_p->e820_table); 49*4882a593Smuzhiyun rc = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap); 50*4882a593Smuzhiyun if (rc) { 51*4882a593Smuzhiyun xen_raw_printk("XENMEM_memory_map failed (%d)\n", rc); 52*4882a593Smuzhiyun BUG(); 53*4882a593Smuzhiyun } 54*4882a593Smuzhiyun boot_params_p->e820_entries = memmap.nr_entries; 55*4882a593Smuzhiyun } 56