Date: Thu, 4 Sep 2003 14:02:19 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 37527 for review Message-ID: <200309042102.h84L2JZ7048079@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=37527 Change 37527 by marcel@marcel_nfs on 2003/09/04 14:01:30 Patch 3: Introduce addr_size to handle 32-bit and 64-bit addresses. Use le32dec() and le64dec() since ACPI is little endian misaligned by definition. Affected files ... .. //depot/projects/ia64/usr.sbin/acpi/acpidump/acpi.c#16 edit Differences ... ==== //depot/projects/ia64/usr.sbin/acpi/acpidump/acpi.c#16 (text+ko) ==== @@ -27,8 +27,8 @@ * $FreeBSD: src/usr.sbin/acpi/acpidump/acpi.c,v 1.10 2003/08/28 03:33:07 njl Exp $ */ -#include <sys/types.h> #include <sys/param.h> +#include <sys/endian.h> #include <sys/stat.h> #include <sys/wait.h> #include <assert.h> @@ -58,11 +58,15 @@ static void acpi_print_sdt(struct ACPIsdt *sdp); static void acpi_print_facp(struct FACPbody *facp); static void acpi_print_dsdt(struct ACPIsdt *dsdp); -static struct ACPIsdt * - acpi_map_sdt(vm_offset_t pa); +static struct ACPIsdt *acpi_map_sdt(vm_offset_t pa); static void acpi_print_rsd_ptr(struct ACPIrsdp *rp); static void acpi_handle_rsdt(struct ACPIsdt *rsdp); +/* + * Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. + */ +static int addr_size; + static void acpi_print_string(char *s, size_t length) { @@ -299,15 +303,26 @@ acpi_print_rsdt(struct ACPIsdt *rsdp) { int i, entries; + u_long addr; printf(BEGIN_COMMENT); acpi_print_sdt(rsdp); - entries = (rsdp->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t); + entries = (rsdp->len - SIZEOF_SDT_HDR) / addr_size; printf("\tEntries={ "); for (i = 0; i < entries; i++) { if (i > 0) printf(", "); - printf("0x%08x", rsdp->body[i]); + switch (addr_size) { + case 4: + addr = le32dec((char*)rsdp->body + i * addr_size); + break; + case 8: + addr = le64dec((char*)rsdp->body + i * addr_size); + break; + default: + assert((addr = 0)); + } + printf("0x%08lx", addr); } printf(" }\n"); printf(END_COMMENT); @@ -450,14 +465,24 @@ static void acpi_handle_rsdt(struct ACPIsdt *rsdp) { - int i; - int entries; - struct ACPIsdt *sdp; + struct ACPIsdt *sdp; + vm_offset_t addr; + int entries, i; acpi_print_rsdt(rsdp); - entries = (rsdp->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t); + entries = (rsdp->len - SIZEOF_SDT_HDR) / addr_size; for (i = 0; i < entries; i++) { - sdp = (struct ACPIsdt *)acpi_map_sdt(rsdp->body[i]); + switch (addr_size) { + case 4: + addr = le32dec((char*)rsdp->body + i * addr_size); + break; + case 8: + addr = le64dec((char*)rsdp->body + i * addr_size); + break; + default: + assert((addr = 0)); + } + sdp = (struct ACPIsdt *)acpi_map_sdt(addr); if (acpi_checksum(sdp, sdp->len)) errx(1, "RSDT entry %d is corrupt", i); if (!memcmp(sdp->signature, "FACP", 4)) @@ -488,11 +513,13 @@ if (memcmp(rsdp->signature, "RSDT", 4) != 0 || acpi_checksum(rsdp, rsdp->len) != 0) errx(1, "RSDT is corrupted"); + addr_size = sizeof(uint32_t); } else { rsdp = (struct ACPIsdt *)acpi_map_sdt(rp->xsdt_addr); if (memcmp(rsdp->signature, "XSDT", 4) != 0 || acpi_checksum(rsdp, rsdp->len) != 0) errx(1, "XSDT is corrupted"); + addr_size = sizeof(uint64_t); } return (rsdp); } @@ -568,17 +595,28 @@ struct ACPIsdt * sdt_from_rsdt(struct ACPIsdt *rsdt, const char *sig) { - int i; - int entries; - struct ACPIsdt *sdt; + struct ACPIsdt *sdt; + vm_offset_t addr; + int entries, i; - entries = (rsdt->len - SIZEOF_SDT_HDR) / sizeof(uint32_t); + entries = (rsdt->len - SIZEOF_SDT_HDR) / addr_size; for (i = 0; i < entries; i++) { - sdt = (struct ACPIsdt *)acpi_map_sdt(rsdt->body[i]); + switch (addr_size) { + case 4: + addr = le32dec((char*)rsdt->body + i * addr_size); + break; + case 8: + addr = le64dec((char*)rsdt->body + i * addr_size); + break; + default: + assert((addr = 0)); + } + sdt = (struct ACPIsdt *)acpi_map_sdt(addr); + if (memcmp(sdt->signature, sig, strlen(sig))) + continue; if (acpi_checksum(sdt, sdt->len)) errx(1, "RSDT entry %d is corrupt", i); - if (!memcmp(sdt->signature, sig, strlen(sig))) - return (sdt); + return (sdt); } return (NULL);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309042102.h84L2JZ7048079>