diff --git a/xen/arch/x86/guest/hyperv/hyperv.c b/xen/arch/x86/guest/hyperv/hyperv.c index 888bda25b0..ce0a02a3b1 100644 --- a/xen/arch/x86/guest/hyperv/hyperv.c +++ b/xen/arch/x86/guest/hyperv/hyperv.c @@ -26,7 +26,10 @@ #include #include +#include "private.h" + struct ms_hyperv_info __read_mostly ms_hyperv; +DEFINE_PER_CPU_READ_MOSTLY(void *, hv_input_page); static uint64_t generate_guest_id(void) { @@ -116,11 +119,35 @@ static void __init setup_hypercall_page(void) set_fixmap_x(FIX_X_HYPERV_HCALL, mfn << PAGE_SHIFT); } +static int setup_hypercall_pcpu_arg(void) +{ + if ( this_cpu(hv_input_page) ) + return 0; + + this_cpu(hv_input_page) = alloc_xenheap_page(); + if ( !this_cpu(hv_input_page) ) + { + printk("CPU%u: Failed to allocate hypercall input page\n", + smp_processor_id()); + return -ENOMEM; + } + + return 0; +} + static void __init setup(void) { ASM_CONSTANT(HV_HCALL_PAGE, __fix_x_to_virt(FIX_X_HYPERV_HCALL)); setup_hypercall_page(); + + if ( setup_hypercall_pcpu_arg() ) + panic("Hyper-V hypercall percpu arg setup failed\n"); +} + +static int ap_setup(void) +{ + return setup_hypercall_pcpu_arg(); } static void __init e820_fixup(struct e820map *e820) @@ -134,6 +161,7 @@ static void __init e820_fixup(struct e820map *e820) static const struct hypervisor_ops ops = { .name = "Hyper-V", .setup = setup, + .ap_setup = ap_setup, .e820_fixup = e820_fixup, }; diff --git a/xen/arch/x86/guest/hyperv/private.h b/xen/arch/x86/guest/hyperv/private.h new file mode 100644 index 0000000000..093985a94b --- /dev/null +++ b/xen/arch/x86/guest/hyperv/private.h @@ -0,0 +1,29 @@ +/****************************************************************************** + * arch/x86/guest/hyperv/private.h + * + * Definitions / declarations only useful to Hyper-V code. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; If not, see . + * + * Copyright (c) 2020 Microsoft. + */ + +#ifndef __XEN_HYPERV_PRIVIATE_H__ +#define __XEN_HYPERV_PRIVIATE_H__ + +#include + +DECLARE_PER_CPU(void *, hv_input_page); + +#endif /* __XEN_HYPERV_PRIVIATE_H__ */