PERFORCE change 79192 for review
Peter Wemm
peter at FreeBSD.org
Wed Jun 29 21:05:28 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=79192
Change 79192 by peter at 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);
}
More information about the p4-projects
mailing list