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
{
/*
* 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.
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,
memset((char *)addr, 0, s);
+ vaddr = addr;
+ vsize = s;
+
#if PV_DEBUG
if (0 == npvhash) panic("npvhash not initialized");
#endif
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,
*/
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);
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)) {
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)) {
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)) {