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) | \
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to