]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/i386/pmap.c
xnu-1504.9.17.tar.gz
[apple/xnu.git] / osfmk / i386 / pmap.c
index e7135803a95343ebf4eff3c910988db77b1d2677..fc2147d4b01217ffe0d8bc3ec0f9ca2b7ce2ab96 100644 (file)
@@ -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)) {