Date: Fri, 5 Aug 2011 23:10:48 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r224663 - head/sys/ia64/ia64 Message-ID: <201108052310.p75NAm3C024979@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201108052310.p75NAm3C024979>