summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/m68k/m68k/sigreturn.s88
1 files changed, 88 insertions, 0 deletions
diff --git a/sys/arch/m68k/m68k/sigreturn.s b/sys/arch/m68k/m68k/sigreturn.s
new file mode 100644
index 00000000000..63017e36048
--- /dev/null
+++ b/sys/arch/m68k/m68k/sigreturn.s
@@ -0,0 +1,88 @@
+/* $OpenBSD: sigreturn.s,v 1.1 1996/05/03 08:44:33 niklas Exp $ */
+/* $NetBSD: sigreturn.s,v 1.1 1996/01/31 02:22:15 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1988 University of Utah.
+ * Copyright (c) 1980, 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: Utah $Hdr: locore.s 1.66 92/12/22$
+ *
+ * @(#)locore.s 8.6 (Berkeley) 5/27/94
+ */
+
+/*
+ * NOTICE: This is not a standalone file. To use it, #include it in
+ * your port's locore.s, like so:
+ *
+ * #include <m68k/m68k/sigreturn.s>
+ */
+
+/*
+ * The sigreturn() syscall comes here. It requires special handling
+ * because we must open a hole in the stack to fill in the (possibly much
+ * larger) original stack frame.
+ */
+sigreturn:
+ lea sp@(-84),sp | leave enough space for largest frame
+ movl sp@(84),sp@ | move up current 8 byte frame
+ movl sp@(88),sp@(4)
+ movl #84,sp@- | default: adjust by 84 bytes
+ moveml #0xFFFF,sp@- | save user registers
+ movl usp,a0 | save the user SP
+ movl a0,sp@(FR_SP) | in the savearea
+ movl #SYS_sigreturn,sp@- | push syscall number
+ jbsr _syscall | handle it
+ addql #4,sp | pop syscall#
+ movl sp@(FR_SP),a0 | grab and restore
+ movl a0,usp | user SP
+ lea sp@(FR_HW),a1 | pointer to HW frame
+ movw sp@(FR_ADJ),d0 | do we need to adjust the stack?
+ jeq Lsigr1 | no, just continue
+ moveq #92,d1 | total size
+ subw d0,d1 | - hole size = frame size
+ lea a1@(92),a0 | destination
+ addw d1,a1 | source
+ lsrw #1,d1 | convert to word count
+ subqw #1,d1 | minus 1 for dbf
+Lsigrlp:
+ movw a1@-,a0@- | copy a word
+ dbf d1,Lsigrlp | continue
+ movl a0,a1 | new HW frame base
+Lsigr1:
+ movl a1,sp@(FR_SP) | new SP value
+ moveml sp@+,#0x7FFF | restore user registers
+ movl sp@,sp | and our SP
+ jra rei | all done