[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v6 11/20] xen: setup hypercall page for PVH
From: |
Juergen Gross |
Subject: |
[PATCH v6 11/20] xen: setup hypercall page for PVH |
Date: |
Wed, 28 Nov 2018 14:55:21 +0100 |
Add the needed code to setup the hypercall page for calling into the
Xen hypervisor.
Import the XEN_HVM_DEBUGCONS_IOPORT define from Xen unstable into
include/xen/arch-x86/xen.h
Signed-off-by: Juergen Gross <address@hidden>
Reviewed-by: Roger Pau Monné <address@hidden>
---
V3: grub_xen_early_halt->grub_xen_panic (Roger Pau Monné)
issue panic message (Roger Pau Monné)
rewrite grub_xen_hypercall to avoid register variables (Daniel Kiper)
V5: Use XEN_HVM_DEBUGCONS_IOPORT from Xen unstable (Roger Pau Monné)
Issue "System halted!" in panic (Daniel Kiper)
Clear interrupts and loop for halting (Roger Pau Monné, Daniel Kiper)
Use only one dummy variable for hypercall asm statement
V6: Added some comments (Daniel Kiper)
Use "+x" constraints instead of dummy variable (Daniel Kiper)
---
grub-core/kern/i386/xen/pvh.c | 80 +++++++++++++++++++++++++++++++++++++++++++
include/xen/arch-x86/xen.h | 7 ++++
2 files changed, 87 insertions(+)
diff --git a/grub-core/kern/i386/xen/pvh.c b/grub-core/kern/i386/xen/pvh.c
index 4f629b15e..a2554fb1d 100644
--- a/grub-core/kern/i386/xen/pvh.c
+++ b/grub-core/kern/i386/xen/pvh.c
@@ -20,15 +20,95 @@
#include <grub/misc.h>
#include <grub/memory.h>
#include <grub/mm.h>
+#include <grub/i386/cpuid.h>
+#include <grub/i386/io.h>
#include <grub/xen.h>
#include <xen/hvm/start_info.h>
#include <grub/machine/kernel.h>
grub_uint64_t grub_rsdp_addr;
+static char hypercall_page[GRUB_XEN_PAGE_SIZE]
+ __attribute__ ((aligned (GRUB_XEN_PAGE_SIZE)));
+
+static grub_uint32_t xen_cpuid_base;
+
+static void
+grub_xen_cons_msg (const char *msg)
+{
+ const char *c;
+
+ for (c = msg; *c; c++)
+ grub_outb (*c, XEN_HVM_DEBUGCONS_IOPORT);
+}
+
+static void
+grub_xen_panic (const char *msg)
+{
+ grub_xen_cons_msg (msg);
+ grub_xen_cons_msg ("System halted!\n");
+
+ asm volatile ("cli");
+
+ while (1)
+ {
+ asm volatile ("hlt");
+ }
+}
+
+static void
+grub_xen_cpuid_base (void)
+{
+ grub_uint32_t base, eax, signature[3];
+
+ for (base = 0x40000000; base < 0x40010000; base += 0x100)
+ {
+ grub_cpuid (base, eax, signature[0], signature[1], signature[2]);
+ if (!grub_memcmp ("XenVMMXenVMM", signature, 12) && (eax - base) >= 2)
+ {
+ xen_cpuid_base = base;
+ return;
+ }
+ }
+
+ grub_xen_panic ("Found no Xen signature!\n");
+}
+
+static void
+grub_xen_setup_hypercall_page (void)
+{
+ grub_uint32_t msr, addr, eax, ebx, ecx, edx;
+
+ /* Get base address of Xen-specific MSRs. */
+ grub_cpuid (xen_cpuid_base + 2, eax, ebx, ecx, edx);
+ msr = ebx;
+ addr = (grub_uint32_t) (&hypercall_page);
+
+ /* Specify hypercall page address for Xen. */
+ asm volatile ("wrmsr" : : "c" (msr), "a" (addr), "d" (0) : "memory");
+}
+
+int
+grub_xen_hypercall (grub_uint32_t callno, grub_uint32_t a0,
+ grub_uint32_t a1, grub_uint32_t a2,
+ grub_uint32_t a3, grub_uint32_t a4,
+ grub_uint32_t a5 __attribute__ ((unused)))
+{
+ grub_uint32_t res;
+
+ asm volatile ("call *%[callno]"
+ : "=a" (res), "+b" (a0), "+c" (a1), "+d" (a2),
+ "+S" (a3), "+D" (a4)
+ : [callno] "a" (&hypercall_page[callno * 32])
+ : "memory");
+ return res;
+}
+
void
grub_xen_setup_pvh (void)
{
+ grub_xen_cpuid_base ();
+ grub_xen_setup_hypercall_page ();
}
grub_err_t
diff --git a/include/xen/arch-x86/xen.h b/include/xen/arch-x86/xen.h
index f35804b88..56be26cb6 100644
--- a/include/xen/arch-x86/xen.h
+++ b/include/xen/arch-x86/xen.h
@@ -260,6 +260,13 @@ typedef struct arch_shared_info arch_shared_info_t;
#define XEN_CPUID XEN_EMULATE_PREFIX "cpuid"
#endif
+/*
+ * Debug console IO port, also called "port E9 hack". Each character written
+ * to this IO port will be printed on the hypervisor console, subject to log
+ * level restrictions.
+ */
+#define XEN_HVM_DEBUGCONS_IOPORT 0xe9
+
#endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */
/*
--
2.16.4
- [PATCH v6 00/20] xen: add pvh guest support, Juergen Gross, 2018/11/28
- [PATCH v6 02/20] loader/linux: support passing rsdp address via boot params, Juergen Gross, 2018/11/28
- [PATCH v6 10/20] xen: add PVH boot entry code, Juergen Gross, 2018/11/28
- [PATCH v6 04/20] xen: prepare common code for Xen PVH support, Juergen Gross, 2018/11/28
- [PATCH v6 03/20] xen: carve out grant tab initialization into dedicated function, Juergen Gross, 2018/11/28
- [PATCH v6 08/20] xen: add PVH specific defines to offset.h, Juergen Gross, 2018/11/28
- [PATCH v6 13/20] xen: setup Xen specific data for PVH, Juergen Gross, 2018/11/28
- [PATCH v6 11/20] xen: setup hypercall page for PVH,
Juergen Gross <=
- [PATCH v6 05/20] xen: add some dummy headers for PVH mode, Juergen Gross, 2018/11/28
- [PATCH v6 12/20] xen: get memory map from hypervisor for PVH, Juergen Gross, 2018/11/28
- [PATCH v6 07/20] xen: modify grub_xen_ptr2mfn() for xen-pvh, Juergen Gross, 2018/11/28
- [PATCH v6 19/20] xen_pvh: support grub-install for xen_pvh, Juergen Gross, 2018/11/28
- [PATCH v6 16/20] grub-module-verifier: Ignore all_video for xenpvh, Juergen Gross, 2018/11/28
- [PATCH v6 09/20] xen: add basic hooks for PVH in current code, Juergen Gross, 2018/11/28
- [PATCH v6 18/20] xen_pvh: support building a standalone image, Juergen Gross, 2018/11/28