version 1.31, 2010/09/19 02:07:00 |
version 1.32, 2010/09/20 23:23:16 |
Line 81 static int nptesg; /* [sun4/sun4c] only |
|
Line 81 static int nptesg; /* [sun4/sun4c] only |
|
#undef VA_OFF |
#undef VA_OFF |
#define VA_OFF(va) (va & (kd->nbpg - 1)) |
#define VA_OFF(va) (va & (kd->nbpg - 1)) |
|
|
int _kvm_kvatop44c(kvm_t *, u_long, u_long *); |
int _kvm_kvatop44c(kvm_t *, vaddr_t, paddr_t *); |
int _kvm_kvatop4m (kvm_t *, u_long, u_long *); |
int _kvm_kvatop4m (kvm_t *, vaddr_t, paddr_t *); |
int _kvm_kvatop4u (kvm_t *, u_long, u_long *); |
int _kvm_kvatop4u (kvm_t *, vaddr_t, paddr_t *); |
|
|
/* |
/* |
* XXX |
* XXX |
Line 152 _kvm_initvtop(kvm_t *kd) |
|
Line 152 _kvm_initvtop(kvm_t *kd) |
|
* physical address. This routine is used only for crash dumps. |
* physical address. This routine is used only for crash dumps. |
*/ |
*/ |
int |
int |
_kvm_kvatop(kvm_t *kd, u_long va, u_long *pa) |
_kvm_kvatop(kvm_t *kd, vaddr_t va, paddr_t *pa) |
{ |
{ |
if (cputyp == -1) |
if (cputyp == -1) |
if (_kvm_initvtop(kd) != 0) |
if (_kvm_initvtop(kd) != 0) |
Line 176 _kvm_kvatop(kvm_t *kd, u_long va, u_long |
|
Line 176 _kvm_kvatop(kvm_t *kd, u_long va, u_long |
|
* (note: sun4 3-level MMU not yet supported) |
* (note: sun4 3-level MMU not yet supported) |
*/ |
*/ |
int |
int |
_kvm_kvatop44c(kvm_t *kd, u_long va, u_long *pa) |
_kvm_kvatop44c(kvm_t *kd, vaddr_t va, paddr_t *pa) |
{ |
{ |
int vr, vs, pte; |
int vr, vs, pte; |
sparc64_cpu_kcore_hdr_t *cpup = kd->cpu_data; |
sparc64_cpu_kcore_hdr_t *cpup = kd->cpu_data; |
Line 211 _kvm_kvatop44c(kvm_t *kd, u_long va, u_l |
|
Line 211 _kvm_kvatop44c(kvm_t *kd, u_long va, u_l |
|
goto err; |
goto err; |
pte = ptes[sp->sg_pmeg * nptesg + VA_VPG(va)]; |
pte = ptes[sp->sg_pmeg * nptesg + VA_VPG(va)]; |
if ((pte & PG_V) != 0) { |
if ((pte & PG_V) != 0) { |
long p, off = VA_OFF(va); |
paddr_t p, off = VA_OFF(va); |
|
|
p = (pte & PG_PFNUM) << pgshift; |
p = (pte & PG_PFNUM) << pgshift; |
*pa = p + off; |
*pa = p + off; |
return (kd->nbpg - off); |
return (kd->nbpg - off); |
} |
} |
err: |
err: |
_kvm_err(kd, 0, "invalid address (%lx)", va); |
_kvm_err(kd, 0, "invalid address (%#"PRIxVADDR")", va); |
return (0); |
return (0); |
} |
} |
|
|
int |
int |
_kvm_kvatop4m(kvm_t *kd, u_long va, u_long *pa) |
_kvm_kvatop4m(kvm_t *kd, vaddr_t va, paddr_t *pa) |
{ |
{ |
sparc64_cpu_kcore_hdr_t *cpup = kd->cpu_data; |
sparc64_cpu_kcore_hdr_t *cpup = kd->cpu_data; |
int vr, vs; |
int vr, vs; |
Line 260 _kvm_kvatop4m(kvm_t *kd, u_long va, u_lo |
|
Line 260 _kvm_kvatop4m(kvm_t *kd, u_long va, u_lo |
|
return (0); |
return (0); |
|
|
if (_kvm_pread(kd, kd->pmfd, &pte, sizeof(pte), foff) != sizeof(pte)) { |
if (_kvm_pread(kd, kd->pmfd, &pte, sizeof(pte), foff) != sizeof(pte)) { |
_kvm_syserr(kd, kd->program, "cannot read pte for %lx", va); |
_kvm_syserr(kd, kd->program, "cannot read pte for " |
|
"%#" PRIxVADDR, va); |
return (0); |
return (0); |
} |
} |
|
|
Line 272 _kvm_kvatop4m(kvm_t *kd, u_long va, u_lo |
|
Line 273 _kvm_kvatop4m(kvm_t *kd, u_long va, u_lo |
|
return (kd->nbpg - off); |
return (kd->nbpg - off); |
} |
} |
err: |
err: |
_kvm_err(kd, 0, "invalid address (%lx)", va); |
_kvm_err(kd, 0, "invalid address (%#"PRIxVADDR")", va); |
return (0); |
return (0); |
} |
} |
|
|
|
|
* sparc64 pmap's 32-bit page table format |
* sparc64 pmap's 32-bit page table format |
*/ |
*/ |
int |
int |
_kvm_kvatop4u(kvm_t *kd, u_long va, u_long *pa) |
_kvm_kvatop4u(kvm_t *kd, vaddr_t va, paddr_t *pa) |
{ |
{ |
sparc64_cpu_kcore_hdr_t *cpup = kd->cpu_data; |
sparc64_cpu_kcore_hdr_t *cpup = kd->cpu_data; |
int64_t **segmaps; |
int64_t **segmaps; |
Line 325 _kvm_kvatop4u(kvm_t *kd, u_long va, u_lo |
|
Line 326 _kvm_kvatop4u(kvm_t *kd, u_long va, u_lo |
|
* segmap[cpup->nsegmap]; |
* segmap[cpup->nsegmap]; |
*/ |
*/ |
segmaps = (int64_t **)((long)kd->cpu_data + cpup->segmapoffset); |
segmaps = (int64_t **)((long)kd->cpu_data + cpup->segmapoffset); |
/* XXX XXX XXX _kvm_pa2off takes u_long and returns off_t.. |
ptes = (int64_t *)(int)_kvm_pa2off(kd, |
should take off_t also!! */ |
(paddr_t)segmaps[sparc64_va_to_seg(va)]); |
|
|
ptes = (int64_t *)(int)_kvm_pa2off(kd, (u_long)segmaps[sparc64_va_to_seg(va)]); |
|
pte = ptes[sparc64_va_to_pte(va)]; |
pte = ptes[sparc64_va_to_pte(va)]; |
if ((pte & SPARC64_TLB_V) != 0) |
if ((pte & SPARC64_TLB_V) != 0) |
return ((pte & SPARC64_TLB_PA_MASK) | (va & (kd->nbpg - 1))); |
return ((pte & SPARC64_TLB_PA_MASK) | (va & (kd->nbpg - 1))); |
err: |
err: |
_kvm_err(kd, 0, "invalid address (%lx)", va); |
_kvm_err(kd, 0, "invalid address (%#"PRIxVADDR")", va); |
return (0); |
return (0); |
} |
} |
|
|
|
|
* Translate a physical address to a file-offset in the crash dump. |
* Translate a physical address to a file-offset in the crash dump. |
*/ |
*/ |
off_t |
off_t |
_kvm_pa2off(kvm_t *kd, u_long pa) |
_kvm_pa2off(kvm_t *kd, paddr_t pa) |
{ |
{ |
sparc64_cpu_kcore_hdr_t *cpup = kd->cpu_data; |
sparc64_cpu_kcore_hdr_t *cpup = kd->cpu_data; |
phys_ram_seg_t *mp; |
phys_ram_seg_t *mp; |