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

[Xen-devel] [PATCH for-xen-4.5 v3 14/16] x86: Move HDD data to boot_info



Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
---
 xen/arch/x86/boot_info.c          |   16 ++++++++++++++++
 xen/arch/x86/efi/efi-boot.h       |   28 ++++++++++++++--------------
 xen/arch/x86/platform_hypercall.c |    8 ++++----
 xen/arch/x86/setup.c              |    4 ++--
 xen/common/efi/runtime.c          |    7 +++++++
 xen/include/asm-x86/boot_info.h   |   13 +++++++++++++
 xen/include/asm-x86/edd.h         |    6 ------
 7 files changed, 56 insertions(+), 26 deletions(-)

diff --git a/xen/arch/x86/boot_info.c b/xen/arch/x86/boot_info.c
index 48d5274..4f38edf 100644
--- a/xen/arch/x86/boot_info.c
+++ b/xen/arch/x86/boot_info.c
@@ -71,6 +71,12 @@ extern struct boot_video_info boot_vid_info;
 extern unsigned short boot_edid_caps;
 extern unsigned char boot_edid_info[128];
 
+extern struct edd_info boot_edd_info[];
+extern u8 boot_edd_info_nr;
+
+extern struct mbr_signature boot_mbr_signature[];
+extern u8 boot_mbr_signature_nr;
+
 static boot_info_t __read_mostly boot_info_mb = {
     .boot_loader_name = "UNKNOWN",
     .cmdline = NULL,
@@ -88,6 +94,10 @@ static boot_info_t __read_mostly boot_info_mb = {
     .vga_console_info = {},
     .edid_caps = 0,
     .edid_info = NULL,
+    .edd_info_nr = 0,
+    .edd_info = NULL,
+    .mbr_signature_nr = 0,
+    .mbr_signature = NULL,
     .mods_nr = 0,
     .mods = NULL,
     .warn_msg = NULL,
@@ -233,6 +243,12 @@ paddr_t __init __init_boot_info(u32 mbd_pa)
 
     init_video_info(&boot_info_mb);
 
+    boot_info_mb.edd_info_nr = bootsym(boot_edd_info_nr);
+    boot_info_mb.edd_info = bootsym(boot_edd_info);
+
+    boot_info_mb.mbr_signature_nr = bootsym(boot_mbr_signature_nr);
+    boot_info_mb.mbr_signature = bootsym(boot_mbr_signature);
+
     boot_info_mb.mods_nr = mbd->mods_nr;
     boot_info_mb.mods = __va(mbd->mods);
 
diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h
index ee5b54b..b5ff624 100644
--- a/xen/arch/x86/efi/efi-boot.h
+++ b/xen/arch/x86/efi/efi-boot.h
@@ -325,7 +325,7 @@ static void __init efi_arch_edd(void)
     {
         EFI_BLOCK_IO *bio;
         EFI_DEV_PATH_PTR devp;
-        struct edd_info *info = boot_edd_info + boot_edd_info_nr;
+        struct edd_info *info = boot_info_efi.edd_info + 
boot_info_efi.edd_info_nr;
         struct edd_device_params *params = &info->edd_device_params;
         enum { root, acpi, pci, ctrlr } state = root;
 
@@ -334,16 +334,16 @@ static void __init efi_arch_edd(void)
              bio->Media->RemovableMedia ||
              bio->Media->LogicalPartition )
             continue;
-        if ( boot_edd_info_nr < EDD_INFO_MAX )
+        if ( boot_info_efi.edd_info_nr < EDD_INFO_MAX )
         {
-            info->device = 0x80 + boot_edd_info_nr; /* fake */
+            info->device = 0x80 + boot_info_efi.edd_info_nr; /* fake */
             info->version = 0x11;
             params->length = offsetof(struct edd_device_params, dpte_ptr);
             params->number_of_sectors = bio->Media->LastBlock + 1;
             params->bytes_per_sector = bio->Media->BlockSize;
             params->dpte_ptr = ~0;
         }
-        ++boot_edd_info_nr;
+        ++boot_info_efi.edd_info_nr;
         status = efi_bs->HandleProtocol(handles[i], &devp_guid,
                                         (void **)&devp);
         if ( EFI_ERROR(status) )
@@ -356,7 +356,7 @@ static void __init efi_arch_edd(void)
                 const u8 *p;
 
             case ACPI_DEVICE_PATH:
-                if ( state != root || boot_edd_info_nr > EDD_INFO_MAX )
+                if ( state != root || boot_info_efi.edd_info_nr > EDD_INFO_MAX 
)
                     break;
                 switch ( DevicePathSubType(devp.DevPath) )
                 {
@@ -375,7 +375,7 @@ static void __init efi_arch_edd(void)
             case HARDWARE_DEVICE_PATH:
                 if ( state != acpi ||
                      DevicePathSubType(devp.DevPath) != HW_PCI_DP ||
-                     boot_edd_info_nr > EDD_INFO_MAX )
+                     boot_info_efi.edd_info_nr > EDD_INFO_MAX )
                     break;
                 state = pci;
                 edd_put_string(params->host_bus_type, "PCI");
@@ -383,7 +383,7 @@ static void __init efi_arch_edd(void)
                 params->interface_path.pci.function = devp.Pci->Function;
                 break;
             case MESSAGING_DEVICE_PATH:
-                if ( state != pci || boot_edd_info_nr > EDD_INFO_MAX )
+                if ( state != pci || boot_info_efi.edd_info_nr > EDD_INFO_MAX )
                     break;
                 state = ctrlr;
                 switch ( DevicePathSubType(devp.DevPath) )
@@ -432,15 +432,15 @@ static void __init efi_arch_edd(void)
             case MEDIA_DEVICE_PATH:
                 if ( DevicePathSubType(devp.DevPath) == MEDIA_HARDDRIVE_DP &&
                      devp.HardDrive->MBRType == MBR_TYPE_PCAT &&
-                     boot_mbr_signature_nr < EDD_MBR_SIG_MAX )
+                     boot_info_efi.mbr_signature_nr < EDD_MBR_SIG_MAX )
                 {
-                    struct mbr_signature *sig = boot_mbr_signature +
-                                                boot_mbr_signature_nr;
+                    struct mbr_signature *sig = boot_info_efi.mbr_signature +
+                                                boot_info_efi.mbr_signature_nr;
 
-                    sig->device = 0x80 + boot_edd_info_nr; /* fake */
+                    sig->device = 0x80 + boot_info_efi.edd_info_nr; /* fake */
                     memcpy(&sig->signature, devp.HardDrive->Signature,
                            sizeof(sig->signature));
-                    ++boot_mbr_signature_nr;
+                    ++boot_info_efi.mbr_signature_nr;
                 }
                 break;
             }
@@ -448,8 +448,8 @@ static void __init efi_arch_edd(void)
     }
     if ( handles )
         efi_bs->FreePool(handles);
-    if ( boot_edd_info_nr > EDD_INFO_MAX )
-        boot_edd_info_nr = EDD_INFO_MAX;
+    if ( boot_info_efi.edd_info_nr > EDD_INFO_MAX )
+        boot_info_efi.edd_info_nr = EDD_INFO_MAX;
 }
 
 static void __init efi_arch_console_init(UINTN cols, UINTN rows)
diff --git a/xen/arch/x86/platform_hypercall.c 
b/xen/arch/x86/platform_hypercall.c
index 7687dd1..2bcee57 100644
--- a/xen/arch/x86/platform_hypercall.c
+++ b/xen/arch/x86/platform_hypercall.c
@@ -301,10 +301,10 @@ ret_t 
do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
             u16 length;
 
             ret = -ESRCH;
-            if ( op->u.firmware_info.index >= bootsym(boot_edd_info_nr) )
+            if ( op->u.firmware_info.index >= boot_info->edd_info_nr )
                 break;
 
-            info = bootsym(boot_edd_info) + op->u.firmware_info.index;
+            info = boot_info->edd_info + op->u.firmware_info.index;
 
             /* Transfer the EDD info block. */
             ret = -EFAULT;
@@ -340,10 +340,10 @@ ret_t 
do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
             const struct mbr_signature *sig;
 
             ret = -ESRCH;
-            if ( op->u.firmware_info.index >= bootsym(boot_mbr_signature_nr) )
+            if ( op->u.firmware_info.index >= boot_info->mbr_signature_nr )
                 break;
 
-            sig = bootsym(boot_mbr_signature) + op->u.firmware_info.index;
+            sig = boot_info->mbr_signature + op->u.firmware_info.index;
 
             op->u.firmware_info.u.disk_mbr_signature.device = sig->device;
             op->u.firmware_info.u.disk_mbr_signature.mbr_signature =
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index 9b41172..a257fe9 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -593,9 +593,9 @@ void __init noreturn __start_xen(paddr_t boot_info_pa)
 
     printk("Disc information:\n");
     printk(" Found %d MBR signatures\n",
-           bootsym(boot_mbr_signature_nr));
+           boot_info->mbr_signature_nr);
     printk(" Found %d EDD information structures\n",
-           bootsym(boot_edd_info_nr));
+           boot_info->edd_info_nr);
 
     /* Check that we have at least one Multiboot module. */
     if ( !boot_info->mods_nr )
diff --git a/xen/common/efi/runtime.c b/xen/common/efi/runtime.c
index 988464f..3416fd3 100644
--- a/xen/common/efi/runtime.c
+++ b/xen/common/efi/runtime.c
@@ -48,6 +48,9 @@ extern struct e820entry e820map[];
 
 extern unsigned char boot_edid_info[128];
 
+extern struct edd_info boot_edd_info[];
+extern struct mbr_signature boot_mbr_signature[];
+
 static boot_module_t __read_mostly boot_info_mods[3] = {};
 
 boot_info_t __read_mostly boot_info_efi = {
@@ -67,6 +70,10 @@ boot_info_t __read_mostly boot_info_efi = {
     .vga_console_info = {},
     .edid_caps = 0,
     .edid_info = boot_edid_info,
+    .edd_info_nr = 0,
+    .edd_info = boot_edd_info,
+    .mbr_signature_nr = 0,
+    .mbr_signature = boot_mbr_signature,
     .mods_nr = 0,
     .mods = boot_info_mods,
     .warn_msg = NULL,
diff --git a/xen/include/asm-x86/boot_info.h b/xen/include/asm-x86/boot_info.h
index df31627..ff3a310 100644
--- a/xen/include/asm-x86/boot_info.h
+++ b/xen/include/asm-x86/boot_info.h
@@ -22,6 +22,7 @@
 #include <xen/video.h>
 
 #include <asm/e820.h>
+#include <asm/edd.h>
 #include <asm/mbd.h>
 
 /*
@@ -87,6 +88,18 @@ typedef struct {
     unsigned short edid_caps;
     unsigned char *edid_info;
 
+    /* Number of EDD entries provided by Xen preloader. */
+    u8 edd_info_nr;
+
+    /* Pointer to EDD info. */
+    struct edd_info *edd_info;
+
+    /* Number of MBR entries provided by Xen preloader. */
+    u8 mbr_signature_nr;
+
+    /* Pointer to MBR info. */
+    struct mbr_signature *mbr_signature;
+
     /* Number of modules. */
     unsigned int mods_nr;
 
diff --git a/xen/include/asm-x86/edd.h b/xen/include/asm-x86/edd.h
index afaa237..e8361a5 100644
--- a/xen/include/asm-x86/edd.h
+++ b/xen/include/asm-x86/edd.h
@@ -143,12 +143,6 @@ struct __packed mbr_signature {
     u32 signature;
 };
 
-/* These all reside in the boot trampoline. Access via bootsym(). */
-extern struct mbr_signature boot_mbr_signature[];
-extern u8 boot_mbr_signature_nr;
-extern struct edd_info boot_edd_info[];
-extern u8 boot_edd_info_nr;
-
 #endif /* __ASSEMBLY__ */
 
 /* Maximum number of EDD information structures at boot_edd_info. */
-- 
1.7.10.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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