diff options
author | Erwan Velu <erwan.velu@free.fr> | 2009-12-01 16:26:16 +0100 |
---|---|---|
committer | Erwan Velu <erwan.velu@free.fr> | 2009-12-04 10:19:00 +0100 |
commit | 62ea3bbf5cde3a708bb95e754d6eb9d73e9ef30b (patch) | |
tree | 7b86c18dc1510a4fc0a72b0226ad03d77e8f4494 /com32/gpllib | |
parent | 92d4e25dc8e1d4efee83ec6062dff61f6307ab0e (diff) | |
download | syslinux-62ea3bbf5cde3a708bb95e754d6eb9d73e9ef30b.tar.gz |
acpi: Fixing parsing
Impact: none
Parsing have to be done the spec says ;)
Let's found the RSDP first
Diffstat (limited to 'com32/gpllib')
-rw-r--r-- | com32/gpllib/acpi/acpi.c | 24 | ||||
-rw-r--r-- | com32/gpllib/acpi/madt.c | 42 | ||||
-rw-r--r-- | com32/gpllib/acpi/rsdp.c | 78 |
3 files changed, 102 insertions, 42 deletions
diff --git a/com32/gpllib/acpi/acpi.c b/com32/gpllib/acpi/acpi.c index a87e472f..911fd168 100644 --- a/com32/gpllib/acpi/acpi.c +++ b/com32/gpllib/acpi/acpi.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2006 Erwan Velu - All Rights Reserved + * Copyright 2009 Erwan Velu - All Rights Reserved * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -36,24 +36,12 @@ void init_acpi(s_acpi * acpi) memset(acpi, 0, sizeof(s_acpi)); } -int search_acpi(s_acpi * acpi) +int parse_acpi(s_acpi * acpi) { + int ret_val; init_acpi(acpi); - struct e820entry map[E820MAX]; - struct e820entry nm[E820MAX]; - int count = 0; - detect_memory_e820(map, E820MAX, &count); - /* Clean up, adjust and copy the BIOS-supplied E820-map. */ - int nr = sanitize_e820_map(map, nm, count); - for (int i = 0; i < nr; i++) { - /* Type is ACPI Reclaim */ - if (nm[i].type == E820_ACPI) { - acpi->base_address = nm[i].addr; - acpi->size = nm[i].size; - acpi->acpi_valid = true; - return ACPI_FOUND; - } - } - return -ENO_ACPI; + /* Let's seach for RSDT table */ + if ((ret_val = search_rsdp(acpi)) != RSDP_TABLE_FOUND) + return ret_val; } diff --git a/com32/gpllib/acpi/madt.c b/com32/gpllib/acpi/madt.c index 518c5414..6e8a038e 100644 --- a/com32/gpllib/acpi/madt.c +++ b/com32/gpllib/acpi/madt.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2006 Erwan Velu - All Rights Reserved + * Copyright 2009 Erwan Velu - All Rights Reserved * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -71,47 +71,41 @@ static uint8_t *add_apic_structure(s_acpi * acpi, uint8_t * q) return q; } -#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; s_madt *m = &acpi->madt; - if (!acpi->acpi_valid) - return -ENO_ACPI; - - p = (uint64_t *) acpi->base_address; /* The start address to look at the APIC table */ - for (q = p; q < p + acpi->size; q += 1) { + + //p = (uint64_t *) acpi->base_address; /* The start address to look at the APIC table */ +/* for (q = p; q < p + acpi->size; q += 1) { m->address=(uint32_t) q; uint8_t *save = q; - /* Searching for MADT with APIC signature */ if (memcmp(q, "APIC", 4) == 0) { - 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); - cp_struct(&m->flags, 4); + cp_str_struct(m->signature); + cp_struct(&m->length); + cp_struct(&m->revision); + cp_struct(&m->checksum); + cp_str_struct(m->oem_id); + cp_str_struct(m->oem_table_id); + cp_struct(&m->oem_revision); + cp_str_struct(m->creator_id); + cp_struct(&m->creator_revision); + cp_struct(&m->local_apic_address); + cp_struct(&m->flags); - /* Let's parse APIC Structures */ while (q < (save + m->length)) { q = add_apic_structure(acpi, q); } - acpi->madt_valid = true; + m->valid = true; return MADT_FOUND; } - } + }*/ return -ENO_MADT; } void print_madt(s_acpi * acpi) { - if (!acpi->madt_valid) + if (!acpi->madt.valid) return; printf("MADT Table @ 0x%08x\n",acpi->madt.address); printf(" signature : %s\n", acpi->madt.signature); diff --git a/com32/gpllib/acpi/rsdp.c b/com32/gpllib/acpi/rsdp.c new file mode 100644 index 00000000..66f258b8 --- /dev/null +++ b/com32/gpllib/acpi/rsdp.c @@ -0,0 +1,78 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2009 Erwan Velu - All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall + * be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * ----------------------------------------------------------------------- +*/ + +#include <stdio.h> +#include <string.h> +#include <memory.h> +#include <dprintf.h> +#include "acpi/acpi.h" + +int search_rsdp(s_acpi * acpi) +{ + /* Let's seach for RSDT table */ + uint8_t *p, *q; + + /* Let's start for the base address */ + p = (uint64_t *) RSDP_MIN_ADDRESS; + for (q = p; q < RSDP_MAX_ADDRESS; q += 16) { + /* Searching for MADT with APIC signature */ + if (memcmp(q, "RSD PTR", 7) == 0) { + s_rsdp *r = &acpi->rsdp; + r->valid = true; + r->address = (uint64_t) q; + cp_str_struct(r->signature); + cp_struct(&r->checksum); + cp_str_struct(r->oem_id); + cp_struct(&r->revision); + cp_struct(&r->rsdt_address); + cp_struct(&r->length); + cp_struct(&r->xsdt_address); + cp_struct(&r->extended_checksum); + q += 3; /* reserved field */ + return RSDP_TABLE_FOUND; + } + } + return -RSDP_TABLE_FOUND; +} + +void print_rsdp(s_acpi * acpi) +{ + s_rsdp *r = &acpi->rsdp; + + if (!r->valid) + return; + printf("RSDP Table @ 0x%016llx\n", r->address); + printf(" signature : %s\n", r->signature); + printf(" checksum : %u\n", r->checksum); + printf(" oem id : %s\n", r->oem_id); + printf(" revision : %u\n", r->revision); + printf(" RDST address : 0x%08x\n", r->rsdt_address); + printf(" length : %u\n", r->length); + printf(" XSDT address : 0x%08x\n", r->xsdt_address); + printf(" extended checksum : %u\n", r->extended_checksum); +} |