[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