X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/d1ecb069dfe24481e4a83f44cb5217a2b06746d7..0b4c1975fb5e4eccf1012a35081f7e7799b81046:/osfmk/i386/pmap.c diff --git a/osfmk/i386/pmap.c b/osfmk/i386/pmap.c index e7135803a..fc2147d4b 100644 --- a/osfmk/i386/pmap.c +++ b/osfmk/i386/pmap.c @@ -273,12 +273,9 @@ static vm_object_t kptobj; char *pmap_phys_attributes; unsigned int last_managed_page = 0; -/* - * Physical page attributes. Copy bits from PTE definition. - */ -#define PHYS_MODIFIED INTEL_PTE_MOD /* page modified */ -#define PHYS_REFERENCED INTEL_PTE_REF /* page referenced */ -#define PHYS_MANAGED INTEL_PTE_VALID /* page is managed */ +extern ppnum_t lowest_lo; +extern ppnum_t lowest_hi; +extern ppnum_t highest_hi; /* * Amount of virtual memory mapped by one @@ -677,13 +674,7 @@ pmap_cpu_init(void) { /* * Here early in the life of a processor (from cpu_mode_init()). - * If we're not in 64-bit mode, enable the global TLB feature. - * Note: regardless of mode we continue to set the global attribute - * bit in ptes for all (32-bit) global pages such as the commpage. */ - if (!cpu_64bit) { - set_cr4(get_cr4() | CR4_PGE); - } /* * Initialize the per-cpu, TLB-related fields. @@ -1037,11 +1028,11 @@ pmap_virtual_space( void pmap_init(void) { - register long npages; - vm_offset_t addr; - register vm_size_t s; - vm_map_offset_t vaddr; - ppnum_t ppn; + long npages; + vm_map_offset_t vaddr; + vm_offset_t addr; + vm_size_t s, vsize; + ppnum_t ppn; /* * Allocate memory for the pv_head_table and its lock bits, @@ -1068,6 +1059,9 @@ pmap_init(void) memset((char *)addr, 0, s); + vaddr = addr; + vsize = s; + #if PV_DEBUG if (0 == npvhash) panic("npvhash not initialized"); #endif @@ -1105,11 +1099,24 @@ pmap_init(void) if (pn > last_managed_page) last_managed_page = pn; + + if (pn < lowest_lo) + pmap_phys_attributes[pn] |= PHYS_NOENCRYPT; + else if (pn >= lowest_hi && pn <= highest_hi) + pmap_phys_attributes[pn] |= PHYS_NOENCRYPT; } } } } } + while (vsize) { + ppn = pmap_find_phys(kernel_pmap, vaddr); + + pmap_phys_attributes[ppn] |= PHYS_NOENCRYPT; + + vaddr += PAGE_SIZE; + vsize -= PAGE_SIZE; + } /* * Create the zone of physical maps, @@ -1117,10 +1124,15 @@ pmap_init(void) */ s = (vm_size_t) sizeof(struct pmap); pmap_zone = zinit(s, 400*s, 4096, "pmap"); /* XXX */ + zone_change(pmap_zone, Z_NOENCRYPT, TRUE); + s = (vm_size_t) sizeof(struct pv_hashed_entry); pv_hashed_list_zone = zinit(s, 10000*s, 4096, "pv_list"); /* XXX */ + zone_change(pv_hashed_list_zone, Z_NOENCRYPT, TRUE); + s = 63; pdpt_zone = zinit(s, 400*s, 4096, "pdpt"); /* XXX */ + zone_change(pdpt_zone, Z_NOENCRYPT, TRUE); kptobj = &kptobj_object_store; _vm_object_allocate((vm_object_size_t)(NPGPTD*NPTDPG), kptobj); @@ -1845,6 +1857,7 @@ pmap_expand_pml4( OSAddAtomic(-1, &inuse_ptepages_count); return; } + pmap_set_noencrypt(pn); #if 0 /* DEBUG */ if (0 != vm_page_lookup(map->pm_obj_pml4, (vm_object_offset_t)i)) { @@ -1934,6 +1947,7 @@ pmap_expand_pdpt( OSAddAtomic(-1, &inuse_ptepages_count); return; } + pmap_set_noencrypt(pn); #if 0 /* DEBUG */ if (0 != vm_page_lookup(map->pm_obj_pdpt, (vm_object_offset_t)i)) { @@ -2046,6 +2060,7 @@ pmap_expand( OSAddAtomic(-1, &inuse_ptepages_count); return; } + pmap_set_noencrypt(pn); #if 0 /* DEBUG */ if (0 != vm_page_lookup(map->pm_obj, (vm_object_offset_t)i)) {