On Thu, Jul 23, 2015 at 11:15:15AM +0100, James Hogan wrote: > On 23/07/15 10:10, Ralf Baechle wrote: > > Without this we end taking execeptions in an endless loop hanging the > > thread. > > A little more explanation would be nice. Under what situations does this > occur? Does this mean any VM_EXEC and !VM_READ page can't actually be > faulted in without it being treated as an RI violation, or does it only > affect when read from kernel emulation code? > > - if (!(vma->vm_flags & VM_READ)) { > > + if (!(vma->vm_flags & VM_READ) && > > + exception_epc(regs) != address) { > > #if 0 > > pr_notice("Cpu%d[%s:%d:%0*lx:%ld:%0*lx] RI violation\n", > > raw_smp_processor_id(), > > > The general idea is the change the code to treat loads of an instruction just like an instruction fetch. Which is achieved by adding the second condition "exception_epc(regs) != address" to the if above. exception_epc(regs) == address means It would all be easier if Linux was enabling the separate exception codes for read and execution failure but short of that, a test like above must provide if a fault was an attempted instruction fetch or happend fetching data. Ralf