PERFORCE change 37527 for review
Marcel Moolenaar
marcel at FreeBSD.org
Thu Sep 4 14:02:21 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=37527
Change 37527 by marcel at 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);
More information about the p4-projects
mailing list