@@ -27,7 +27,10 @@
#include <asm/guest/hyperv-tlfs.h>
#include <asm/processor.h>
+#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)
{
@@ -130,9 +133,33 @@ static void __init setup_hypercall_page(void)
}
}
+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)
{
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)
@@ -146,6 +173,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,
};
new file mode 100644
@@ -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 <http://www.gnu.org/licenses/>.
+ *
+ * Copyright (c) 2020 Microsoft.
+ */
+
+#ifndef __XEN_HYPERV_PRIVIATE_H__
+#define __XEN_HYPERV_PRIVIATE_H__
+
+#include <xen/percpu.h>
+
+DECLARE_PER_CPU(void *, hv_input_page);
+
+#endif /* __XEN_HYPERV_PRIVIATE_H__ */