184 lines
6.3 KiB
ArmAsm
184 lines
6.3 KiB
ArmAsm
/* $NetBSD: sigcode32.s,v 1.1 2001/06/06 21:19:50 mrg Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 1996-2000 Eduardo Horvath
|
|
* Copyright (c) 1996 Paul Kranenburg
|
|
* Copyright (c) 1996
|
|
* The President and Fellows of Harvard College.
|
|
* All rights reserved.
|
|
* Copyright (c) 1992, 1993
|
|
* The Regents of the University of California.
|
|
* All rights reserved.
|
|
*
|
|
* This software was developed by the Computer Systems Engineering group
|
|
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
|
|
* contributed to Berkeley.
|
|
*
|
|
* 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, Lawrence Berkeley Laboratory.
|
|
* This product includes software developed by Harvard University.
|
|
*
|
|
* 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.
|
|
* This product includes software developed by Harvard University.
|
|
* This product includes software developed by Paul Kranenburg.
|
|
* 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.
|
|
*
|
|
* @(#)locore.s 8.4 (Berkeley) 12/10/93
|
|
* from: NetBSD: locore.s,v 1.116 2001/05/30 15:24:37 lukem Exp
|
|
*/
|
|
|
|
/*
|
|
* This module designed to be #include'ed by another assembly language
|
|
* source file, such as locore.s, which must provide these #defines:
|
|
* SIGCODE_NAME
|
|
* ESIGCODE_NAME
|
|
* SIGRETURN_NAME
|
|
* EXIT_NAME
|
|
* for the sigcode, esigcode, sigreturn & exit symbol names.
|
|
*/
|
|
|
|
/*
|
|
* The following code is copied to the top of the user stack when each
|
|
* process is exec'ed, and signals are `trampolined' off it.
|
|
*
|
|
* When this code is run, the stack looks like:
|
|
* [%sp] 64 bytes to which registers can be dumped
|
|
* [%sp + 64] signal number (goes in %o0)
|
|
* [%sp + 64 + 4] signal code (goes in %o1)
|
|
* [%sp + 64 + 8] placeholder
|
|
* [%sp + 64 + 12] argument for %o3, currently unsupported (always 0)
|
|
* [%sp + 64 + 16] first word of saved state (sigcontext)
|
|
* .
|
|
* .
|
|
* .
|
|
* [%sp + NNN] last word of saved state
|
|
* (followed by previous stack contents or top of signal stack).
|
|
* The address of the function to call is in %g1; the old %g1 and %o0
|
|
* have already been saved in the sigcontext. We are running in a clean
|
|
* window, all previous windows now being saved to the stack.
|
|
*
|
|
* Note that [%sp + 64 + 8] == %sp + 64 + 16. The copy at %sp+64+8
|
|
* will eventually be removed, with a hole left in its place, if things
|
|
* work out.
|
|
*/
|
|
.globl SIGCODE_NAME
|
|
.globl ESIGCODE_NAME
|
|
SIGCODE_NAME:
|
|
/*
|
|
* XXX the `save' and `restore' below are unnecessary: should
|
|
* replace with simple arithmetic on %sp
|
|
*
|
|
* Make room on the stack for 32 %f registers + %fsr. This comes
|
|
* out to 33*4 or 132 bytes, but this must be aligned to a multiple
|
|
* of 8, or 136 bytes.
|
|
*/
|
|
save %sp, -CCFSZ - 136, %sp
|
|
mov %g2, %l2 ! save globals in %l registers
|
|
mov %g3, %l3
|
|
mov %g4, %l4
|
|
mov %g5, %l5
|
|
mov %g6, %l6
|
|
mov %g7, %l7
|
|
/*
|
|
* Saving the fpu registers is expensive, so do it iff it is
|
|
* enabled and dirty. We only deal w/lower 32 regs
|
|
*/
|
|
rd %fprs, %l0
|
|
btst FPRS_DL, %l0 ! test dl
|
|
bz,pt %icc, 1f
|
|
rd %y, %l1 ! in any case, save %y
|
|
|
|
! fpu is enabled, oh well
|
|
st %fsr, [%sp + CCFSZ + 0]
|
|
std %f0, [%sp + CCFSZ + 8]
|
|
std %f2, [%sp + CCFSZ + 16]
|
|
std %f4, [%sp + CCFSZ + 24]
|
|
std %f6, [%sp + CCFSZ + 32]
|
|
std %f8, [%sp + CCFSZ + 40]
|
|
std %f10, [%sp + CCFSZ + 48]
|
|
std %f12, [%sp + CCFSZ + 56]
|
|
std %f14, [%sp + CCFSZ + 64]
|
|
std %f16, [%sp + CCFSZ + 72]
|
|
std %f18, [%sp + CCFSZ + 80]
|
|
std %f20, [%sp + CCFSZ + 88]
|
|
std %f22, [%sp + CCFSZ + 96]
|
|
std %f24, [%sp + CCFSZ + 104]
|
|
std %f26, [%sp + CCFSZ + 112]
|
|
std %f28, [%sp + CCFSZ + 120]
|
|
std %f30, [%sp + CCFSZ + 128]
|
|
1:
|
|
ldd [%fp + 64], %o0 ! sig, code
|
|
ld [%fp + 76], %o3 ! arg3
|
|
call %g1 ! (*sa->sa_handler)(sig,code,scp,arg3)
|
|
add %fp, 64 + 16, %o2 ! scp
|
|
|
|
/*
|
|
* Now that the handler has returned, re-establish all the state
|
|
* we just saved above, then do a sigreturn.
|
|
*/
|
|
btst FPRS_DL, %l0 ! test dl
|
|
bz,pt %icc, 1f
|
|
wr %l1, %g0, %y ! in any case, restore %y
|
|
|
|
ld [%sp + CCFSZ + 0], %fsr
|
|
ldd [%sp + CCFSZ + 8], %f0
|
|
ldd [%sp + CCFSZ + 16], %f2
|
|
ldd [%sp + CCFSZ + 24], %f4
|
|
ldd [%sp + CCFSZ + 32], %f6
|
|
ldd [%sp + CCFSZ + 40], %f8
|
|
ldd [%sp + CCFSZ + 48], %f10
|
|
ldd [%sp + CCFSZ + 56], %f12
|
|
ldd [%sp + CCFSZ + 64], %f14
|
|
ldd [%sp + CCFSZ + 72], %f16
|
|
ldd [%sp + CCFSZ + 80], %f18
|
|
ldd [%sp + CCFSZ + 88], %f20
|
|
ldd [%sp + CCFSZ + 96], %f22
|
|
ldd [%sp + CCFSZ + 104], %f24
|
|
ldd [%sp + CCFSZ + 112], %f26
|
|
ldd [%sp + CCFSZ + 120], %f28
|
|
ldd [%sp + CCFSZ + 128], %f30
|
|
|
|
1:
|
|
mov %l2, %g2
|
|
mov %l3, %g3
|
|
mov %l4, %g4
|
|
mov %l5, %g5
|
|
mov %l6, %g6
|
|
mov %l7, %g7
|
|
|
|
restore %g0, SIGRETURN_NAME, %g1 ! get registers back & set syscall #
|
|
add %sp, 64 + 16, %o0 ! compute scp
|
|
t ST_SYSCALL ! sigreturn(scp)
|
|
mov EXIT_NAME, %g1 ! exit(errno)
|
|
t ST_SYSCALL
|
|
ESIGCODE_NAME:
|