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-changelog

[Xen-changelog] [xen-unstable] hvmloader: Simplify e820_malloc() interfa

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] hvmloader: Simplify e820_malloc() interface and improve
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 19 Apr 2007 17:40:08 -0700
Delivery-date: Thu, 19 Apr 2007 17:39:21 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] hvmloader: Simplify e820_malloc() interface and improve, Xen patchbot-unstable <=