Skip site navigation (1)Skip section navigation (2)
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>