svn commit: r261917 - in head/sys/arm: arm include
Zbigniew Bodek
zbb at FreeBSD.org
Sat Feb 15 13:13:01 UTC 2014
Author: zbb
Date: Sat Feb 15 13:13:00 2014
New Revision: 261917
URL: http://svnweb.freebsd.org/changeset/base/261917
Log:
Always clear L1 PTE descriptor when removing superpage on ARM
Invalidate L1 PTE regardles of existance of the corresponding
l2_bucket. This is relevant when superpage is entered via
pmap_enter_object() and will fix crash on entering page
in place of not properly removed superpage.
Modified:
head/sys/arm/arm/pmap-v6.c
head/sys/arm/include/pmap.h
Modified: head/sys/arm/arm/pmap-v6.c
==============================================================================
--- head/sys/arm/arm/pmap-v6.c Sat Feb 15 12:37:26 2014 (r261916)
+++ head/sys/arm/arm/pmap-v6.c Sat Feb 15 13:13:00 2014 (r261917)
@@ -3700,13 +3700,14 @@ pmap_remove_section(pmap_t pmap, vm_offs
KASSERT(l2b->l2b_occupancy == L2_PTE_NUM_TOTAL,
("pmap_remove_section: l2_bucket occupancy error"));
pmap_free_l2_bucket(pmap, l2b, L2_PTE_NUM_TOTAL);
- /*
- * Now invalidate L1 slot as it was not invalidated in
- * pmap_free_l2_bucket() due to L1_TYPE mismatch.
- */
- *pl1pd = 0;
- PTE_SYNC(pl1pd);
}
+ /* Now invalidate L1 slot */
+ *pl1pd = 0;
+ PTE_SYNC(pl1pd);
+ if (L1_S_EXECUTABLE(l1pd))
+ cpu_tlb_flushID_SE(sva);
+ else
+ cpu_tlb_flushD_SE(sva);
}
/*
Modified: head/sys/arm/include/pmap.h
==============================================================================
--- head/sys/arm/include/pmap.h Sat Feb 15 12:37:26 2014 (r261916)
+++ head/sys/arm/include/pmap.h Sat Feb 15 13:13:00 2014 (r261917)
@@ -527,6 +527,7 @@ extern int pmap_needs_pte_sync;
#define L1_S_PROT_MASK (L1_S_PROT_W|L1_S_PROT_U)
#define L1_S_REF (L1_S_AP(AP_REF)) /* Reference flag */
#define L1_S_WRITABLE(pd) (!((pd) & L1_S_PROT_W))
+#define L1_S_EXECUTABLE(pd) (!((pd) & L1_S_XN))
#define L1_S_REFERENCED(pd) ((pd) & L1_S_REF)
#define L1_S_PROT(ku, pr) (((((ku) == PTE_KERNEL) ? 0 : L1_S_PROT_U) | \
More information about the svn-src-all
mailing list