[syslinux:master] acpi: Fixing MADT structures

syslinux-bot for Erwan Velu erwan.velu at free.fr
Sun Feb 6 14:06:30 PST 2011


Commit-ID:  2390a80f8e5c3a70f4ddc44bd53166fbc1f9f62b
Gitweb:     http://syslinux.zytor.com/commit/2390a80f8e5c3a70f4ddc44bd53166fbc1f9f62b
Author:     Erwan Velu <erwan.velu at free.fr>
AuthorDate: Mon, 30 Nov 2009 20:41:36 +0100
Committer:  Erwan Velu <erwan.velu at free.fr>
CommitDate: Fri, 4 Dec 2009 10:19:00 +0100

acpi: Fixing MADT structures

Impact: Fixing MADT structures

Fixing MADT structures


---
 com32/gplinclude/acpi/acpi.h |   19 ++++++++++---------
 com32/gpllib/acpi/acpi.c     |   33 ++++++++++++++++++++++++---------
 2 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/com32/gplinclude/acpi/acpi.h b/com32/gplinclude/acpi/acpi.h
index c93ace2..979c454 100644
--- a/com32/gplinclude/acpi/acpi.h
+++ b/com32/gplinclude/acpi/acpi.h
@@ -22,15 +22,16 @@ enum { ACPI_FOUND, ENO_ACPI, MADT_FOUND, ENO_MADT};
 #define QWORD(x) (*(const uint64_t *)(x))
 
 typedef struct {
-    uint8_t signature[4];
-    uint32_t len;
-    uint8_t  revision;
-    uint8_t  checksum;
-    uint8_t  oem_id[6];
-    uint8_t  oem_table_id[8];
-    uint8_t  oem_revision[4];
-    uint8_t  creator_id[4];
-    uint8_t  creator_revision[4];
+    int8_t signature[4+1];
+    int32_t length;
+    int8_t  revision;
+    int8_t  checksum;
+    int8_t  oem_id[6+1];
+    int8_t  oem_table_id[8+1];
+    int32_t oem_revision;
+    int8_t  creator_id[4+1];
+    int32_t creator_revision;
+    uint32_t local_apic_address;
 } s_madt;
 
 typedef struct {
diff --git a/com32/gpllib/acpi/acpi.c b/com32/gpllib/acpi/acpi.c
index dba8052..4e29bed 100644
--- a/com32/gpllib/acpi/acpi.c
+++ b/com32/gpllib/acpi/acpi.c
@@ -35,9 +35,14 @@ void init_acpi(s_acpi *acpi)
 {
    acpi->acpi_valid=false;
    acpi->madt_valid=false;
+   memset(acpi->madt.oem_id,0,sizeof(acpi->madt.oem_id));
+   memset(acpi->madt.oem_table_id,0,sizeof(acpi->madt.oem_table_id));
+   memset(acpi->madt.oem_revision,0,sizeof(acpi->madt.oem_revision));
+   memset(acpi->madt.creator_id,0,sizeof(acpi->madt.creator_id));
+   memset(acpi->madt.creator_revision,0,sizeof(acpi->madt.creator_revision));
 }
 
-int search_acpi(s_acpi *acpi) 
+int search_acpi(s_acpi *acpi)
 {
     init_acpi(acpi);
     struct e820entry map[E820MAX];
@@ -60,11 +65,11 @@ int search_acpi(s_acpi *acpi)
    return -ENO_ACPI;
 }
 
+#define cp_struct(dest,quantity) memcpy(dest,q,quantity); q+=quantity
+#define cp_str_struct(dest,quantity) memcpy(dest,q,quantity); dest[quantity]=0;q+=quantity
 int search_madt(s_acpi *acpi)
 {
     uint8_t *p, *q;
-    int found = 0;
-
     if (!acpi->acpi_valid) return -ENO_ACPI;
 
     p = (uint64_t *) acpi->base_address;	/* The start address to look at the dmi table */
@@ -80,25 +85,35 @@ int search_madt(s_acpi *acpi)
 	     * on the intermediate structure to get the table length
 	     * and address
 	     */
-	memcpy(&acpi->madt,q,sizeof(acpi->madt));
-	acpi->madt_valid=true;
+	     s_madt *m = &acpi->madt;
+	     cp_str_struct(m->signature,4);
+	     cp_struct(&m->length,4);
+	     cp_struct(&m->revision,1);
+	     cp_struct(&m->checksum,1);
+	     cp_str_struct(m->oem_id,6);
+	     cp_str_struct(m->oem_table_id,8);
+	     cp_struct(&m->oem_revision,4);
+	     cp_str_struct(m->creator_id,4);
+	     cp_struct(&m->creator_revision,4);
+	     cp_struct(&m->local_apic_address,4);
+	     acpi->madt_valid=true;
 	return MADT_FOUND;
 	}
     }
    return -ENO_MADT;
 }
 
-void print_madt(s_acpi *acpi) 
+void print_madt(s_acpi *acpi)
 {
    if (!acpi->madt_valid) return;
    printf("MADT\n");
    printf(" signature      : %s\n",acpi->madt.signature);
-   printf(" length         : %d\n",acpi->madt.len);
+   printf(" length         : %d\n",acpi->madt.length);
    printf(" revision       : %d\n",acpi->madt.revision);
    printf(" checksum       : %d\n",acpi->madt.checksum);
    printf(" oem id         : %s\n",acpi->madt.oem_id);
    printf(" oem table id   : %s\n",acpi->madt.oem_table_id);
-   printf(" oem revision   : %s\n",acpi->madt.oem_revision);
+   printf(" oem revision   : %d\n",acpi->madt.oem_revision);
    printf(" oem creator id : %s\n",acpi->madt.creator_id);
-   printf(" oem creator rev: %s\n",acpi->madt.creator_revision);
+   printf(" oem creator rev: %d\n",acpi->madt.creator_revision);
 }



More information about the Syslinux-commits mailing list