From owner-p4-projects@FreeBSD.ORG Thu Sep 4 14:02:21 2003 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4334516A4C1; Thu, 4 Sep 2003 14:02:21 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id F13B116A4BF for ; Thu, 4 Sep 2003 14:02:20 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7110443FE5 for ; Thu, 4 Sep 2003 14:02:20 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h84L2K0U048082 for ; Thu, 4 Sep 2003 14:02:20 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h84L2JZ7048079 for perforce@freebsd.org; Thu, 4 Sep 2003 14:02:19 -0700 (PDT) Date: Thu, 4 Sep 2003 14:02:19 -0700 (PDT) Message-Id: <200309042102.h84L2JZ7048079@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Subject: PERFORCE change 37527 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Sep 2003 21:02:21 -0000 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 #include +#include #include #include #include @@ -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);