PERFORCE change 78834 for review
Peter Wemm
peter at FreeBSD.org
Wed Jun 22 23:54:38 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=78834
Change 78834 by peter at peter_melody on 2005/06/22 23:54:20
Make the error reporting consistent.
Affected files ...
.. //depot/projects/hammer/lib/libkvm/kvm_amd64.c#12 edit
Differences ...
==== //depot/projects/hammer/lib/libkvm/kvm_amd64.c#12 (text+ko) ====
@@ -210,7 +210,7 @@
u_long pdeindex;
u_long pteindex;
int i;
- u_long ofs;
+ u_long a, ofs;
size_t s;
if (ISALIVE(kd)) {
@@ -226,22 +226,27 @@
* not yet set) then return pa == va to avoid infinite recursion.
*/
if (vm->PML4 == 0) {
- *pa = va;
- _kvm_pa2off(kd, va, pa);
- return (PAGE_SIZE - offset);
+ s = _kvm_pa2off(kd, va, pa);
+ if (s == 0) {
+ _kvm_err(kd, kd->program, "_kvm_kvatop: bootstrap data not in dump");
+ goto invalid;
+ } else
+ return (PAGE_SIZE - offset);
}
pml4eindex = (va >> PML4SHIFT) & (NPML4EPG - 1);
pml4e = vm->PML4[pml4eindex];
- if (((u_long)pml4e & PG_V) == 0)
+ if (((u_long)pml4e & PG_V) == 0) {
+ _kvm_err(kd, kd->program, "_kvm_kvatop: pml4e not valid");
goto invalid;
+ }
pdpeindex = (va >> PDPSHIFT) & (NPDPEPG-1);
pdpe_pa = ((u_long)pml4e & PG_FRAME) + (pdpeindex * sizeof(pdp_entry_t));
s = _kvm_pa2off(kd, pdpe_pa, &ofs);
if (s <= sizeof pdpe) {
- _kvm_syserr(kd, kd->program, "_kvm_kvatop: pdpe_pa not found");
+ _kvm_err(kd, kd->program, "_kvm_kvatop: pdpe_pa not found");
goto invalid;
}
if (lseek(kd->pmfd, ofs, 0) == -1) {
@@ -252,10 +257,11 @@
_kvm_syserr(kd, kd->program, "_kvm_kvatop: read pdpe");
goto invalid;
}
- if (((u_long)pdpe & PG_V) == 0)
+ if (((u_long)pdpe & PG_V) == 0) {
+ _kvm_err(kd, kd->program, "_kvm_kvatop: pdpe not valid");
goto invalid;
+ }
-
pdeindex = (va >> PDRSHIFT) & (NPDEPG-1);
pde_pa = ((u_long)pdpe & PG_FRAME) + (pdeindex * sizeof(pd_entry_t));
@@ -265,15 +271,17 @@
goto invalid;
}
if (lseek(kd->pmfd, ofs, 0) == -1) {
- _kvm_syserr(kd, kd->program, "_kvm_kvatop: lseek pde_pa");
+ _kvm_err(kd, kd->program, "_kvm_kvatop: lseek pde_pa");
goto invalid;
}
if (read(kd->pmfd, &pde, sizeof pde) != sizeof pde) {
_kvm_syserr(kd, kd->program, "_kvm_kvatop: read pde");
goto invalid;
}
- if (((u_long)pde & PG_V) == 0)
+ if (((u_long)pde & PG_V) == 0) {
+ _kvm_err(kd, kd->program, "_kvm_kvatop: pde not valid");
goto invalid;
+ }
if ((u_long)pde & PG_PS) {
/*
@@ -281,9 +289,13 @@
*/
#define PAGE2M_MASK (NBPDR - 1)
#define PG_FRAME2M (~PAGE2M_MASK)
- *pa = ((u_long)pde & PG_FRAME2M) + (va & PAGE2M_MASK);
- _kvm_pa2off(kd, *pa, pa);
- return (NBPDR - (va & PAGE2M_MASK));
+ a = ((u_long)pde & PG_FRAME2M) + (va & PAGE2M_MASK);
+ s = _kvm_pa2off(kd, a, pa);
+ if (s == 0) {
+ _kvm_err(kd, kd->program, "_kvm_kvatop: 2MB page address not in dump");
+ goto invalid;
+ } else
+ return (NBPDR - (va & PAGE2M_MASK));
}
pteindex = (va >> PAGE_SHIFT) & (NPTEPG-1);
@@ -291,7 +303,7 @@
s = _kvm_pa2off(kd, pte_pa, &ofs);
if (s <= sizeof pte) {
- _kvm_syserr(kd, kd->program, "_kvm_kvatop: pte_pa not found");
+ _kvm_err(kd, kd->program, "_kvm_kvatop: pte_pa not found");
goto invalid;
}
if (lseek(kd->pmfd, ofs, 0) == -1) {
@@ -302,14 +314,20 @@
_kvm_syserr(kd, kd->program, "_kvm_kvatop: read");
goto invalid;
}
- if (((u_long)pte & PG_V) == 0)
+ if (((u_long)pte & PG_V) == 0) {
+ _kvm_err(kd, kd->program, "_kvm_kvatop: pte not valid");
goto invalid;
+ }
- *pa = ((u_long)pte & PG_FRAME) + offset;
- _kvm_pa2off(kd, *pa, pa);
- return (PAGE_SIZE - offset);
+ a = ((u_long)pte & PG_FRAME) + offset;
+ s = _kvm_pa2off(kd, a, pa);
+ if (s == 0) {
+ _kvm_err(kd, kd->program, "_kvm_kvatop: address not in dump");
+ goto invalid;
+ } else
+ return (PAGE_SIZE - offset);
invalid:
- _kvm_err(kd, 0, "invalid address (%x)", va);
+ _kvm_err(kd, 0, "invalid address (0x%lx)", (unsigned long)va);
return (0);
}
More information about the p4-projects
mailing list