svn commit: r326870 - in head/sys/powerpc: include powerpc

Justin Hibbits jhibbits at FreeBSD.org
Fri Dec 15 04:11:21 UTC 2017


Author: jhibbits
Date: Fri Dec 15 04:11:20 2017
New Revision: 326870
URL: https://svnweb.freebsd.org/changeset/base/326870

Log:
  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 <gromero_AT_ibm_DOT_com>
  MFC after:	2 weeks

Modified:
  head/sys/powerpc/include/trap.h
  head/sys/powerpc/powerpc/trap.c

Modified: head/sys/powerpc/include/trap.h
==============================================================================
--- head/sys/powerpc/include/trap.h	Fri Dec 15 03:46:52 2017	(r326869)
+++ head/sys/powerpc/include/trap.h	Fri Dec 15 04:11:20 2017	(r326870)
@@ -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 */

Modified: head/sys/powerpc/powerpc/trap.c
==============================================================================
--- head/sys/powerpc/powerpc/trap.c	Fri Dec 15 03:46:52 2017	(r326869)
+++ head/sys/powerpc/powerpc/trap.c	Fri Dec 15 04:11:20 2017	(r326870)
@@ -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" },
@@ -277,6 +278,11 @@ trap(struct trapframe *frame)
 				save_fpu(td);
 			td->td_pcb->pcb_flags |= PCB_VSX;
 			enable_fpu(td);
+			break;
+
+		case EXC_FAC:
+			sig = SIGILL;
+			ucode =	ILL_ILLOPC;
 			break;
 
 		case EXC_VECAST_E:


More information about the svn-src-all mailing list