[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 11/20] xen: setup hypercall page for PVH
From: |
Juergen Gross |
Subject: |
[PATCH v5 11/20] xen: setup hypercall page for PVH |
Date: |
Wed, 21 Nov 2018 15:28:46 +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>
---
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
---
grub-core/kern/i386/xen/pvh.c | 79 +++++++++++++++++++++++++++++++++++++++++++
include/xen/arch-x86/xen.h | 7 ++++
2 files changed, 86 insertions(+)
diff --git a/grub-core/kern/i386/xen/pvh.c b/grub-core/kern/i386/xen/pvh.c
index 4f629b15e..478cef0d1 100644
--- a/grub-core/kern/i386/xen/pvh.c
+++ b/grub-core/kern/i386/xen/pvh.c
@@ -20,15 +20,94 @@
#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, pfn, eax, ebx, ecx, edx;
+
+ grub_cpuid (xen_cpuid_base + 2, eax, ebx, ecx, edx);
+ msr = ebx;
+ pfn = (grub_uint32_t) (&hypercall_page);
+
+ asm volatile ("wrmsr" : : "c" (msr), "a" (pfn), "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, dummy;
+
+ asm volatile ("call *%[callno]"
+ : "=a" (__res), "=b" (dummy), "=c" (dummy), "=d" (dummy),
+ "=S" (dummy), "=D" (dummy)
+ : "1" (a0), "2" (a1), "3" (a2), "4" (a3), "5" (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
- Re: [PATCH v5 09/20] xen: add basic hooks for PVH in current code, (continued)
- [PATCH v5 05/20] xen: add some dummy headers for PVH mode, Juergen Gross, 2018/11/21
- [PATCH v5 01/20] xen: add some xen headers, Juergen Gross, 2018/11/21
- [PATCH v5 16/20] grub-module-verifier: Ignore all_video for xenpvh, Juergen Gross, 2018/11/21
- [PATCH v5 17/20] xen: use elfnote defines instead of plain numbers, Juergen Gross, 2018/11/21
- [PATCH v5 19/20] xen_pvh: support grub-install for xen_pvh, Juergen Gross, 2018/11/21
- [PATCH v5 18/20] xen_pvh: support building a standalone image, Juergen Gross, 2018/11/21
- [PATCH v5 11/20] xen: setup hypercall page for PVH,
Juergen Gross <=
- [PATCH v5 15/20] xen_pvh: add build runes for grub-core, Juergen Gross, 2018/11/21
- [PATCH v5 10/20] xen: add PVH boot entry code, Juergen Gross, 2018/11/21
- [PATCH v5 20/20] xen_pvh: add support to configure, Juergen Gross, 2018/11/21
- [PATCH v5 13/20] xen: setup Xen specific data for PVH, Juergen Gross, 2018/11/21