sparc64: Add HV fault type handlers for ADI related faults

ADI (Application Data Integrity) feature on M7 and newer processors
adds new fault types for hypervisor - Invalid ASI and MCD disabled.
This patch expands data access exception handler to handle these
faults.

Signed-off-by: Khalid Aziz <khalid.aziz@oracle.com>
Cc: Khalid Aziz <khalid@gonehiking.org>
Reviewed-by: Anthony Yznaga <anthony.yznaga@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Khalid Aziz 2018-02-21 10:15:46 -07:00 committed by David S. Miller
parent 750375003d
commit 52df948d1b

View File

@ -397,12 +397,35 @@ void sun4v_data_access_exception(struct pt_regs *regs, unsigned long addr, unsig
if (is_no_fault_exception(regs))
return;
info.si_signo = SIGSEGV;
/* MCD (Memory Corruption Detection) disabled trap (TT=0x19) in HV
* is vectored thorugh data access exception trap with fault type
* set to HV_FAULT_TYPE_MCD_DIS. Check for MCD disabled trap.
* Accessing an address with invalid ASI for the address, for
* example setting an ADI tag on an address with ASI_MCD_PRIMARY
* when TTE.mcd is not set for the VA, is also vectored into
* kerbel by HV as data access exception with fault type set to
* HV_FAULT_TYPE_INV_ASI.
*/
info.si_errno = 0;
info.si_code = SEGV_MAPERR;
info.si_addr = (void __user *) addr;
info.si_trapno = 0;
force_sig_info(SIGSEGV, &info, current);
switch (type) {
case HV_FAULT_TYPE_INV_ASI:
info.si_signo = SIGILL;
info.si_code = ILL_ILLADR;
force_sig_info(SIGILL, &info, current);
break;
case HV_FAULT_TYPE_MCD_DIS:
info.si_signo = SIGSEGV;
info.si_code = SEGV_ACCADI;
force_sig_info(SIGSEGV, &info, current);
break;
default:
info.si_signo = SIGSEGV;
info.si_code = SEGV_MAPERR;
force_sig_info(SIGSEGV, &info, current);
break;
}
}
void sun4v_data_access_exception_tl1(struct pt_regs *regs, unsigned long addr, unsigned long type_ctx)