summaryrefslogtreecommitdiffstats
path: root/lib/libc/i386/gen/signalcontext.c
diff options
context:
space:
mode:
authormini <mini@FreeBSD.org>2002-09-17 03:11:07 +0000
committermini <mini@FreeBSD.org>2002-09-17 03:11:07 +0000
commit4dbf5221afb8b3c6d5c93c628292c96910ec50b0 (patch)
tree79956090b0bc53cc021053aca4d749dbeef85ca2 /lib/libc/i386/gen/signalcontext.c
parentb561096e479e036edf9bd0d01cf43172e015d481 (diff)
downloadFreeBSD-src-4dbf5221afb8b3c6d5c93c628292c96910ec50b0.zip
FreeBSD-src-4dbf5221afb8b3c6d5c93c628292c96910ec50b0.tar.gz
Add signalcontext(), which adds a signal frame to a ucontext_t.
Diffstat (limited to 'lib/libc/i386/gen/signalcontext.c')
-rw-r--r--lib/libc/i386/gen/signalcontext.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/lib/libc/i386/gen/signalcontext.c b/lib/libc/i386/gen/signalcontext.c
new file mode 100644
index 0000000..1e2df66
--- /dev/null
+++ b/lib/libc/i386/gen/signalcontext.c
@@ -0,0 +1,80 @@
+/*-
+ * Copyright (c) 2002 Jonathan Mini <mini@freebsd.org>
+ * All rights reserved.
+ *
+ * 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 AUTHOR 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 AUTHOR 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.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD");
+
+#include <sys/param.h>
+#include <sys/signal.h>
+#include <sys/signalvar.h>
+#include <sys/ucontext.h>
+#include <machine/psl.h>
+#include <machine/sigframe.h>
+
+extern void _ctx_start(ucontext_t *, int argc, ...);
+
+int
+signalcontext(ucontext_t *ucp, int sig, __sighandler_t *func)
+{
+ struct sigframe *sfp;
+ int *p;
+
+ /*
+ * Set up stack.
+ * (n = sizeof(int))
+ * 2n+sizeof(struct sigframe) ucp
+ * 2n struct sigframe
+ * 1n &func
+ * 0n &_ctx_start
+ */
+ p = (int *)ucp->uc_mcontext.mc_esp;
+ *--p = (int)ucp;
+ p -= sizeof(struct sigframe);
+ sfp = (struct sigframe *)p;
+ bzero(sfp, sizeof(struct sigframe));
+ sfp->sf_signum = sig;
+ sfp->sf_siginfo = (int)&sfp->sf_si;
+ sfp->sf_ucontext = (int)&sfp->sf_uc;
+ sfp->sf_ahu.sf_action = (__siginfohandler_t *)func;
+ bcopy(ucp, &sfp->sf_uc, sizeof(ucontext_t));
+ sfp->sf_si.si_signo = sig;
+
+ *--p = (int)func;
+
+ /*
+ * Set up ucontext_t.
+ */
+ ucp->uc_mcontext.mc_ebp = ucp->uc_mcontext.mc_esp - sizeof(int);
+ ucp->uc_mcontext.mc_esp = (int)p;
+ ucp->uc_mcontext.mc_eip = (int)_ctx_start;
+ ucp->uc_mcontext.mc_eflags &= ~PSL_T;
+ ucp->uc_link = &sfp->sf_uc;
+ SIGDELSET(ucp->uc_sigmask, sig);
+ return (0);
+}
+
OpenPOWER on IntegriCloud