Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Jun 2005 21:05:26 GMT
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 79192 for review
Message-ID:  <200506292105.j5TL5QI2044864@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=79192

Change 79192 by peter@peter_daintree on 2005/06/29 21:04:54

	Bug fix for for PAE case.  I should have read the PAE kernel
	code instead of relying on memory.  The PTD pages are not
	guaranteed to be contiguous.  I'm an idiot.

Affected files ...

.. //depot/projects/hammer/lib/libkvm/kvm_i386.c#7 edit

Differences ...

==== //depot/projects/hammer/lib/libkvm/kvm_i386.c#7 (text+ko) ====

@@ -139,7 +139,6 @@
 
 	if (vm->mmapbase != NULL)
 		munmap(vm->mmapbase, vm->mmapsize);
-
 	if (vm->PTD)
 		free(vm->PTD);
 	free(vm);
@@ -152,9 +151,10 @@
 	struct nlist nlist[2];
 	u_long pa;
 	u_long kernbase;
-	pd_entry_t	*PTD;
+	char		*PTD;
 	Elf_Ehdr	*ehdr;
 	size_t		hdrsz;
+	int		i;
 
 	kd->vmst = (struct vmstate *)_kvm_malloc(kd, sizeof(*kd->vmst));
 	if (kd->vmst == 0) {
@@ -190,17 +190,20 @@
 			_kvm_err(kd, kd->program, "cannot read IdlePDPT");
 			return (-1);
 		}
-
-		if (kvm_read(kd, pa, &pa64, sizeof(pa64)) != sizeof(pa64)) {
-			 _kvm_err(kd, kd->program, "Cannot read PDPT");
-			 return (-1);
-		}
-
 		PTD = _kvm_malloc(kd, 4 * PAGE_SIZE);
-		if (kvm_read(kd, pa64 & PG_FRAME_PAE, PTD, 4 * PAGE_SIZE) !=
-		    (4 * PAGE_SIZE)) {
-			_kvm_err(kd, kd->program, "cannot read PDPT");
-			return (-1);
+		for (i = 0; i < 4; i++) {
+			if (kvm_read(kd, pa + (i * sizeof(pa64)), &pa64,
+			    sizeof(pa64)) != sizeof(pa64)) {
+				_kvm_err(kd, kd->program, "Cannot read PDPT");
+				free(PTD);
+				return (-1);
+			}
+			if (kvm_read(kd, pa64 & PG_FRAME_PAE,
+			    PTD + (i * PAGE_SIZE), PAGE_SIZE) != (PAGE_SIZE)) {
+				_kvm_err(kd, kd->program, "cannot read PDPT");
+				free(PTD);
+				return (-1);
+			}
 		}
 		kd->vmst->PTD = PTD;
 		kd->vmst->pae = 1;
@@ -212,8 +215,8 @@
 			_kvm_err(kd, kd->program, "bad namelist");
 			return (-1);
 		}
-		if (kvm_read(kd, (nlist[0].n_value - kernbase), &pa, sizeof(pa)) !=
-		    sizeof(pa)) {
+		if (kvm_read(kd, (nlist[0].n_value - kernbase), &pa,
+		    sizeof(pa)) != sizeof(pa)) {
 			_kvm_err(kd, kd->program, "cannot read IdlePTD");
 			return (-1);
 		}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200506292105.j5TL5QI2044864>