From 7cd4e55c43e376027cf8b99f3069e49fb8b37c11 Mon Sep 17 00:00:00 2001 From: Justin Hibbits Date: Fri, 15 Dec 2017 04:11:20 +0000 Subject: [PATCH] Handle the Facility Unavailable exception as a SIGILL Currently Facility Unavailable is absent and once an application tries to use or access a register from a feature disabled in the CPU it causes a kernel panic. A simple test-case is: int main() { asm volatile ("tbegin.;"); } which will use TM (Hardware Transactional Memory) feature which is not supported by the kernel and so will trigger the following kernel panic: ---- fatal user trap: exception = 0xf60 (unknown) srr0 = 0x10000890 srr1 = 0x800000000000f032 lr = 0x100004e4 curthread = 0x5f93000 pid = 1021, comm = htm panic: unknown trap cpuid = 40 KDB: stack backtrace: Uptime: 3m18s Dumping 10 MB (3 chunks) chunk 0: 11MB (2648 pages) ... ok chunk 1: 1MB (24 pages) ... ok chunk 2: 1MB (2 pages)panic: IOMMU mapping error: -4 cpuid = 40 Uptime: 3m18s ---- Since Hardware Transactional Memory is not yet supported by FreeBSD, treat this as an illegal instruction. PR: 224350 Submitted by: Gustavo Romero MFC after: 2 weeks --- sys/powerpc/include/trap.h | 3 +++ sys/powerpc/powerpc/trap.c | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/sys/powerpc/include/trap.h b/sys/powerpc/include/trap.h index 22bb0d252be..a8164d0f72e 100644 --- a/sys/powerpc/include/trap.h +++ b/sys/powerpc/include/trap.h @@ -80,6 +80,9 @@ #define EXC_HEA 0x0e40 /* Hypervisor Emulation Assistance */ #define EXC_VSX 0x0f40 /* VSX Unavailable */ +/* Power ISA 2.07+: */ +#define EXC_FAC 0x0f60 /* Facility Unavailable */ + /* The following are available on 4xx and 85xx */ #define EXC_CRIT 0x0100 /* Critical Input Interrupt */ #define EXC_PIT 0x1000 /* Programmable Interval Timer */ diff --git a/sys/powerpc/powerpc/trap.c b/sys/powerpc/powerpc/trap.c index 7c119301003..c72b631cca4 100644 --- a/sys/powerpc/powerpc/trap.c +++ b/sys/powerpc/powerpc/trap.c @@ -135,6 +135,7 @@ static struct powerpc_exception powerpc_exceptions[] = { { EXC_PERF, "performance monitoring" }, { EXC_VEC, "altivec unavailable" }, { EXC_VSX, "vsx unavailable" }, + { EXC_FAC, "facility unavailable" }, { EXC_ITMISS, "instruction tlb miss" }, { EXC_DLMISS, "data load tlb miss" }, { EXC_DSMISS, "data store tlb miss" }, @@ -279,6 +280,11 @@ trap(struct trapframe *frame) enable_fpu(td); break; + case EXC_FAC: + sig = SIGILL; + ucode = ILL_ILLOPC; + break; + case EXC_VECAST_E: case EXC_VECAST_G4: case EXC_VECAST_G5: