Implement linux_sigaltstack.

This commit is contained in:
Marcel Moolenaar 1999-11-30 15:02:28 +00:00
parent 56d6dc1d34
commit ec99e32256
9 changed files with 116 additions and 29 deletions

View file

@ -48,6 +48,7 @@ typedef struct {
} linux_fsid_t;
typedef int linux_pid_t;
typedef int linux_key_t;
typedef unsigned int linux_size_t;
/*
* Signal stuff...
@ -74,6 +75,13 @@ typedef struct {
linux_sigset_t lsa_mask;
} linux_sigaction_t;
typedef struct
{
void *ss_sp;
int ss_flags;
linux_size_t ss_size;
} linux_stack_t;
/*
* The Linux sigcontext, pretty much a standard 386 trapframe.
*/

View file

@ -104,7 +104,6 @@ DUMMY(pread);
DUMMY(pwrite);
DUMMY(capget);
DUMMY(capset);
DUMMY(sigaltstack);
DUMMY(sendfile);
DUMMY(getpmsg);
DUMMY(putpmsg);

View file

@ -123,7 +123,7 @@ static int
linux_do_sigaction(struct proc *p, int linux_sig, linux_sigaction_t *linux_nsa,
linux_sigaction_t *linux_osa)
{
struct sigaction *nsa, *osa, sa;
struct sigaction *nsa, *osa;
struct sigaction_args sa_args;
int error;
caddr_t sg = stackgap_init();
@ -138,10 +138,7 @@ linux_do_sigaction(struct proc *p, int linux_sig, linux_sigaction_t *linux_nsa,
if (linux_nsa != NULL) {
nsa = stackgap_alloc(&sg, sizeof(struct sigaction));
linux_to_bsd_sigaction(linux_nsa, &sa);
error = copyout(&sa, nsa, sizeof(struct sigaction));
if (error)
return (error);
linux_to_bsd_sigaction(linux_nsa, nsa);
}
else
nsa = NULL;
@ -157,12 +154,8 @@ linux_do_sigaction(struct proc *p, int linux_sig, linux_sigaction_t *linux_nsa,
if (error)
return (error);
if (linux_osa != NULL) {
error = copyin(osa, &sa, sizeof(struct sigaction));
if (error)
return (error);
bsd_to_linux_sigaction(&sa, linux_osa);
}
if (linux_osa != NULL)
bsd_to_linux_sigaction(osa, linux_osa);
return (0);
}
@ -517,3 +510,46 @@ linux_kill(struct proc *p, struct linux_kill_args *args)
tmp.pid = args->pid;
return (kill(p, &tmp));
}
int
linux_sigaltstack(p, uap)
struct proc *p;
struct linux_sigaltstack_args *uap;
{
struct sigaltstack_args bsd;
stack_t *ss, *oss;
linux_stack_t lss;
int error;
caddr_t sg = stackgap_init();
#ifdef DEBUG
printf("Linux-emul(%ld): sigaltstack(%p, %p)\n",
(long)p->p_pid, args->uss, args->uoss);
#endif
error = copyin(uap->uss, &lss, sizeof(linux_stack_t));
if (error)
return (error);
ss = stackgap_alloc(&sg, sizeof(stack_t));
ss->ss_sp = lss.ss_sp;
ss->ss_size = lss.ss_size;
ss->ss_flags = lss.ss_flags;
oss = (uap->uoss != NULL)
? stackgap_alloc(&sg, sizeof(stack_t))
: NULL;
bsd.ss = ss;
bsd.oss = oss;
error = sigaltstack(p, &bsd);
if (!error && oss != NULL) {
lss.ss_sp = oss->ss_sp;
lss.ss_size = oss->ss_size;
lss.ss_flags = oss->ss_flags;
error = copyout(&lss, uap->uoss, sizeof(linux_stack_t));
}
return (error);
}

View file

@ -48,6 +48,7 @@ typedef struct {
} linux_fsid_t;
typedef int linux_pid_t;
typedef int linux_key_t;
typedef unsigned int linux_size_t;
/*
* Signal stuff...
@ -74,6 +75,13 @@ typedef struct {
linux_sigset_t lsa_mask;
} linux_sigaction_t;
typedef struct
{
void *ss_sp;
int ss_flags;
linux_size_t ss_size;
} linux_stack_t;
/*
* The Linux sigcontext, pretty much a standard 386 trapframe.
*/

View file

@ -104,7 +104,6 @@ DUMMY(pread);
DUMMY(pwrite);
DUMMY(capget);
DUMMY(capset);
DUMMY(sigaltstack);
DUMMY(sendfile);
DUMMY(getpmsg);
DUMMY(putpmsg);

View file

@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
* created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.27 1999/11/27 16:50:54 marcel Exp
* created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.28 1999/11/30 15:00:17 marcel Exp
*/
#ifndef _LINUX_SYSPROTO_H_
@ -505,7 +505,8 @@ struct linux_capset_args {
register_t dummy;
};
struct linux_sigaltstack_args {
register_t dummy;
const linux_stack_t * uss; char uss_[PAD_(const linux_stack_t *)];
linux_stack_t * uoss; char uoss_[PAD_(linux_stack_t *)];
};
struct linux_sendfile_args {
register_t dummy;

View file

@ -123,7 +123,7 @@ static int
linux_do_sigaction(struct proc *p, int linux_sig, linux_sigaction_t *linux_nsa,
linux_sigaction_t *linux_osa)
{
struct sigaction *nsa, *osa, sa;
struct sigaction *nsa, *osa;
struct sigaction_args sa_args;
int error;
caddr_t sg = stackgap_init();
@ -138,10 +138,7 @@ linux_do_sigaction(struct proc *p, int linux_sig, linux_sigaction_t *linux_nsa,
if (linux_nsa != NULL) {
nsa = stackgap_alloc(&sg, sizeof(struct sigaction));
linux_to_bsd_sigaction(linux_nsa, &sa);
error = copyout(&sa, nsa, sizeof(struct sigaction));
if (error)
return (error);
linux_to_bsd_sigaction(linux_nsa, nsa);
}
else
nsa = NULL;
@ -157,12 +154,8 @@ linux_do_sigaction(struct proc *p, int linux_sig, linux_sigaction_t *linux_nsa,
if (error)
return (error);
if (linux_osa != NULL) {
error = copyin(osa, &sa, sizeof(struct sigaction));
if (error)
return (error);
bsd_to_linux_sigaction(&sa, linux_osa);
}
if (linux_osa != NULL)
bsd_to_linux_sigaction(osa, linux_osa);
return (0);
}
@ -517,3 +510,46 @@ linux_kill(struct proc *p, struct linux_kill_args *args)
tmp.pid = args->pid;
return (kill(p, &tmp));
}
int
linux_sigaltstack(p, uap)
struct proc *p;
struct linux_sigaltstack_args *uap;
{
struct sigaltstack_args bsd;
stack_t *ss, *oss;
linux_stack_t lss;
int error;
caddr_t sg = stackgap_init();
#ifdef DEBUG
printf("Linux-emul(%ld): sigaltstack(%p, %p)\n",
(long)p->p_pid, args->uss, args->uoss);
#endif
error = copyin(uap->uss, &lss, sizeof(linux_stack_t));
if (error)
return (error);
ss = stackgap_alloc(&sg, sizeof(stack_t));
ss->ss_sp = lss.ss_sp;
ss->ss_size = lss.ss_size;
ss->ss_flags = lss.ss_flags;
oss = (uap->uoss != NULL)
? stackgap_alloc(&sg, sizeof(stack_t))
: NULL;
bsd.ss = ss;
bsd.oss = oss;
error = sigaltstack(p, &bsd);
if (!error && oss != NULL) {
lss.ss_sp = oss->ss_sp;
lss.ss_size = oss->ss_size;
lss.ss_flags = oss->ss_flags;
error = copyout(&lss, uap->uoss, sizeof(linux_stack_t));
}
return (error);
}

View file

@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
* created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.27 1999/11/27 16:50:54 marcel Exp
* created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.28 1999/11/30 15:00:17 marcel Exp
*/
#define LINUX_SYS_linux_setup 0

View file

@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
* created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.27 1999/11/27 16:50:54 marcel Exp
* created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.28 1999/11/30 15:00:17 marcel Exp
*/
#include "opt_compat.h"
@ -201,7 +201,7 @@ struct sysent linux_sysent[] = {
{ 2, (sy_call_t *)linux_getcwd }, /* 183 = linux_getcwd */
{ 0, (sy_call_t *)linux_capget }, /* 184 = linux_capget */
{ 0, (sy_call_t *)linux_capset }, /* 185 = linux_capset */
{ 0, (sy_call_t *)linux_sigaltstack }, /* 186 = linux_sigaltstack */
{ 2, (sy_call_t *)linux_sigaltstack }, /* 186 = linux_sigaltstack */
{ 0, (sy_call_t *)linux_sendfile }, /* 187 = linux_sendfile */
{ 0, (sy_call_t *)linux_getpmsg }, /* 188 = linux_getpmsg */
{ 0, (sy_call_t *)linux_putpmsg }, /* 189 = linux_putpmsg */