Dynamically adjust to the value of KERNBASE in a crashdump, with

a fallback for old kernels without the "kernbase" symbol.
This commit is contained in:
Peter Wemm 2001-08-24 08:53:30 +00:00
parent c1c2006ca7
commit f85f304006
2 changed files with 24 additions and 4 deletions

View File

@ -93,6 +93,7 @@ _kvm_initvtop(kvm_t *kd)
struct vmstate *vm; struct vmstate *vm;
struct nlist nlist[2]; struct nlist nlist[2];
u_long pa; u_long pa;
u_long kernbase;
pd_entry_t *PTD; pd_entry_t *PTD;
vm = (struct vmstate *)_kvm_malloc(kd, sizeof(*vm)); vm = (struct vmstate *)_kvm_malloc(kd, sizeof(*vm));
@ -103,14 +104,23 @@ _kvm_initvtop(kvm_t *kd)
kd->vmst = vm; kd->vmst = vm;
vm->PTD = 0; vm->PTD = 0;
nlist[0].n_name = "_IdlePTD"; nlist[0].n_name = "kernbase";
nlist[1].n_name = 0;
if (kvm_nlist(kd, nlist) != 0)
kernbase = KERNBASE; /* for old kernels */
else
kernbase = nlist[0].n_value;
nlist[0].n_name = "IdlePTD";
nlist[1].n_name = 0; nlist[1].n_name = 0;
if (kvm_nlist(kd, nlist) != 0) { if (kvm_nlist(kd, nlist) != 0) {
_kvm_err(kd, kd->program, "bad namelist"); _kvm_err(kd, kd->program, "bad namelist");
return (-1); 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"); _kvm_err(kd, kd->program, "cannot read IdlePTD");
return (-1); return (-1);
} }

View File

@ -93,6 +93,7 @@ _kvm_initvtop(kvm_t *kd)
struct vmstate *vm; struct vmstate *vm;
struct nlist nlist[2]; struct nlist nlist[2];
u_long pa; u_long pa;
u_long kernbase;
pd_entry_t *PTD; pd_entry_t *PTD;
vm = (struct vmstate *)_kvm_malloc(kd, sizeof(*vm)); vm = (struct vmstate *)_kvm_malloc(kd, sizeof(*vm));
@ -103,14 +104,23 @@ _kvm_initvtop(kvm_t *kd)
kd->vmst = vm; kd->vmst = vm;
vm->PTD = 0; vm->PTD = 0;
nlist[0].n_name = "_IdlePTD"; nlist[0].n_name = "kernbase";
nlist[1].n_name = 0;
if (kvm_nlist(kd, nlist) != 0)
kernbase = KERNBASE; /* for old kernels */
else
kernbase = nlist[0].n_value;
nlist[0].n_name = "IdlePTD";
nlist[1].n_name = 0; nlist[1].n_name = 0;
if (kvm_nlist(kd, nlist) != 0) { if (kvm_nlist(kd, nlist) != 0) {
_kvm_err(kd, kd->program, "bad namelist"); _kvm_err(kd, kd->program, "bad namelist");
return (-1); 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"); _kvm_err(kd, kd->program, "cannot read IdlePTD");
return (-1); return (-1);
} }