void __kprobes do_protection_exception(struct pt_regs *regs) { unsigned long trans_exc_code; int fault; trans_exc_code = regs->int_parm_long; /* * Protection exceptions are suppressing, decrement psw address. * The exception to this rule are aborted transactions, for these * the PSW already points to the correct location. */ if (!(regs->int_code & 0x200)) regs->psw.addr = __rewind_psw(regs->psw, regs->int_code >> 16); /* * Check for low-address protection. This needs to be treated * as a special case because the translation exception code * field is not guaranteed to contain valid data in this case. */ if (unlikely(!(trans_exc_code & 4))) { do_low_address(regs); return; } fault = do_exception(regs, VM_WRITE); if (unlikely(fault)) do_fault_error(regs, fault); }
void do_protection_exception(struct pt_regs *regs) { unsigned long trans_exc_code; int access, fault; trans_exc_code = regs->int_parm_long; /* * Protection exceptions are suppressing, decrement psw address. * The exception to this rule are aborted transactions, for these * the PSW already points to the correct location. */ if (!(regs->int_code & 0x200)) regs->psw.addr = __rewind_psw(regs->psw, regs->int_code >> 16); /* * Check for low-address protection. This needs to be treated * as a special case because the translation exception code * field is not guaranteed to contain valid data in this case. */ if (unlikely(!(trans_exc_code & 4))) { do_low_address(regs); return; } if (unlikely(MACHINE_HAS_NX && (trans_exc_code & 0x80))) { regs->int_parm_long = (trans_exc_code & ~PAGE_MASK) | (regs->psw.addr & PAGE_MASK); access = VM_EXEC; fault = VM_FAULT_BADACCESS; } else { access = VM_WRITE; fault = do_exception(regs, access); } if (unlikely(fault)) do_fault_error(regs, access, fault); }
void __kprobes do_dat_exception(struct pt_regs *regs) { int access, fault; access = VM_READ | VM_EXEC | VM_WRITE; fault = do_exception(regs, access); if (unlikely(fault)) do_fault_error(regs, fault); }
void __kprobes do_dat_exception(struct pt_regs *regs, long pgm_int_code, unsigned long trans_exc_code) { int access, fault; access = VM_READ | VM_EXEC | VM_WRITE; fault = do_exception(regs, access, trans_exc_code); if (unlikely(fault)) do_fault_error(regs, pgm_int_code & 255, trans_exc_code, fault); }
void __kprobes do_protection_exception(struct pt_regs *regs) { unsigned long trans_exc_code; int fault; trans_exc_code = regs->int_parm_long; regs->psw.addr = __rewind_psw(regs->psw, regs->int_code >> 16); if (unlikely(!(trans_exc_code & 4))) { do_low_address(regs); return; } fault = do_exception(regs, VM_WRITE); if (unlikely(fault)) do_fault_error(regs, fault); }
void __kprobes do_protection_exception(struct pt_regs *regs, long pgm_int_code, unsigned long trans_exc_code) { int fault; /* Protection exception is suppressing, decrement psw address. */ regs->psw.addr -= (pgm_int_code >> 16); /* * Check for low-address protection. This needs to be treated * as a special case because the translation exception code * field is not guaranteed to contain valid data in this case. */ if (unlikely(!(trans_exc_code & 4))) { do_low_address(regs, pgm_int_code, trans_exc_code); return; } fault = do_exception(regs, VM_WRITE, trans_exc_code); if (unlikely(fault)) do_fault_error(regs, 4, trans_exc_code, fault); }