[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v7 11/20] xen: setup hypercall page for PVH
From: |
Juergen Gross |
Subject: |
[PATCH v7 11/20] xen: setup hypercall page for PVH |
Date: |
Fri, 7 Dec 2018 13:11:39 +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 v7 02/20] loader/linux: support passing rsdp address via boot params, (continued)
- [PATCH v7 02/20] loader/linux: support passing rsdp address via boot params, Juergen Gross, 2018/12/07
- [PATCH v7 08/20] xen: add PVH specific defines to offset.h, Juergen Gross, 2018/12/07
- [PATCH v7 03/20] xen: carve out grant tab initialization into dedicated function, Juergen Gross, 2018/12/07
- [PATCH v7 07/20] xen: modify grub_xen_ptr2mfn() for xen-pvh, Juergen Gross, 2018/12/07
- [PATCH v7 09/20] xen: add basic hooks for PVH in current code, Juergen Gross, 2018/12/07
- [PATCH v7 05/20] xen: add some dummy headers for PVH mode, Juergen Gross, 2018/12/07
- [PATCH v7 06/20] xen: rearrange xen/init.c to prepare it for Xen PVH mode, Juergen Gross, 2018/12/07
- [PATCH v7 04/20] xen: prepare common code for Xen PVH support, Juergen Gross, 2018/12/07
- [PATCH v7 10/20] xen: add PVH boot entry code, Juergen Gross, 2018/12/07
- [PATCH v7 20/20] xen_pvh: add support to configure, Juergen Gross, 2018/12/07
- [PATCH v7 11/20] xen: setup hypercall page for PVH,
Juergen Gross <=
- [PATCH v7 01/20] xen: add some xen headers, Juergen Gross, 2018/12/07
- [PATCH v7 19/20] xen_pvh: support grub-install for xen_pvh, Juergen Gross, 2018/12/07
- [PATCH v7 13/20] xen: setup Xen specific data for PVH, Juergen Gross, 2018/12/07
- [PATCH v7 16/20] grub-module-verifier: Ignore all_video for xenpvh, Juergen Gross, 2018/12/07
- [PATCH v7 12/20] xen: get memory map from hypervisor for PVH, Juergen Gross, 2018/12/07
- [PATCH v7 17/20] xen: use elfnote defines instead of plain numbers, Juergen Gross, 2018/12/07
- [PATCH v7 15/20] xen_pvh: add build runes for grub-core, Juergen Gross, 2018/12/07
- [PATCH v7 18/20] xen_pvh: support building a standalone image, Juergen Gross, 2018/12/07
- [PATCH v7 14/20] xen: init memory regions for PVH, Juergen Gross, 2018/12/07
- Re: [PATCH v7 00/20] xen: add pvh guest support, Daniel Kiper, 2018/12/07