aboutsummaryrefslogtreecommitdiffstats
path: root/libsigsegv/src/fault-linux-m68k.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsigsegv/src/fault-linux-m68k.c')
-rw-r--r--libsigsegv/src/fault-linux-m68k.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/libsigsegv/src/fault-linux-m68k.c b/libsigsegv/src/fault-linux-m68k.c
new file mode 100644
index 00000000..8562e30e
--- /dev/null
+++ b/libsigsegv/src/fault-linux-m68k.c
@@ -0,0 +1,44 @@
+/* Fault handler information subroutine. Linux/m68k version.
+ * Taken from gcc-3.2/boehm-gc/os_dep.c.
+ *
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+static void *
+get_fault_addr (struct sigcontext *scp)
+{
+ int format = (scp->sc_formatvec >> 12) & 0xf;
+ unsigned long *framedata = (unsigned long *) (scp + 1);
+ unsigned long ea;
+
+ switch (format)
+ {
+ case 10: case 11: /* 68020/030 */
+ ea = framedata[2];
+ return (void *) ea;
+ case 7: /* 68040 */
+ ea = framedata[3];
+ break;
+ case 4: /* 68060 */
+ ea = framedata[0];
+ break;
+ default:
+ return (void *) 0;
+ }
+ if (framedata[1] & 0x08000000)
+ /* Correct addr on misaligned access. */
+ ea = (ea + 4095) & ~4095;
+ return (void *) ea;
+}