svn commit: r224663 - head/sys/ia64/ia64
Marcel Moolenaar
marcel at FreeBSD.org
Fri Aug 5 23:10:48 UTC 2011
Author: marcel
Date: Fri Aug 5 23:10:47 2011
New Revision: 224663
URL: http://svn.freebsd.org/changeset/base/224663
Log:
Follow-up commit: refactor pmap_kextract() to make it easier to
catch and debug issues like the one fixed in the previous commit:
Replace all return statements with goto statements so that we end
up at a single place with a value for the physical address.
Print a message for all unknown KVA addresses.
Approved by: re (blanket)
Modified:
head/sys/ia64/ia64/pmap.c
Modified: head/sys/ia64/ia64/pmap.c
==============================================================================
--- head/sys/ia64/ia64/pmap.c Fri Aug 5 23:05:46 2011 (r224662)
+++ head/sys/ia64/ia64/pmap.c Fri Aug 5 23:10:47 2011 (r224663)
@@ -1217,43 +1217,54 @@ pmap_kextract(vm_offset_t va)
{
struct ia64_lpte *pte;
uint64_t *pbvm_pgtbl;
+ vm_paddr_t pa;
u_int idx;
KASSERT(va >= VM_MAXUSER_ADDRESS, ("Must be kernel VA"));
/* Regions 6 and 7 are direct mapped. */
- if (va >= IA64_RR_BASE(6))
- return (IA64_RR_MASK(va));
+ if (va >= IA64_RR_BASE(6)) {
+ pa = IA64_RR_MASK(va);
+ goto out;
+ }
- /* Bail out if the virtual address is beyond our limits. */
+ /* Region 5 is our KVA. Bail out if the VA is beyond our limits. */
if (va >= kernel_vm_end)
- return (0);
-
+ goto err_out;
if (va >= VM_MIN_KERNEL_ADDRESS) {
pte = pmap_find_kpte(va);
- return (pmap_present(pte) ? pmap_ppn(pte)|(va&PAGE_MASK) : 0);
+ pa = pmap_present(pte) ? pmap_ppn(pte) | (va & PAGE_MASK) : 0;
+ goto out;
}
- /* PBVM page table. */
+ /* The PBVM page table. */
if (va >= IA64_PBVM_PGTBL + bootinfo->bi_pbvm_pgtblsz)
- return (0);
- if (va >= IA64_PBVM_PGTBL)
- return (va - IA64_PBVM_PGTBL) + bootinfo->bi_pbvm_pgtbl;
+ goto err_out;
+ if (va >= IA64_PBVM_PGTBL) {
+ pa = (va - IA64_PBVM_PGTBL) + bootinfo->bi_pbvm_pgtbl;
+ goto out;
+ }
- /* PBVM. */
+ /* The PBVM itself. */
if (va >= IA64_PBVM_BASE) {
pbvm_pgtbl = (void *)IA64_PBVM_PGTBL;
idx = (va - IA64_PBVM_BASE) >> IA64_PBVM_PAGE_SHIFT;
if (idx >= (bootinfo->bi_pbvm_pgtblsz >> 3))
- return (0);
+ goto err_out;
if ((pbvm_pgtbl[idx] & PTE_PRESENT) == 0)
- return (0);
- return ((pbvm_pgtbl[idx] & PTE_PPN_MASK) +
- (va & IA64_PBVM_PAGE_MASK));
+ goto err_out;
+ pa = (pbvm_pgtbl[idx] & PTE_PPN_MASK) +
+ (va & IA64_PBVM_PAGE_MASK);
+ goto out;
}
- printf("XXX: %s: va=%#lx\n", __func__, va);
- return (0);
+ err_out:
+ printf("XXX: %s: va=%#lx is invalid\n", __func__, va);
+ pa = 0;
+ /* FALLTHROUGH */
+
+ out:
+ return (pa);
}
/*
More information about the svn-src-all
mailing list