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] acpi: Implement an acpi_rsdp_

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [HVMLOADER] acpi: Implement an acpi_rsdp_get() function that searches
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 28 Nov 2006 17:00:39 +0000
Delivery-date: Tue, 28 Nov 2006 09:00:19 -0800
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 kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 5c47222b60dc7c2d93fe88e82f6efedb9345e8b0
# Parent  4666710bfc559a92737c3998dc7790418be8ab63
[HVMLOADER] acpi: Implement an acpi_rsdp_get() function that searches
for the RSDP in memory (up to the BIOS) rather than calculating its
start address. Recent changes seem to have moved the RSDP to another
location in memory so that I received 'BAD RSPD signature' messages.
I have also fixed some other possible issues related to return codes
and alignment of ACPI entries.

Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxx>
---
 tools/firmware/hvmloader/acpi_utils.c |   65 +++++++++++++++++++++++++---------
 1 files changed, 49 insertions(+), 16 deletions(-)

diff -r 4666710bfc55 -r 5c47222b60dc tools/firmware/hvmloader/acpi_utils.c
--- a/tools/firmware/hvmloader/acpi_utils.c     Tue Nov 28 13:50:32 2006 +0000
+++ b/tools/firmware/hvmloader/acpi_utils.c     Tue Nov 28 13:53:12 2006 +0000
@@ -85,7 +85,8 @@ static void acpi_tpm_tis_probe(unsigned 
         return;
 
     /* legacy systems need an RSDT entry */
-    acpi_rsdt_add_entry_pointer(acpi_start, addr);
+    if ( acpi_rsdt_add_entry_pointer(acpi_start, addr) != 1 )
+        return;
 
     /* add ACPI TCPA table */
     addr = acpi_xsdt_add_entry(acpi_start, freemem, limit,
@@ -108,7 +109,8 @@ static void acpi_tpm_tis_probe(unsigned 
                      tcpa->header.length);
     }
 
-    acpi_rsdt_add_entry_pointer(acpi_start, addr);
+    if ( acpi_rsdt_add_entry_pointer(acpi_start, addr) != 1 )
+        return;
 }
 
 
@@ -125,17 +127,51 @@ void acpi_update(unsigned char *acpi_sta
 }
 
 
+/*
+ * Search for the RSDP in memory below the BIOS
+ */
+struct acpi_20_rsdp *acpi_rsdp_get(unsigned char *acpi_start)
+{
+    int offset = 0;
+    int found = 0;
+    static int displayed = 0;
+    struct acpi_20_rsdp *rsdp;
+
+    while ( &acpi_start[offset] < (unsigned char *)0xf0000 )
+    {
+        rsdp = (struct acpi_20_rsdp *)&acpi_start[offset];
+        if ( rsdp->signature == ACPI_2_0_RSDP_SIGNATURE )
+        {
+            found = 1;
+            break;
+        }
+        offset += 0x10;
+    }
+    
+    if ( !found )
+        rsdp = NULL;
+
+    if ( !displayed )
+    {
+        if ( rsdp )
+            printf("Found RSDP at %lx\n",(long)rsdp);
+        else
+            printf("ERROR: RSDP was not found\n");
+        displayed = 1;
+    }
+
+    return rsdp;
+}
+
+
 struct acpi_20_rsdt *acpi_rsdt_get(unsigned char *acpi_start)
 {
     struct acpi_20_rsdp *rsdp;
     struct acpi_20_rsdt *rsdt;
 
-    rsdp = (struct acpi_20_rsdp *)(acpi_start + sizeof(struct acpi_20_facs));
-    if ( rsdp->signature != ACPI_2_0_RSDP_SIGNATURE )
-    {
-        printf("Bad RSDP signature\n");
-        return NULL;
-    }
+    rsdp = acpi_rsdp_get(acpi_start);
+    if (!rsdp)
+        return NULL;
 
     rsdt = (struct acpi_20_rsdt *)
         (acpi_start + rsdp->rsdt_address - ACPI_PHYSICAL_ADDRESS);
@@ -189,12 +225,9 @@ struct acpi_20_xsdt *acpi_xsdt_get(unsig
     struct acpi_20_rsdp *rsdp;
     struct acpi_20_xsdt *xsdt;
 
-    rsdp = (struct acpi_20_rsdp *)(acpi_start + sizeof(struct acpi_20_facs));
-    if ( rsdp->signature != ACPI_2_0_RSDP_SIGNATURE )
-    {
-        printf("Bad RSDP signature\n");
-        return NULL;
-    }
+    rsdp = acpi_rsdp_get(acpi_start);
+    if (!rsdp)
+        return NULL;
 
     xsdt = (struct acpi_20_xsdt *)
         (acpi_start + rsdp->xsdt_address - ACPI_PHYSICAL_ADDRESS);
@@ -272,10 +305,10 @@ static unsigned char *acpi_xsdt_add_entr
         /* memory below hard limit ? */
         if ( (*freemem + table_size) <= limit )
         {
-            printf("Copying SSDT entry\n");
             addr = *freemem;
             memcpy(addr, table, table_size);
-            *freemem += table_size;
+            printf("Copied dyn. ACPI entry to %lx\n",(long)addr);
+            *freemem += ((table_size + 0xf) & ~0xf);
 
             acpi_xsdt_add_entry_pointer(acpi_start, addr);
         }

_______________________________________________
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] acpi: Implement an acpi_rsdp_get() function that searches, Xen patchbot-unstable <=