rename sa_ -> linux_sa_

first attempt at providing siginfo_t to the signal handler.
This commit is contained in:
christos 2002-11-26 18:42:38 +00:00
parent f176c534d2
commit daa59d8957
3 changed files with 35 additions and 23 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_machdep.c,v 1.81 2002/10/09 05:07:55 junyoung Exp $ */
/* $NetBSD: linux_machdep.c,v 1.82 2002/11/26 18:42:38 christos Exp $ */
/*-
* Copyright (c) 1995, 2000 The NetBSD Foundation, Inc.
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.81 2002/10/09 05:07:55 junyoung Exp $");
__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.82 2002/11/26 18:42:38 christos Exp $");
#if defined(_KERNEL_OPT)
#include "opt_vm86.h"
@ -192,18 +192,18 @@ linux_sendsig(sig, mask, code)
struct linux_sigframe *fp, frame;
int onstack;
sig_t catcher = SIGACTION(p, sig).sa_handler;
struct sigaltstack *sas = &p->p_sigctx.ps_sigstk;
tf = p->p_md.md_regs;
/* Do we need to jump onto the signal stack? */
onstack =
(p->p_sigctx.ps_sigstk.ss_flags & (SS_DISABLE | SS_ONSTACK)) == 0 &&
onstack = (sas->ss_flags & (SS_DISABLE | SS_ONSTACK)) == 0 &&
(SIGACTION(p, sig).sa_flags & SA_ONSTACK) != 0;
/* Allocate space for the signal handler context. */
if (onstack)
fp = (struct linux_sigframe *)((caddr_t)p->p_sigctx.ps_sigstk.ss_sp +
p->p_sigctx.ps_sigstk.ss_size);
fp = (struct linux_sigframe *) ((caddr_t)sas->ss_sp +
sas->ss_size);
else
fp = (struct linux_sigframe *)tf->tf_esp;
fp--;
@ -211,6 +211,12 @@ linux_sendsig(sig, mask, code)
/* Build stack frame for signal trampoline. */
frame.sf_handler = catcher;
frame.sf_sig = native_to_linux_signo[sig];
frame.sf_sip = &fp->sf_si;
frame.sf_scp = &fp->sf_sc;
/*
* XXX: zero siginfo out until we provide more info.
*/
(void)memset(&frame.sf_si, 0, sizeof(frame.sf_si));
/* Save register context. */
#ifdef VM86
@ -274,7 +280,7 @@ linux_sendsig(sig, mask, code)
/* Remember that we're now on the signal stack. */
if (onstack)
p->p_sigctx.ps_sigstk.ss_flags |= SS_ONSTACK;
sas->ss_flags |= SS_ONSTACK;
}
/*
@ -310,6 +316,7 @@ linux_sys_sigreturn(p, v, retval)
struct trapframe *tf;
sigset_t mask;
ssize_t ss_gap;
struct sigaltstack *sas = &p->p_sigctx.ps_sigstk;
/*
* The trampoline code hands us the context.
@ -366,11 +373,11 @@ linux_sys_sigreturn(p, v, retval)
* to save the onstack flag.
*/
ss_gap = (ssize_t)
((caddr_t) context.sc_esp_at_signal - (caddr_t) p->p_sigctx.ps_sigstk.ss_sp);
if (ss_gap >= 0 && ss_gap < p->p_sigctx.ps_sigstk.ss_size)
p->p_sigctx.ps_sigstk.ss_flags |= SS_ONSTACK;
((caddr_t) context.sc_esp_at_signal - (caddr_t) sas->ss_sp);
if (ss_gap >= 0 && ss_gap < sas->ss_size)
sas->ss_flags |= SS_ONSTACK;
else
p->p_sigctx.ps_sigstk.ss_flags &= ~SS_ONSTACK;
sas->ss_flags &= ~SS_ONSTACK;
/* Restore signal mask. */
linux_old_to_native_sigset(&mask, &context.sc_mask);

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_machdep.h,v 1.23 2002/09/06 13:18:43 gehenna Exp $ */
/* $NetBSD: linux_machdep.h,v 1.24 2002/11/26 18:42:38 christos Exp $ */
/*-
* Copyright (c) 1995, 2000 The NetBSD Foundation, Inc.
@ -39,7 +39,9 @@
#ifndef _I386_LINUX_MACHDEP_H
#define _I386_LINUX_MACHDEP_H
#include <compat/linux/common/linux_types.h>
#include <compat/linux/common/linux_signal.h>
#include <compat/linux/common/linux_siginfo.h>
/*
* The Linux sigcontext, pretty much a standard 386 trapframe.
@ -80,8 +82,11 @@ struct linux_sigcontext {
struct linux_sigframe {
int sf_sig;
struct linux_sigcontext sf_sc;
struct linux_siginfo *sf_sip;
struct linux_sigcontext *sf_scp;
sig_t sf_handler;
struct linux_siginfo sf_si;
struct linux_sigcontext sf_sc;
};
#ifdef _KERNEL

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_signal.h,v 1.11 2002/03/19 20:51:59 christos Exp $ */
/* $NetBSD: linux_signal.h,v 1.12 2002/11/26 18:42:38 christos Exp $ */
/*-
* Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
@ -106,23 +106,23 @@ typedef struct {
} linux_sigset_t;
struct linux_old_sigaction {
linux_handler_t sa_handler;
linux_old_sigset_t sa_mask;
unsigned long sa_flags;
void (*sa_restorer) __P((void));
linux_handler_t linux_sa_handler;
linux_old_sigset_t linux_sa_mask;
unsigned long linux_sa_flags;
void (*linux_sa_restorer) __P((void));
};
/* Used in rt_* calls */
struct linux_sigaction {
linux_handler_t sa_handler;
unsigned long sa_flags;
void (*sa_restorer) __P((void));
linux_sigset_t sa_mask;
linux_handler_t linux_sa_handler;
unsigned long linux_sa_flags;
void (*linux_sa_restorer) __P((void));
linux_sigset_t linux_sa_mask;
};
struct linux_k_sigaction {
struct linux_sigaction sa;
#define k_sa_restorer sa.sa_restorer
#define k_sa_restorer sa.linux_sa_restorer
};
#define LINUX_SS_ONSTACK 1