diff options
Diffstat (limited to 'arch/powerpc/kernel/traps.c')
| -rw-r--r-- | arch/powerpc/kernel/traps.c | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 9bdd79aa51cf..e59ec6d32d37 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -1516,6 +1516,22 @@ static void do_program_check(struct pt_regs *regs)  				return;  			}  		} + +		if (cpu_has_feature(CPU_FTR_DEXCR_NPHIE) && user_mode(regs)) { +			ppc_inst_t insn; + +			if (get_user_instr(insn, (void __user *)regs->nip)) { +				_exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip); +				return; +			} + +			if (ppc_inst_primary_opcode(insn) == 31 && +			    get_xop(ppc_inst_val(insn)) == OP_31_XOP_HASHCHK) { +				_exception(SIGILL, regs, ILL_ILLOPN, regs->nip); +				return; +			} +		} +  		_exception(SIGTRAP, regs, TRAP_BRKPT, regs->nip);  		return;  	}  |