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

[Xen-changelog] [xen-unstable] hvmloader: Simplify e820_malloc() interface and improve



# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1177006932 -3600
# Node ID 438f3a016fd804b17a1ee869c5196d092613a780
# Parent  ce2b25e1c8f6a1ac3b0be6051c715200063fcfaf
hvmloader: Simplify e820_malloc() interface and improve
implementation. Strip unnecessary sections from the highmem bios
extension elf image.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 tools/firmware/hvmloader/32bitbios_support.c |    6 -
 tools/firmware/hvmloader/acpi/build.c        |    3 
 tools/firmware/hvmloader/util.c              |   99 +++++++++++++++------------
 tools/firmware/hvmloader/util.h              |    4 -
 tools/firmware/rombios/32bit/Makefile        |    2 
 5 files changed, 63 insertions(+), 51 deletions(-)

diff -r ce2b25e1c8f6 -r 438f3a016fd8 
tools/firmware/hvmloader/32bitbios_support.c
--- a/tools/firmware/hvmloader/32bitbios_support.c      Thu Apr 19 18:13:09 
2007 +0100
+++ b/tools/firmware/hvmloader/32bitbios_support.c      Thu Apr 19 19:22:12 
2007 +0100
@@ -121,13 +121,9 @@ static void copy_jumptable(char *elfarra
 
 static void relocate_32bitbios(char *elfarray, uint32_t elfarraysize)
 {
-    uint32_t mask = (64 * 1024) - 1;
     char *highbiosarea;
 
-    highbiosarea = (char *)(long)
-        e820_malloc((elfarraysize + mask) & ~mask, /* round to 64kb */
-                    E820_RESERVED,
-                    (uint64_t)0xffffffff);
+    highbiosarea = (char *)(long)e820_malloc(elfarraysize);
     if ( highbiosarea == NULL )
     {
         printf("No available memory for BIOS high memory area\n");
diff -r ce2b25e1c8f6 -r 438f3a016fd8 tools/firmware/hvmloader/acpi/build.c
--- a/tools/firmware/hvmloader/acpi/build.c     Thu Apr 19 18:13:09 2007 +0100
+++ b/tools/firmware/hvmloader/acpi/build.c     Thu Apr 19 19:22:12 2007 +0100
@@ -269,8 +269,7 @@ int construct_secondary_tables(uint8_t *
         tcpa->header.oem_revision = ACPI_OEM_REVISION;
         tcpa->header.creator_id   = ACPI_CREATOR_ID;
         tcpa->header.creator_revision = ACPI_CREATOR_REVISION;
-        tcpa->lasa = e820_malloc(
-            ACPI_2_0_TCPA_LAML_SIZE, E820_RESERVED, (uint32_t)~0);
+        tcpa->lasa = e820_malloc(ACPI_2_0_TCPA_LAML_SIZE);
         if ( tcpa->lasa )
         {
             tcpa->laml = ACPI_2_0_TCPA_LAML_SIZE;
diff -r ce2b25e1c8f6 -r 438f3a016fd8 tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c   Thu Apr 19 18:13:09 2007 +0100
+++ b/tools/firmware/hvmloader/util.c   Thu Apr 19 19:22:12 2007 +0100
@@ -134,19 +134,11 @@ void *memcpy(void *dest, const void *src
 
 void *memmove(void *dest, const void *src, unsigned n)
 {
-    if ( (long)dest > (long)src )
-    {
-        n--;
-        while ( n > 0 )
-        {
+    if ( (unsigned long)dest > (unsigned long)src )
+        while ( n-- != 0 )
             ((char *)dest)[n] = ((char *)src)[n];
-            n--;
-        }
-    }
     else
-    {
         memcpy(dest, src, n);
-    }
     return dest;
 }
 
@@ -292,37 +284,62 @@ uuid_to_string(char *dest, uint8_t *uuid
     *p = '\0';
 }
 
-uint64_t e820_malloc(uint64_t size, uint32_t type, uint64_t mask)
-{
-    uint64_t addr = 0;
-    int c = *E820_MAP_NR - 1;
-    struct e820entry *e820entry = (struct e820entry *)E820_MAP;
-
-    while ( c >= 0 )
-    {
-        if ( (e820entry[c].type  == E820_RAM) &&
-             ((e820entry[c].addr & (~mask)) == 0) &&
-             (e820entry[c].size >= size) )
-        {
-            addr = e820entry[c].addr;
-            if ( e820entry[c].size != size )
-            {
-                (*E820_MAP_NR)++;
-                memmove(&e820entry[c+1],
-                        &e820entry[c],
-                        (*E820_MAP_NR - c) *
-                        sizeof(struct e820entry));
-                e820entry[c].size -= size;
-                addr += e820entry[c].size;
-                c++;
-            }
-            e820entry[c].addr = addr;
-            e820entry[c].size = size;
-            e820entry[c].type = type;
-            break;
-        }
-        c--;
-    }
+static void e820_collapse(void)
+{
+    int i = 0;
+    struct e820entry *ent = (struct e820entry *)E820_MAP;
+
+    while ( i < (*E820_MAP_NR-1) )
+    {
+        if ( (ent[i].type == ent[i+1].type) &&
+             ((ent[i].addr + ent[i].size) == ent[i+1].addr) )
+        {
+            ent[i].size += ent[i+1].size;
+            memcpy(&ent[i+1], &ent[i+2], *E820_MAP_NR - i - 2);
+            (*E820_MAP_NR)--;
+        }
+        else
+        {
+            i++;
+        }
+    }
+}
+
+uint32_t e820_malloc(uint32_t size)
+{
+    uint32_t addr;
+    int i;
+    struct e820entry *ent = (struct e820entry *)E820_MAP;
+
+    /* Align allocation request to a reasonable boundary (1kB). */
+    size = (size + 1023) & ~1023;
+
+    for ( i = *E820_MAP_NR - 1; i >= 0; i-- )
+    {
+        addr = ent[i].addr;
+        if ( (ent[i].type != E820_RAM) || /* not ram? */
+             (ent[i].size < size) ||      /* too small? */
+             (addr != ent[i].addr) ||     /* starts above 4gb? */
+             ((addr + size) < addr) )     /* ends above 4gb? */
+            continue;
+        
+        if ( ent[i].size != size )
+        {
+            memmove(&ent[i+1], &ent[i], (*E820_MAP_NR - i) * sizeof(*ent));
+            (*E820_MAP_NR)++;
+            ent[i].size -= size;
+            addr += ent[i].size;
+            i++;
+        }
+
+        ent[i].addr = addr;
+        ent[i].size = size;
+        ent[i].type = E820_RESERVED;
+        break;
+    }
+
+    e820_collapse();
+
     return addr;
 }
 
diff -r ce2b25e1c8f6 -r 438f3a016fd8 tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h   Thu Apr 19 18:13:09 2007 +0100
+++ b/tools/firmware/hvmloader/util.h   Thu Apr 19 19:22:12 2007 +0100
@@ -79,8 +79,8 @@ int printf(const char *fmt, ...) __attri
 int printf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
 int vprintf(const char *fmt, va_list ap);
 
-/* Allocate region of specified type in the e820 table. */
-uint64_t e820_malloc(uint64_t size, uint32_t type, uint64_t mask);
+/* Reserve a RAM region in the e820 table. */
+uint32_t e820_malloc(uint32_t size);
 
 /* General e820 access. */
 #include <xen/hvm/e820.h>
diff -r ce2b25e1c8f6 -r 438f3a016fd8 tools/firmware/rombios/32bit/Makefile
--- a/tools/firmware/rombios/32bit/Makefile     Thu Apr 19 18:13:09 2007 +0100
+++ b/tools/firmware/rombios/32bit/Makefile     Thu Apr 19 19:22:12 2007 +0100
@@ -32,7 +32,7 @@ clean:
        done;
 
 $(TARGET): subdirs 32bitbios.o util.o
-       $(LD) $(LDFLAGS_DIRECT) -r 32bitbios.o $(MODULES) util.o -o 
32bitbios_all.o
+       $(LD) $(LDFLAGS_DIRECT) -s -r 32bitbios.o $(MODULES) util.o -o 
32bitbios_all.o
        @nm 32bitbios_all.o |                                \
          grep -E -q '^ +U ' && {                            \
            echo "There are undefined symbols in the BIOS:"; \

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


 


Rackspace

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