X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/fe8ab488e9161c46dd9885d58fc52996dc0249ff..5c9f46613a83ebfc29a5b1f099448259e96a98f0:/osfmk/i386/pmap_common.c diff --git a/osfmk/i386/pmap_common.c b/osfmk/i386/pmap_common.c index ec05a97e2..9436719d4 100644 --- a/osfmk/i386/pmap_common.c +++ b/osfmk/i386/pmap_common.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2010 Apple Inc. All rights reserved. + * Copyright (c) 2000-2016 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -61,8 +61,11 @@ event_t mapping_replenish_event, pmap_user_pv_throttle_event; uint64_t pmap_pv_throttle_stat, pmap_pv_throttled_waiters; +int pmap_asserts_enabled = (DEBUG); +int pmap_asserts_traced = 0; + unsigned int pmap_cache_attributes(ppnum_t pn) { - if (pmap_get_cache_attributes(pn) & INTEL_PTE_NCACHE) + if (pmap_get_cache_attributes(pn, FALSE) & INTEL_PTE_NCACHE) return (VM_WIMG_IO); else return (VM_WIMG_COPYBACK); @@ -108,28 +111,67 @@ void pmap_set_cache_attributes(ppnum_t pn, unsigned int cacheattr) { } } -unsigned pmap_get_cache_attributes(ppnum_t pn) { +unsigned pmap_get_cache_attributes(ppnum_t pn, boolean_t is_ept) { if (last_managed_page == 0) return 0; - if (!IS_MANAGED_PAGE(ppn_to_pai(pn))) { - return INTEL_PTE_NCACHE; - } + if (!IS_MANAGED_PAGE(ppn_to_pai(pn))) + return PTE_NCACHE(is_ept); /* * The cache attributes are read locklessly for efficiency. */ unsigned int attr = pmap_phys_attributes[ppn_to_pai(pn)]; unsigned int template = 0; - - if (attr & PHYS_PTA) + + /* + * The PTA bit is currently unsupported for EPT PTEs. + */ + if ((attr & PHYS_PTA) && !is_ept) template |= INTEL_PTE_PTA; + + /* + * If the page isn't marked as NCACHE, the default for EPT entries + * is WB. + */ if (attr & PHYS_NCACHE) - template |= INTEL_PTE_NCACHE; + template |= PTE_NCACHE(is_ept); + else if (is_ept) + template |= INTEL_EPT_WB; + return template; } - +boolean_t +pmap_has_managed_page(ppnum_t first, ppnum_t last) +{ + ppnum_t pn, kdata_start, kdata_end; + boolean_t result; + boot_args * args; + + args = (boot_args *) PE_state.bootArgs; + + // Allow pages that the booter added to the end of the kernel. + // We may miss reporting some pages in this range that were freed + // with ml_static_free() + kdata_start = atop_32(args->kaddr); + kdata_end = atop_32(args->kaddr + args->ksize); + + assert(last_managed_page); + assert(first <= last); + + for (result = FALSE, pn = first; + !result + && (pn <= last) + && (pn <= last_managed_page); + pn++) + { + if ((pn >= kdata_start) && (pn < kdata_end)) continue; + result = (0 != (pmap_phys_attributes[pn] & PHYS_MANAGED)); + } + + return (result); +} boolean_t pmap_is_noencrypt(ppnum_t pn) @@ -312,7 +354,9 @@ unsigned pmap_kernel_reserve_replenish_stat; unsigned pmap_user_reserve_replenish_stat; unsigned pmap_kern_reserve_alloc_stat; -void mapping_replenish(void) +__attribute__((noreturn)) +void +mapping_replenish(void) { pv_hashed_entry_t pvh_e; pv_hashed_entry_t pvh_eh;