arm64: Sync icache when creating executable superpage mappings
Reviewed by: andrew, kib, markj MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D31181
This commit is contained in:
parent
a535413556
commit
7fb152d229
@ -4041,7 +4041,7 @@ pmap_enter_2mpage(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
|
||||
if (pmap != kernel_pmap)
|
||||
new_l2 |= ATTR_S1_nG;
|
||||
return (pmap_enter_l2(pmap, va, new_l2, PMAP_ENTER_NOSLEEP |
|
||||
PMAP_ENTER_NOREPLACE | PMAP_ENTER_NORECLAIM, NULL, lockp) ==
|
||||
PMAP_ENTER_NOREPLACE | PMAP_ENTER_NORECLAIM, m, lockp) ==
|
||||
KERN_SUCCESS);
|
||||
}
|
||||
|
||||
@ -4071,8 +4071,6 @@ pmap_every_pte_zero(vm_paddr_t pa)
|
||||
* KERN_RESOURCE_SHORTAGE if PMAP_ENTER_NOSLEEP was specified and a page table
|
||||
* page allocation failed. Returns KERN_RESOURCE_SHORTAGE if
|
||||
* PMAP_ENTER_NORECLAIM was specified and a PV entry allocation failed.
|
||||
*
|
||||
* The parameter "m" is only used when creating a managed, writeable mapping.
|
||||
*/
|
||||
static int
|
||||
pmap_enter_l2(pmap_t pmap, vm_offset_t va, pd_entry_t new_l2, u_int flags,
|
||||
@ -4159,6 +4157,16 @@ pmap_enter_l2(pmap_t pmap, vm_offset_t va, pd_entry_t new_l2, u_int flags,
|
||||
pmap->pm_stats.wired_count += L2_SIZE / PAGE_SIZE;
|
||||
pmap->pm_stats.resident_count += L2_SIZE / PAGE_SIZE;
|
||||
|
||||
/*
|
||||
* Conditionally sync the icache. See pmap_enter() for details.
|
||||
*/
|
||||
if ((new_l2 & ATTR_S1_XN) == 0 && ((new_l2 & ~ATTR_MASK) !=
|
||||
(old_l2 & ~ATTR_MASK) || (old_l2 & ATTR_S1_XN) != 0) &&
|
||||
pmap != kernel_pmap && m->md.pv_memattr == VM_MEMATTR_WRITE_BACK) {
|
||||
cpu_icache_sync_range(PHYS_TO_DMAP(new_l2 & ~ATTR_MASK),
|
||||
L2_SIZE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Map the superpage.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user