|
@@ -389,17 +389,6 @@ good_area:
|
|
|
#endif /* CONFIG_8xx */
|
|
|
|
|
|
if (is_exec) {
|
|
|
-#ifdef CONFIG_PPC_STD_MMU
|
|
|
- /* Protection fault on exec go straight to failure on
|
|
|
- * Hash based MMUs as they either don't support per-page
|
|
|
- * execute permission, or if they do, it's handled already
|
|
|
- * at the hash level. This test would probably have to
|
|
|
- * be removed if we change the way this works to make hash
|
|
|
- * processors use the same I/D cache coherency mechanism
|
|
|
- * as embedded.
|
|
|
- */
|
|
|
-#endif /* CONFIG_PPC_STD_MMU */
|
|
|
-
|
|
|
/*
|
|
|
* Allow execution from readable areas if the MMU does not
|
|
|
* provide separate controls over reading and executing.
|
|
@@ -414,6 +403,14 @@ good_area:
|
|
|
(cpu_has_feature(CPU_FTR_NOEXECUTE) ||
|
|
|
!(vma->vm_flags & (VM_READ | VM_WRITE))))
|
|
|
goto bad_area;
|
|
|
+#ifdef CONFIG_PPC_STD_MMU
|
|
|
+ /*
|
|
|
+ * protfault should only happen due to us
|
|
|
+ * mapping a region readonly temporarily. PROT_NONE
|
|
|
+ * is also covered by the VMA check above.
|
|
|
+ */
|
|
|
+ WARN_ON_ONCE(error_code & DSISR_PROTFAULT);
|
|
|
+#endif /* CONFIG_PPC_STD_MMU */
|
|
|
/* a write */
|
|
|
} else if (is_write) {
|
|
|
if (!(vma->vm_flags & VM_WRITE))
|
|
@@ -423,6 +420,7 @@ good_area:
|
|
|
} else {
|
|
|
if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE)))
|
|
|
goto bad_area;
|
|
|
+ WARN_ON_ONCE(error_code & DSISR_PROTFAULT);
|
|
|
}
|
|
|
|
|
|
/*
|