Explorar o código

ACPI: cover for bugs in some acpt tables.

VMWare seems to indicate table bogosity with a size of
0x80000000, not 0. Accomodate their weirdness.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Ronald G. Minnich %!s(int64=7) %!d(string=hai) anos
pai
achega
8c4d1f018c
Modificáronse 1 ficheiros con 7 adicións e 7 borrados
  1. 7 7
      sys/src/9/amd64/devacpi.c

+ 7 - 7
sys/src/9/amd64/devacpi.c

@@ -489,7 +489,7 @@ static uint8_t sdtchecksum(void *addr, int len)
 	return sum;
 }
 
-static void *sdtmap(uintptr_t pa, size_t *n, int cksum)
+static void *sdtmap(uintptr_t pa, size_t want, size_t *n, int cksum)
 {
 	Sdthdr *sdt;
 	Acpilist *p;
@@ -513,8 +513,8 @@ static void *sdtmap(uintptr_t pa, size_t *n, int cksum)
 		return nil;
 	}
 	if (*n == 0x80000000) {
+		*n = want;
 		print("sdt has high bit set; weird vmware table? pa = %p\n", pa);
-		return nil;
 	}
 	sdt = vmap(pa, *n);
 	if (sdt == nil) {
@@ -545,7 +545,7 @@ static int loadfacs(uintptr_t pa)
 {
 	size_t n;
 
-	facs = sdtmap(pa, &n, 0);
+	facs = sdtmap(pa, 0, &n, 0);
 	if (facs == nil)
 		return -1;
 	if (memcmp(facs->sig, "FACS", 4) != 0) {
@@ -572,7 +572,7 @@ static void loaddsdt(uintptr_t pa)
 	size_t n;
 	uint8_t *dsdtp;
 
-	dsdtp = sdtmap(pa, &n, 1);
+	dsdtp = sdtmap(pa, 0, &n, 1);
 	//print("Loaded it\n");
 	if (dsdtp == nil) {
 		print("acpi: Failed to map dsdtp.\n");
@@ -1519,7 +1519,7 @@ static void parsexsdt(Atable *root)
 	print("%s: tbl %p, end %d\n", __func__, tbl, end);
 	for (int i = 0; i < end; i += xsdt->asize) {
 		dhpa = (xsdt->asize == 8) ? l64get(tbl + i) : l32get(tbl + i);
-		sdt = sdtmap(dhpa, &l, 1);
+		sdt = sdtmap(dhpa, 0, &l, 1);
 		kmprint("sdt for map of %p, %d, 1 is %p\n", (void *)dhpa, l, sdt);
 		if (sdt == nil)
 			continue;
@@ -1602,7 +1602,7 @@ static void parsersdptr(void)
 	 * process the RSDT or XSDT table.
 	 */
 	xsdt = root->tbl;
-	xsdt->p = sdtmap(sdtpa, &xsdt->len, 1);
+	xsdt->p = sdtmap(sdtpa, 0, &xsdt->len, 1);
 	if (xsdt->p == nil) {
 		print("acpi: sdtmap failed\n");
 		return;
@@ -2024,7 +2024,7 @@ static int32_t acpiread(Chan *c, void *a, int32_t n, int64_t off)
 		/* we don't load all the lists, so this may be a new one. */
 		if (! l) {
 			size_t _;
-			if (sdtmap(off, &_, 0) == nil){
+			if (sdtmap(off, n, &_, 0) == nil){
 				static char msg[256];
 				snprint(msg, sizeof(msg), "unable to map acpi@%p/%d", off, n);
 				error(msg);