WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 02 of 19] tools: hvmloader: split e820 support into i

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH 02 of 19] tools: hvmloader: split e820 support into its own code module
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Tue, 12 Apr 2011 12:29:01 +0100
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Tue, 12 Apr 2011 04:41:51 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1302607739@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <patchbomb.1302607739@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.6.4
# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1302598647 -3600
# Node ID 17184d148ff5b507710561cd62cb2987fb531c47
# Parent  d9ee229bada7659019b88ae6b75dd0a8a488714f
tools: hvmloader: split e820 support into its own code module.

Pass the table address as a paramter to the build function and cause
it to return the number of entries. Pass both base and offset as
parameters to the dump function.

This adds a duplicated e820.h header to ROMBIOS. Since the e820 data
structure is well defined by existing BIOS implementations I think
this is OK and simplifies the cross talk between hvmloader and
ROMBIOS.

Reduces the cross talk between ROMBIOS and hvmloader.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/hvmloader/Makefile
--- a/tools/firmware/hvmloader/Makefile Tue Apr 12 09:46:09 2011 +0100
+++ b/tools/firmware/hvmloader/Makefile Tue Apr 12 09:57:27 2011 +0100
@@ -30,6 +30,7 @@ CFLAGS += $(CFLAGS_xeninclude)
 
 SRCS  = hvmloader.c mp_tables.c util.c smbios.c 
 SRCS += 32bitbios_support.c smp.c cacheattr.c xenbus.c
+SRCS += e820.c
 ifeq ($(debug),y)
 SRCS += tests.c
 endif
diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/hvmloader/config.h
--- a/tools/firmware/hvmloader/config.h Tue Apr 12 09:46:09 2011 +0100
+++ b/tools/firmware/hvmloader/config.h Tue Apr 12 09:57:27 2011 +0100
@@ -1,6 +1,8 @@
 #ifndef __HVMLOADER_CONFIG_H__
 #define __HVMLOADER_CONFIG_H__
 
+#include <stdint.h>
+
 #define PAGE_SHIFT 12
 #define PAGE_SIZE  (1ul << PAGE_SHIFT)
 
@@ -28,6 +30,7 @@ extern unsigned long pci_mem_start, pci_
 #define ROMBIOS_MAXOFFSET      0x0000FFFF
 #define ROMBIOS_END            (ROMBIOS_BEGIN + ROMBIOS_SIZE)
 
+#include "e820.h"
 #include "../rombios/config.h"
 
 #define VGABIOS_PHYSICAL_ADDRESS      0x000C0000
diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/hvmloader/e820.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/firmware/hvmloader/e820.c   Tue Apr 12 09:57:27 2011 +0100
@@ -0,0 +1,141 @@
+/*
+ * HVM e820 support.
+ *
+ * Leendert van Doorn, leendert@xxxxxxxxxxxxxx
+ * Copyright (c) 2005, International Business Machines Corporation.
+ * Copyright (c) 2006, Keir Fraser, XenSource Inc.
+ * Copyright (c) 2011, Citrix Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "config.h"
+#include "util.h"
+
+void dump_e820_table(struct e820entry *e820, unsigned int nr)
+{
+    uint64_t last_end = 0, start, end;
+    int i;
+
+    printf("E820 table:\n");
+
+    for ( i = 0; i < nr; i++ )
+    {
+        start = e820[i].addr;
+        end = e820[i].addr + e820[i].size;
+
+        if ( start < last_end )
+            printf(" OVERLAP!!\n");
+        else if ( start > last_end )
+            printf(" HOLE: %08x:%08x - %08x:%08x\n",
+                   (uint32_t)(last_end >> 32), (uint32_t)last_end,
+                   (uint32_t)(start >> 32), (uint32_t)start);
+
+        printf(" [%02d]: %08x:%08x - %08x:%08x: ", i,
+               (uint32_t)(start >> 32), (uint32_t)start,
+               (uint32_t)(end >> 32), (uint32_t)end);
+        switch ( e820[i].type )
+        {
+        case E820_RAM:
+            printf("RAM\n");
+            break;
+        case E820_RESERVED:
+            printf("RESERVED\n");
+            break;
+        case E820_ACPI:
+            printf("ACPI\n");
+            break;
+        case E820_NVS:
+            printf("NVS\n");
+            break;
+        default:
+            printf("UNKNOWN (%08x)\n", e820[i].type);
+            break;
+        }
+
+        last_end = end;
+    }
+}
+
+/* Create an E820 table based on memory parameters provided in hvm_info. */
+int build_e820_table(struct e820entry *e820)
+{
+    unsigned int nr = 0;
+
+    /* 0x0-0x9E000: Ordinary RAM. */
+    /* (Must be at least 512K to keep Windows happy) */
+    e820[nr].addr = 0x00000;
+    e820[nr].size = 0x9E000;
+    e820[nr].type = E820_RAM;
+    nr++;
+
+    /* 0x9E000-0x9FC00: Reserved for internal use. */
+    e820[nr].addr = 0x9E000;
+    e820[nr].size = 0x01C00;
+    e820[nr].type = E820_RESERVED;
+    nr++;
+
+    /* 0x9FC00-0xA0000: Extended BIOS Data Area (EBDA). */
+    e820[nr].addr = 0x9FC00;
+    e820[nr].size = 0x400;
+    e820[nr].type = E820_RESERVED;
+    nr++;
+
+    /*
+     * Following regions are standard regions of the PC memory map.
+     * They are not covered by e820 regions. OSes will not use as RAM.
+     * 0xA0000-0xC0000: VGA memory-mapped I/O. Not covered by E820.
+     * 0xC0000-0xE0000: 16-bit devices, expansion ROMs (inc. vgabios).
+     * TODO: free pages which turn out to be unused.
+     */
+
+    /*
+     * 0xE0000-0x0F0000: PC-specific area. We place various tables here.
+     * 0xF0000-0x100000: System BIOS.
+     * TODO: free pages which turn out to be unused.
+     */
+    e820[nr].addr = 0xE0000;
+    e820[nr].size = 0x20000;
+    e820[nr].type = E820_RESERVED;
+    nr++;
+
+    /* Low RAM goes here. Reserve space for special pages. */
+    BUG_ON((hvm_info->low_mem_pgend << PAGE_SHIFT) < (2u << 20));
+    e820[nr].addr = 0x100000;
+    e820[nr].size = (hvm_info->low_mem_pgend << PAGE_SHIFT) - e820[nr].addr;
+    e820[nr].type = E820_RAM;
+    nr++;
+
+    /*
+     * Explicitly reserve space for special pages.
+     * This space starts at RESERVED_MEMBASE an extends to cover various
+     * fixed hardware mappings (e.g., LAPIC, IOAPIC, default SVGA framebuffer).
+     */
+    e820[nr].addr = RESERVED_MEMBASE;
+    e820[nr].size = (uint32_t)-e820[nr].addr;
+    e820[nr].type = E820_RESERVED;
+    nr++;
+
+    if ( hvm_info->high_mem_pgend )
+    {
+        e820[nr].addr = ((uint64_t)1 << 32);
+        e820[nr].size =
+            ((uint64_t)hvm_info->high_mem_pgend << PAGE_SHIFT) - e820[nr].addr;
+        e820[nr].type = E820_RAM;
+        nr++;
+    }
+
+    return nr;
+}
+
diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/hvmloader/e820.h
--- a/tools/firmware/hvmloader/e820.h   Tue Apr 12 09:46:09 2011 +0100
+++ b/tools/firmware/hvmloader/e820.h   Tue Apr 12 09:57:27 2011 +0100
@@ -1,8 +1,6 @@
 #ifndef __HVMLOADER_E820_H__
 #define __HVMLOADER_E820_H__
 
-#include <xen/hvm/e820.h>
-
 /*
  * PC BIOS standard E820 types and structure.
  */
@@ -17,7 +15,4 @@ struct e820entry {
     uint32_t type;
 } __attribute__((packed));
 
-#define E820_NR ((uint16_t *)(E820_PHYSICAL_ADDRESS + E820_NR_OFFSET))
-#define E820    ((struct e820entry *)(E820_PHYSICAL_ADDRESS + E820_OFFSET))
-
 #endif /* __HVMLOADER_E820_H__ */
diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c      Tue Apr 12 09:46:09 2011 +0100
+++ b/tools/firmware/hvmloader/hvmloader.c      Tue Apr 12 09:57:27 2011 +0100
@@ -27,7 +27,6 @@
 #include "config.h"
 #include "apic_regs.h"
 #include "pci_regs.h"
-#include "e820.h"
 #include "option_rom.h"
 #include <xen/version.h>
 #include <xen/hvm/params.h>
@@ -578,125 +577,6 @@ static void init_vm86_tss(void)
     printf("vm86 TSS at %08lx\n", virt_to_phys(tss));
 }
 
-static void dump_e820_table(void)
-{
-    struct e820entry *e820 = E820;
-    unsigned int nr = *E820_NR;
-    uint64_t last_end = 0, start, end;
-    int i;
-
-    printf("E820 table:\n");
-
-    for ( i = 0; i < nr; i++ )
-    {
-        start = e820[i].addr;
-        end = e820[i].addr + e820[i].size;
-
-        if ( start < last_end )
-            printf(" OVERLAP!!\n");
-        else if ( start > last_end )
-            printf(" HOLE: %08x:%08x - %08x:%08x\n",
-                   (uint32_t)(last_end >> 32), (uint32_t)last_end,
-                   (uint32_t)(start >> 32), (uint32_t)start);
-
-        printf(" [%02d]: %08x:%08x - %08x:%08x: ", i,
-               (uint32_t)(start >> 32), (uint32_t)start,
-               (uint32_t)(end >> 32), (uint32_t)end);
-        switch ( e820[i].type )
-        {
-        case E820_RAM:
-            printf("RAM\n");
-            break;
-        case E820_RESERVED:
-            printf("RESERVED\n");
-            break;
-        case E820_ACPI:
-            printf("ACPI\n");
-            break;
-        case E820_NVS:
-            printf("NVS\n");
-            break;
-        default:
-            printf("UNKNOWN (%08x)\n", e820[i].type);
-            break;
-        }
-
-        last_end = end;
-    }
-}
-
-/* Create an E820 table based on memory parameters provided in hvm_info. */
-static void build_e820_table(void)
-{
-    struct e820entry *e820 = E820;
-    unsigned int nr = 0;
-
-    /* 0x0-0x9E000: Ordinary RAM. */
-    /* (Must be at least 512K to keep Windows happy) */
-    e820[nr].addr = 0x00000;
-    e820[nr].size = 0x9E000;
-    e820[nr].type = E820_RAM;
-    nr++;
-
-    /* 0x9E000-0x9FC00: Reserved for internal use. */
-    e820[nr].addr = 0x9E000;
-    e820[nr].size = 0x01C00;
-    e820[nr].type = E820_RESERVED;
-    nr++;
-
-    /* 0x9FC00-0xA0000: Extended BIOS Data Area (EBDA). */
-    e820[nr].addr = 0x9FC00;
-    e820[nr].size = 0x400;
-    e820[nr].type = E820_RESERVED;
-    nr++;
-
-    /*
-     * Following regions are standard regions of the PC memory map.
-     * They are not covered by e820 regions. OSes will not use as RAM.
-     * 0xA0000-0xC0000: VGA memory-mapped I/O. Not covered by E820.
-     * 0xC0000-0xE0000: 16-bit devices, expansion ROMs (inc. vgabios).
-     * TODO: free pages which turn out to be unused.
-     */
-
-    /*
-     * 0xE0000-0x0F0000: PC-specific area. We place various tables here.
-     * 0xF0000-0x100000: System BIOS.
-     * TODO: free pages which turn out to be unused.
-     */
-    e820[nr].addr = 0xE0000;
-    e820[nr].size = 0x20000;
-    e820[nr].type = E820_RESERVED;
-    nr++;
-
-    /* Low RAM goes here. Reserve space for special pages. */
-    BUG_ON((hvm_info->low_mem_pgend << PAGE_SHIFT) < (2u << 20));
-    e820[nr].addr = 0x100000;
-    e820[nr].size = (hvm_info->low_mem_pgend << PAGE_SHIFT) - e820[nr].addr;
-    e820[nr].type = E820_RAM;
-    nr++;
-
-    /*
-     * Explicitly reserve space for special pages.
-     * This space starts at RESERVED_MEMBASE an extends to cover various
-     * fixed hardware mappings (e.g., LAPIC, IOAPIC, default SVGA framebuffer).
-     */
-    e820[nr].addr = RESERVED_MEMBASE;
-    e820[nr].size = (uint32_t)-e820[nr].addr;
-    e820[nr].type = E820_RESERVED;
-    nr++;
-
-    if ( hvm_info->high_mem_pgend )
-    {
-        e820[nr].addr = ((uint64_t)1 << 32);
-        e820[nr].size =
-            ((uint64_t)hvm_info->high_mem_pgend << PAGE_SHIFT) - e820[nr].addr;
-        e820[nr].type = E820_RAM;
-        nr++;
-    }
-
-    *E820_NR = nr;
-}
-
 int main(void)
 {
     int option_rom_sz = 0, vgabios_sz = 0, etherboot_sz = 0;
@@ -802,8 +682,8 @@ int main(void)
                ROMBIOS_PHYSICAL_ADDRESS,
                ROMBIOS_PHYSICAL_ADDRESS + rombios_sz - 1);
 
-    build_e820_table();
-    dump_e820_table();
+    *E820_NR = build_e820_table(E820);
+    dump_e820_table(E820, *E820_NR);
 
     bios_info = (struct bios_info *)BIOS_INFO_PHYSICAL_ADDRESS;
     memset(bios_info, 0, sizeof(*bios_info));
diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/hvmloader/smbios.c
--- a/tools/firmware/hvmloader/smbios.c Tue Apr 12 09:46:09 2011 +0100
+++ b/tools/firmware/hvmloader/smbios.c Tue Apr 12 09:57:27 2011 +0100
@@ -26,7 +26,6 @@
 #include "smbios_types.h"
 #include "util.h"
 #include "hypercall.h"
-#include "e820.h"
 
 static int
 write_smbios_tables(void *start,
diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c   Tue Apr 12 09:46:09 2011 +0100
+++ b/tools/firmware/hvmloader/util.c   Tue Apr 12 09:57:27 2011 +0100
@@ -20,7 +20,6 @@
 
 #include "util.h"
 #include "config.h"
-#include "e820.h"
 #include "hypercall.h"
 #include <stdint.h>
 #include <xen/xen.h>
diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h   Tue Apr 12 09:46:09 2011 +0100
+++ b/tools/firmware/hvmloader/util.h   Tue Apr 12 09:57:27 2011 +0100
@@ -189,6 +189,10 @@ void create_mp_tables(void);
 int hvm_write_smbios_tables(void);
 void smp_initialise(void);
 
+#include "e820.h"
+int build_e820_table(struct e820entry *e820);
+void dump_e820_table(struct e820entry *e820, unsigned int nr);
+
 #ifndef NDEBUG
 void perform_tests(void);
 #else
diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/rombios/32bit/pmm.c
--- a/tools/firmware/rombios/32bit/pmm.c        Tue Apr 12 09:46:09 2011 +0100
+++ b/tools/firmware/rombios/32bit/pmm.c        Tue Apr 12 09:57:27 2011 +0100
@@ -66,7 +66,7 @@
 #include <stdint.h>
 #include <stddef.h>
 #include "config.h"
-#include <../hvmloader/e820.h>
+#include "e820.h"
 #include "util.h"
 
 #define DEBUG_PMM 0
diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/rombios/config.h
--- a/tools/firmware/rombios/config.h   Tue Apr 12 09:46:09 2011 +0100
+++ b/tools/firmware/rombios/config.h   Tue Apr 12 09:57:27 2011 +0100
@@ -18,6 +18,9 @@
 #define E820_NR_OFFSET                0x0
 #define E820_OFFSET                   0x8
 
+#define E820_NR ((uint16_t *)(E820_PHYSICAL_ADDRESS + E820_NR_OFFSET))
+#define E820    ((struct e820entry *)(E820_PHYSICAL_ADDRESS + E820_OFFSET))
+
 /* Xen Platform Device */
 #define XEN_PF_IOBASE   0x10
 #define PFFLAG_ROM_LOCK 1 /* Sets whether ROM memory area is RW or RO */
diff -r d9ee229bada7 -r 17184d148ff5 tools/firmware/rombios/e820.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/firmware/rombios/e820.h     Tue Apr 12 09:57:27 2011 +0100
@@ -0,0 +1,18 @@
+#ifndef __ROMBIOS_E820_H__
+#define __ROMBIOS_E820_H__
+
+/*
+ * PC BIOS standard E820 types and structure.
+ */
+#define E820_RAM          1
+#define E820_RESERVED     2
+#define E820_ACPI         3
+#define E820_NVS          4
+
+struct e820entry {
+    uint64_t addr;
+    uint64_t size;
+    uint32_t type;
+} __attribute__((packed));
+
+#endif /* __ROMBIOS_E820_H__ */

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>