/* $NetBSD: __sigtramp2.S,v 1.5 2021/11/24 02:01:15 thorpej Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Jason R. Thorpe. * * 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. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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. */ #include "SYS.h" #include "assym.h" /* * The SH signal trampoline is invoked only to return from * the signal; the kernel calls the signal handler directly. * * On entry, stack looks like: * * siginfo structure * sp-> ucontext structure * * NB: This order is different from what other ports use (siginfo at * the top of the stack), because we want to avoid wasting two * instructions to skip to the ucontext. Not that this order really * matters, but I think this inconsistency deserves an explanation. * * The DWARF register numbers unforunately do not map directly to our * _REG_* constants that are used to index the general registers in the * ucontext_t at all. * * The stack pointer is, of course, r15, and there are several DWARF * pseudo-registers to represent other bits of the context. */ #define DWARF_REG_PC 16 #define DWARF_REG_PR 17 #define DWARF_REG_GBR 18 #define DWARF_REG_MACH 20 #define DWARF_REG_MACL 21 #define DWARF_REG_SR 22 #define CFI_OFFSET_DWARF_REG(d, r) .cfi_offset d, r * 4 .text .cfi_startproc simple .cfi_signal_frame .cfi_def_cfa 15, _UC_GREGS CFI_OFFSET_DWARF_REG(0, _REG_R0) CFI_OFFSET_DWARF_REG(1, _REG_R1) CFI_OFFSET_DWARF_REG(2, _REG_R2) CFI_OFFSET_DWARF_REG(3, _REG_R3) CFI_OFFSET_DWARF_REG(4, _REG_R4) CFI_OFFSET_DWARF_REG(5, _REG_R5) CFI_OFFSET_DWARF_REG(6, _REG_R6) CFI_OFFSET_DWARF_REG(7, _REG_R7) CFI_OFFSET_DWARF_REG(9, _REG_R8) CFI_OFFSET_DWARF_REG(9, _REG_R9) CFI_OFFSET_DWARF_REG(10, _REG_R10) CFI_OFFSET_DWARF_REG(11, _REG_R11) CFI_OFFSET_DWARF_REG(12, _REG_R12) CFI_OFFSET_DWARF_REG(13, _REG_R13) CFI_OFFSET_DWARF_REG(14, _REG_R14) CFI_OFFSET_DWARF_REG(15, _REG_R15) CFI_OFFSET_DWARF_REG(DWARF_REG_PR, _REG_PR) CFI_OFFSET_DWARF_REG(DWARF_REG_SR, _REG_SR) CFI_OFFSET_DWARF_REG(DWARF_REG_GBR, _REG_GBR) CFI_OFFSET_DWARF_REG(DWARF_REG_MACH, _REG_MACH) CFI_OFFSET_DWARF_REG(DWARF_REG_MACL, _REG_MACL) .cfi_return_column DWARF_REG_PC CFI_OFFSET_DWARF_REG(DWARF_REG_PC, _REG_PC) /* * The unwind entry includes one instruction slot prior to the trampoline * because the unwinder will look up to (return PC - 1 insn) while unwinding. * Normally this would be the jump / branch, but since there isn't one in * this case, we place an explicit nop there instead. */ nop NENTRY(__sigtramp_siginfo_2) mov r15, r4 /* get pointer to ucontext */ SYSTRAP(setcontext) /* and call setcontext() */ mov r0, r4 /* exit with errno */ SYSTRAP(exit) /* if sigreturn fails */ .cfi_endproc SET_ENTRY_SIZE(__sigtramp_siginfo_2)