summaryrefslogtreecommitdiffstats
path: root/lib/libkvm/kvm_sparc64.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libkvm/kvm_sparc64.c')
-rw-r--r--lib/libkvm/kvm_sparc64.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/lib/libkvm/kvm_sparc64.c b/lib/libkvm/kvm_sparc64.c
index 081ddf8..167d1f4 100644
--- a/lib/libkvm/kvm_sparc64.c
+++ b/lib/libkvm/kvm_sparc64.c
@@ -64,6 +64,7 @@ static char sccsid[] = "@(#)kvm_hp300.c 8.1 (Berkeley) 6/4/93";
#include <machine/kerneldump.h>
#include <machine/tte.h>
+#include <machine/tlb.h>
#include <machine/tsb.h>
#include <limits.h>
@@ -198,17 +199,21 @@ _kvm_kvatop(kvm_t *kd, u_long va, u_long *pa)
u_long pg_off, vpn;
int rest;
- vpn = btop(va);
pg_off = va & PAGE_MASK;
- tte_off = kd->vmst->vm_tsb_off +
- ((vpn & kd->vmst->vm_tsb_mask) << TTE_SHIFT);
-
- if (!_kvm_read_phys(kd, tte_off, &tte, sizeof(tte)))
- goto invalid;
- if (!tte_match(&tte, va))
- goto invalid;
+ if (va >= VM_MIN_DIRECT_ADDRESS)
+ pa_off = TLB_DIRECT_TO_PHYS(va) & ~PAGE_MASK;
+ else {
+ vpn = btop(va);
+ tte_off = kd->vmst->vm_tsb_off +
+ ((vpn & kd->vmst->vm_tsb_mask) << TTE_SHIFT);
+ if (!_kvm_read_phys(kd, tte_off, &tte, sizeof(tte)))
+ goto invalid;
+ if (!tte_match(&tte, va))
+ goto invalid;
+ pa_off = TTE_GET_PA(&tte);
+ }
rest = PAGE_SIZE - pg_off;
- pa_off = _kvm_find_off(kd->vmst, TTE_GET_PA(&tte), rest);
+ pa_off = _kvm_find_off(kd->vmst, pa_off, rest);
if (pa_off == KVM_OFF_NOTFOUND)
goto invalid;
*pa = pa_off + pg_off;
OpenPOWER on IntegriCloud