diff options
Diffstat (limited to 'arch/mips/mm/fault.c')
-rw-r--r-- | arch/mips/mm/fault.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c index e97a7a2fb2c0..b78f7d913ca4 100644 --- a/arch/mips/mm/fault.c +++ b/arch/mips/mm/fault.c | |||
@@ -99,8 +99,31 @@ good_area: | |||
99 | if (!(vma->vm_flags & VM_WRITE)) | 99 | if (!(vma->vm_flags & VM_WRITE)) |
100 | goto bad_area; | 100 | goto bad_area; |
101 | } else { | 101 | } else { |
102 | if (!(vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC))) | 102 | if (kernel_uses_smartmips_rixi) { |
103 | goto bad_area; | 103 | if (address == regs->cp0_epc && !(vma->vm_flags & VM_EXEC)) { |
104 | #if 0 | ||
105 | pr_notice("Cpu%d[%s:%d:%0*lx:%ld:%0*lx] XI violation\n", | ||
106 | raw_smp_processor_id(), | ||
107 | current->comm, current->pid, | ||
108 | field, address, write, | ||
109 | field, regs->cp0_epc); | ||
110 | #endif | ||
111 | goto bad_area; | ||
112 | } | ||
113 | if (!(vma->vm_flags & VM_READ)) { | ||
114 | #if 0 | ||
115 | pr_notice("Cpu%d[%s:%d:%0*lx:%ld:%0*lx] RI violation\n", | ||
116 | raw_smp_processor_id(), | ||
117 | current->comm, current->pid, | ||
118 | field, address, write, | ||
119 | field, regs->cp0_epc); | ||
120 | #endif | ||
121 | goto bad_area; | ||
122 | } | ||
123 | } else { | ||
124 | if (!(vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC))) | ||
125 | goto bad_area; | ||
126 | } | ||
104 | } | 127 | } |
105 | 128 | ||
106 | /* | 129 | /* |