[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH RFC v1 28/74] x86: initialise shared_info page



Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
 xen/arch/x86/guest/xen.c        | 24 ++++++++++++++++++++++++
 xen/arch/x86/setup.c            |  3 +++
 xen/include/asm-x86/fixmap.h    |  3 +++
 xen/include/asm-x86/guest/xen.h | 10 ++++++++++
 4 files changed, 40 insertions(+)

diff --git a/xen/arch/x86/guest/xen.c b/xen/arch/x86/guest/xen.c
index 152e471c06..594eae0828 100644
--- a/xen/arch/x86/guest/xen.c
+++ b/xen/arch/x86/guest/xen.c
@@ -72,6 +72,30 @@ void __init probe_hypervisor(void)
     xen_guest = true;
 }
 
+static void map_shared_info(struct e820map *e820)
+{
+    paddr_t frame = 0xff000000; /* TODO: Hardcoded beside magic frames. */
+    struct xen_add_to_physmap xatp = {
+        .domid = DOMID_SELF,
+        .idx = 0,
+        .space = XENMAPSPACE_shared_info,
+        .gpfn = frame >> PAGE_SHIFT,
+    };
+
+    if ( !e820_add_range(e820, frame, frame + PAGE_SIZE, E820_RESERVED) )
+        panic("Failed to reserve shared_info range");
+
+    if ( xen_hypercall_memory_op(XENMEM_add_to_physmap, &xatp) )
+        panic("Failed to map shared_info page");
+
+    set_fixmap(FIX_XEN_SHARED_INFO, frame);
+}
+
+void __init hypervisor_early_setup(struct e820map *e820)
+{
+    map_shared_info(e820);
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index edb43bf2cb..353cdd4337 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -892,6 +892,9 @@ void __init noreturn __start_xen(unsigned long mbi_p)
     /* Create a temporary copy of the E820 map. */
     memcpy(&boot_e820, &e820, sizeof(e820));
 
+    if ( xen_guest )
+        hypervisor_early_setup(&boot_e820);
+
     /* Early kexec reservation (explicit static start address). */
     nr_pages = 0;
     for ( i = 0; i < e820.nr_map; i++ )
diff --git a/xen/include/asm-x86/fixmap.h b/xen/include/asm-x86/fixmap.h
index 51b0e7e945..ded4ddf21b 100644
--- a/xen/include/asm-x86/fixmap.h
+++ b/xen/include/asm-x86/fixmap.h
@@ -45,6 +45,9 @@ enum fixed_addresses {
     FIX_COM_BEGIN,
     FIX_COM_END,
     FIX_EHCI_DBGP,
+#ifdef CONFIG_XEN_GUEST
+    FIX_XEN_SHARED_INFO,
+#endif /* CONFIG_XEN_GUEST */
     /* Everything else should go further down. */
     FIX_APIC_BASE,
     FIX_IO_APIC_BASE_0,
diff --git a/xen/include/asm-x86/guest/xen.h b/xen/include/asm-x86/guest/xen.h
index 97a7c8d531..2f3bcd2fe4 100644
--- a/xen/include/asm-x86/guest/xen.h
+++ b/xen/include/asm-x86/guest/xen.h
@@ -21,17 +21,27 @@
 
 #include <xen/types.h>
 
+#include <asm/e820.h>
+#include <asm/fixmap.h>
+
+#define XEN_shared_info ((struct shared_info 
*)fix_to_virt(FIX_XEN_SHARED_INFO))
+
 #ifdef CONFIG_XEN_GUEST
 
 extern bool xen_guest;
 
 void probe_hypervisor(void);
+void hypervisor_early_setup(struct e820map *e820);
 
 #else
 
 #define xen_guest 0
 
 static inline void probe_hypervisor(void) {};
+static inline void hypervisor_early_setup(struct e820map *e820)
+{
+    ASSERT_UNREACHABLE();
+};
 
 #endif /* CONFIG_XEN_GUEST */
 #endif /* __X86_GUEST_XEN_H__ */
-- 
2.11.0


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.