From owner-p4-projects Tue Dec 3 22:11:59 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5A2FC37B404; Tue, 3 Dec 2002 22:11:54 -0800 (PST) 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 E4E5437B401 for ; Tue, 3 Dec 2002 22:11:53 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8B98A43E9C for ; Tue, 3 Dec 2002 22:11:53 -0800 (PST) (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 gB467emV011497 for ; Tue, 3 Dec 2002 22:07:40 -0800 (PST) (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id gB467dlf011494 for perforce@freebsd.org; Tue, 3 Dec 2002 22:07:39 -0800 (PST) Date: Tue, 3 Dec 2002 22:07:39 -0800 (PST) Message-Id: <200212040607.gB467dlf011494@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar Subject: PERFORCE change 21897 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://perforce.freebsd.org/chv.cgi?CH=21897 Change 21897 by marcel@marcel_nfs on 2002/12/03 22:07:04 Step 1 in making acpidump work on the HP box. For ACPI 2.0, the RSDT is actually a XSDT, which is the same as a RSDT except that the entries are 64-bit instead of 32-bit. Update struct ACPIrsdp to add the address of the xsdt. As per the spec, we use the XSDT if present otherwise we use the RSDT. Deal with the differences in acpi_handle_rsdt(), where we handle both. I renamed rsdt to sdt where it makes sense, but long exposure to ACPI tends to annihilate ones sensibility :-) The FACP parsing is not called from acpi_handle_sdt, as it's currently only good for unclean reboots. That's step 2... Affected files ... .. //depot/projects/ia64/usr.sbin/acpi/acpidump/acpi.c#3 edit .. //depot/projects/ia64/usr.sbin/acpi/acpidump/acpidump.c#5 edit .. //depot/projects/ia64/usr.sbin/acpi/acpidump/acpidump.h#5 edit Differences ... ==== //depot/projects/ia64/usr.sbin/acpi/acpidump/acpi.c#3 (text+ko) ==== @@ -192,24 +192,6 @@ } void -acpi_print_rsdt(struct ACPIsdt *rsdp) -{ - int i, entries; - - acpi_print_sdt(rsdp); - entries = (rsdp->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t); - printf(BEGIN_COMMENT); - printf("\tEntries={ "); - for (i = 0; i < entries; i++) { - if (i > 0) - printf(", "); - printf("0x%08x", rsdp->body[i]); - } - printf(" }\n"); - printf(END_COMMENT); -} - -void acpi_print_facp(struct FACPbody *facp) { char sep; @@ -327,28 +309,55 @@ printf(BEGIN_COMMENT); printf("RSD PTR: Checksum=%d, OEMID=", rp->sum); acpi_print_string(rp->oem, 6); - printf(", RsdtAddress=0x%08x\n", rp->addr); + printf(", RsdtAddress=0x%08x, XsdtAddress=0x%016x\n", rp->rsdt, + rp->xsdt); printf(END_COMMENT); } void -acpi_handle_rsdt(struct ACPIsdt *rsdp) +acpi_handle_sdt(struct ACPIsdt *sdp) { - int i; - int entries; - struct ACPIsdt *sdp; + struct ACPIsdt *sdp_child; + char *p, *end; + + acpi_print_sdt(sdp); + printf(BEGIN_COMMENT); + printf("\tEntries={ "); + p = (void*)sdp->body; + end = p + (sdp->len - SIZEOF_SDT_HDR); + while (p < end) { + if (p != (void*)sdp->body) + printf(", "); + if (sdp->signature[0] == 'X') { + printf("0x%016x", *((u_int64_t*)p)); + p += sizeof(u_int64_t); + } else { + printf("0x%08x", *((u_int32_t*)p)); + p += sizeof(u_int32_t); + } + } + printf(" }\n"); + printf(END_COMMENT); - entries = (rsdp->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t); - acpi_print_rsdt(rsdp); - for (i = 0; i < entries; i++) { - sdp = (struct ACPIsdt *) acpi_map_sdt(rsdp->body[i]); - if (acpi_checksum(sdp, sdp->len)) - errx(1, "RSDT entry %d is corrupt\n", i); - if (!memcmp(sdp->signature, "FACP", 4)) { - acpi_handle_facp((struct FACPbody *) sdp->body); + p = (void*)sdp->body; + while (p < end) { + if (sdp->signature[0] == 'X') { + sdp_child = acpi_map_sdt(*((u_int64_t*)p)); + p += sizeof(u_int64_t); } else { - acpi_print_sdt(sdp); + sdp_child = acpi_map_sdt(*((u_int32_t*)p)); + p += sizeof(u_int32_t); } + + if (acpi_checksum(sdp_child, sdp_child->len)) + errx(1, "SDT at %p is corrupt\n", sdp_child); + if (!memcmp(sdp_child->signature, "FACP", 4)) { + printf("FACP!!!\n"); +#if 0 + acpi_handle_facp((struct FACPbody *)sdp_child->body); +#endif + } else + acpi_print_sdt(sdp_child); } } ==== //depot/projects/ia64/usr.sbin/acpi/acpidump/acpidump.c#5 (text+ko) ==== @@ -86,22 +86,25 @@ asl_dump_from_devmem() { struct ACPIrsdp *rp; - struct ACPIsdt *rsdp; + struct ACPIsdt *sdp; + vm_offset_t sdt_addr; rp = acpi_find_rsd_ptr(xaddr); if (!rp) errx(1, "Can't find ACPI information\n"); acpi_print_rsd_ptr(rp); - rsdp = (struct ACPIsdt *) acpi_map_sdt(rp->addr); - if (memcmp(rsdp->signature, "RSDT", 4)) { -hd(rsdp, 256); - errx(1, "RSDT is not a RSDT\n"); + sdt_addr = (rp->xsdt != 0) ? rp->xsdt : rp->rsdt; + sdp = (struct ACPIsdt*) acpi_map_sdt(sdt_addr); + if (memcmp(sdp->signature, "RSDT", 4) != 0 && + memcmp(sdp->signature, "XSDT", 4) != 0) { + hd(sdp, 256); + errx(1, "SDT is not a RSDT nor a XSDT\n"); } - if (acpi_checksum(rsdp, rsdp->len)) - errx(1, "RSDT checksum corrupted\n"); + if (acpi_checksum(sdp, sdp->len)) + errx(1, "RSDT/XSDT checksum corrupted\n"); - acpi_handle_rsdt(rsdp); + acpi_handle_sdt(sdp); } static void ==== //depot/projects/ia64/usr.sbin/acpi/acpidump/acpidump.h#5 (text+ko) ==== @@ -52,7 +52,11 @@ u_char sum; u_char oem[6]; u_char res; - u_int32_t addr; + u_int32_t rsdt; + u_int32_t length; + u_int64_t xsdt; + u_char xsum; + u_char _spare_[3]; } __packed; /* System Description Table */ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message