use netbsd <sys/signal.h> and sigset_t
. create signals-related struct message type to store sigset_t directly . create notify-specific message types, so the generic NOTIFY_ARG doesn't exist anymore . various related test expansions, improvements, fixes . add a few error-checks to sigismember() calls . rename kernel call specific signals fields to SYS_* Change-Id: I53c18999b5eaf0cfa0cb25f5330bee9e7ad2b478
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
#ifndef _ARM_STACKFRAME_H
|
||||
#define _ARM_STACKFRAME_H
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
typedef u32_t reg_t; /* machine register */
|
||||
|
||||
struct stackframe_s {
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef STACK_FRAME_H
|
||||
#define STACK_FRAME_H
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
typedef unsigned reg_t; /* machine register */
|
||||
typedef reg_t segdesc_t;
|
||||
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
* sigsuspend(2) calls.
|
||||
*/
|
||||
#define PM_SIG_HOW m2_i1 /* int */
|
||||
#define PM_SIG_SET m2_l1 /* sigset_t */
|
||||
#define PM_SIG_SET m2_sigset /* sigset_t */
|
||||
#define PM_SIG_CTX m2_p1 /* struct sigcontext * */
|
||||
|
||||
/* Field names for the srv_fork(2) call. */
|
||||
|
||||
@@ -108,8 +108,9 @@
|
||||
(is_ipc_notify(ipc_status) || IPC_STATUS_CALL(ipc_status) == SENDA)
|
||||
|
||||
/* Shorthands for message parameters passed with notifications. */
|
||||
#define NOTIFY_ARG m2_l1
|
||||
#define NOTIFY_TIMESTAMP m2_l2
|
||||
#define NOTIFY_TIMESTAMP m_u.m_notify.timestamp
|
||||
#define NOTIFY_INTMASK m_u.m_notify.interrupts
|
||||
#define NOTIFY_SIGSET m_u.m_notify.sigset
|
||||
|
||||
/*===========================================================================*
|
||||
* Messages for BUS controller drivers *
|
||||
@@ -475,11 +476,12 @@
|
||||
#define SG_SIZE m2_i2 /* no. of entries */
|
||||
|
||||
/* Field names for SYS_GETKSIG, _ENDKSIG, _KILL, _SIGSEND, _SIGRETURN. */
|
||||
#define SIG_ENDPT m2_i1 /* process number for inform */
|
||||
#define SIG_NUMBER m2_i2 /* signal number to send */
|
||||
#define SIG_FLAGS m2_i3 /* signal flags field */
|
||||
#define SIG_MAP m2_l1 /* used by kernel to pass signal bit map */
|
||||
#define SIG_CTXT_PTR m2_p1 /* pointer to info to restore signal context */
|
||||
#define SYS_SIG_ENDPT m_u.m_sigcalls.ep /* process number for inform */
|
||||
#define SYS_SIG_NUMBER m_u.m_sigcalls.sig /* signal number to send */
|
||||
#define SYS_SIG_FLAGS m_u.m_sigcalls.flags /* signal flags field */
|
||||
#define SYS_SIG_MAP m_u.m_sigcalls.sigs /* used to pass signal bit map */
|
||||
#define SYS_SIG_CTXT_PTR m_u.m_sigcalls.sigctx /* pointer to signal context */
|
||||
#define SYS_SIG_HOW m_u.m_sigcalls.how /* used to pass signal bit map */
|
||||
|
||||
/* Field names for SYS_FORK, _EXEC, _EXIT, GETMCONTEXT, SETMCONTEXT.*/
|
||||
#define PR_ENDPT m1_i1 /* indicates a process */
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <minix/ipcconst.h>
|
||||
#include <minix/type.h>
|
||||
#include <minix/const.h>
|
||||
#include <sys/signal.h>
|
||||
|
||||
/*==========================================================================*
|
||||
* Types relating to messages. *
|
||||
@@ -17,7 +18,9 @@
|
||||
|
||||
typedef struct {int m1i1, m1i2, m1i3; char *m1p1, *m1p2, *m1p3, *m1p4;} mess_1;
|
||||
typedef struct {int m2i1, m2i2, m2i3; long m2l1, m2l2; char *m2p1;
|
||||
short m2s1;} mess_2;
|
||||
short m2s1; sigset_t sigset; } mess_2;
|
||||
typedef struct {endpoint_t ep; int sig; u32_t flags; sigset_t sigs;
|
||||
void *sigctx; int how; } mess_sigcalls;
|
||||
typedef struct {int m3i1, m3i2; char *m3p1; char m3ca1[M3_LONG_STRING];} mess_3;
|
||||
typedef struct {long m4l1, m4l2, m4l3, m4l4, m4l5;} mess_4;
|
||||
typedef struct {short m5s1, m5s2; int m5i1, m5i2; long m5l1, m5l2, m5l3;}mess_5;
|
||||
@@ -43,6 +46,12 @@ typedef struct {
|
||||
u8_t flags;
|
||||
} mess_vmmcp;
|
||||
|
||||
typedef struct {
|
||||
u64_t timestamp; /* valid for every notify msg */
|
||||
u64_t interrupts; /* raised interrupts; valid if from HARDWARE */
|
||||
sigset_t sigset; /* raised signals; valid if from SYSTEM */
|
||||
} mess_notify;
|
||||
|
||||
typedef struct {
|
||||
endpoint_t who;
|
||||
u32_t offset;
|
||||
@@ -74,6 +83,8 @@ typedef struct {
|
||||
mess_vmmcp m_vmmcp;
|
||||
mess_vmmcp_reply m_vmmcp_reply;
|
||||
mess_vm_vfs_mmap m_vm_vfs;
|
||||
mess_notify m_notify; /* notify messages */
|
||||
mess_sigcalls m_sigcalls; /* SYS_{GETKSIG,ENDKSIG,KILL,SIGSEND,SIGRETURN} */
|
||||
u32_t size[14]; /* message payload may have 14 longs at most */
|
||||
} m_u;
|
||||
} message __aligned(16);
|
||||
@@ -93,6 +104,7 @@ typedef struct {
|
||||
#define m2_l1 m_u.m_m2.m2l1
|
||||
#define m2_l2 m_u.m_m2.m2l2
|
||||
#define m2_p1 m_u.m_m2.m2p1
|
||||
#define m2_sigset m_u.m_m2.sigset
|
||||
|
||||
#define m2_s1 m_u.m_m2.m2s1
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/sigtypes.h>
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
@@ -65,7 +66,7 @@ typedef struct {
|
||||
*/
|
||||
struct sigmsg {
|
||||
int sm_signo; /* signal number being caught */
|
||||
unsigned long sm_mask; /* mask to restore when handler returns */
|
||||
sigset_t sm_mask; /* mask to restore when handler returns */
|
||||
vir_bytes sm_sighandler; /* address of handler */
|
||||
vir_bytes sm_sigreturn; /* address of _sigreturn in C library */
|
||||
vir_bytes sm_stkptr; /* user stack pointer */
|
||||
|
||||
@@ -62,29 +62,33 @@ int kill(pid_t, int);
|
||||
int __libc_sigaction14(int, const struct sigaction * __restrict,
|
||||
struct sigaction * __restrict);
|
||||
|
||||
#ifndef __minix
|
||||
#if (_POSIX_C_SOURCE - 0L) >= 199506L || (_XOPEN_SOURCE - 0) >= 500 || \
|
||||
defined(_NETBSD_SOURCE)
|
||||
int pthread_sigmask(int, const sigset_t * __restrict,
|
||||
sigset_t * __restrict);
|
||||
#ifndef __minix
|
||||
int pthread_kill(pthread_t, int);
|
||||
#endif
|
||||
int __libc_thr_sigsetmask(int, const sigset_t * __restrict,
|
||||
sigset_t * __restrict);
|
||||
#ifndef __LIBPTHREAD_SOURCE__
|
||||
#define pthread_sigmask __libc_thr_sigsetmask
|
||||
#endif /* __LIBPTHREAD_SOURCE__ */
|
||||
#endif
|
||||
#endif /* __minix */
|
||||
|
||||
#ifndef __LIBC12_SOURCE__
|
||||
int sigaction(int, const struct sigaction * __restrict,
|
||||
struct sigaction * __restrict) __RENAME(__sigaction14);
|
||||
#if defined(__minix) && defined(_SYSTEM)
|
||||
#define sigaddset(set, sig) __sigaddset((set), (sig))
|
||||
#define sigdelset(set, sig) __sigdelset((set), (sig))
|
||||
#define sigemptyset(set) __sigemptyset((set))
|
||||
#define sigfillset(set) __sigfillset((set))
|
||||
#define sigismember(set, sig) __sigismember((set), (sig))
|
||||
/* In Minix system code, use alternate versions of the signal mask
|
||||
* manipulation functions that do not check signal numbers vs. _NSIG.
|
||||
* _NSIG can then represent the user-visible signal set.
|
||||
*/
|
||||
#define sigaddset(set, sig) __sigaddset((set), (sig))
|
||||
#define sigdelset(set, sig) __sigdelset((set), (sig))
|
||||
#define sigemptyset(set) __sigemptyset((set))
|
||||
#define sigfillset(set) __sigfillset((set))
|
||||
#define sigismember(set, sig) __sigismember((set), (sig))
|
||||
#else
|
||||
int sigaddset(sigset_t *, int) __RENAME(__sigaddset14);
|
||||
int sigdelset(sigset_t *, int) __RENAME(__sigdelset14);
|
||||
@@ -115,7 +119,7 @@ int *__errno(void);
|
||||
#define ___errno (*__errno())
|
||||
#endif
|
||||
|
||||
#if !defined(__minix) || !defined(_SYSTEM)
|
||||
#if !(defined(__minix) && defined(_SYSTEM))
|
||||
__c99inline int
|
||||
sigaddset(sigset_t *set, int signo)
|
||||
{
|
||||
@@ -161,7 +165,7 @@ sigfillset(sigset_t *set)
|
||||
__sigfillset(set);
|
||||
return (0);
|
||||
}
|
||||
#endif /* !defined(__minix) || !defined(_SYSTEM) */
|
||||
#endif
|
||||
#endif /* __c99inline */
|
||||
#endif /* !__LIBC12_SOURCE__ */
|
||||
|
||||
@@ -172,13 +176,11 @@ sigfillset(sigset_t *set)
|
||||
(_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
|
||||
int killpg(pid_t, int);
|
||||
int siginterrupt(int, int);
|
||||
#ifndef __minix
|
||||
int sigstack(const struct sigstack *, struct sigstack *);
|
||||
#ifndef __LIBC12_SOURCE__
|
||||
int sigaltstack(const stack_t * __restrict, stack_t * __restrict)
|
||||
__RENAME(__sigaltstack14);
|
||||
#endif
|
||||
#endif /* !__minix */
|
||||
int sighold(int);
|
||||
int sigignore(int);
|
||||
int sigpause(int);
|
||||
@@ -192,13 +194,10 @@ void (*sigset (int, void (*)(int)))(int);
|
||||
*/
|
||||
#if (_POSIX_C_SOURCE - 0) >= 199309L || (_XOPEN_SOURCE - 0) >= 500 || \
|
||||
defined(_NETBSD_SOURCE)
|
||||
#ifndef __minix
|
||||
int sigwait (const sigset_t * __restrict, int * __restrict);
|
||||
int sigwaitinfo(const sigset_t * __restrict, siginfo_t * __restrict);
|
||||
#endif /* !__minix */
|
||||
void psiginfo(const siginfo_t *, const char *);
|
||||
|
||||
#ifndef __minix
|
||||
#ifndef __LIBC12_SOURCE__
|
||||
struct timespec;
|
||||
int sigtimedwait(const sigset_t * __restrict,
|
||||
@@ -208,18 +207,15 @@ int __sigtimedwait(const sigset_t * __restrict,
|
||||
siginfo_t * __restrict, struct timespec * __restrict)
|
||||
__RENAME(____sigtimedwait50);
|
||||
#endif
|
||||
#endif /* !__minix */
|
||||
#endif /* _POSIX_C_SOURCE >= 200112 || _XOPEN_SOURCE_EXTENDED || ... */
|
||||
|
||||
|
||||
#if defined(_NETBSD_SOURCE)
|
||||
#ifndef __minix
|
||||
#ifndef __PSIGNAL_DECLARED
|
||||
#define __PSIGNAL_DECLARED
|
||||
/* also in unistd.h */
|
||||
void psignal(int, const char *);
|
||||
#endif /* __PSIGNAL_DECLARED */
|
||||
#endif /* !__minix */
|
||||
int sigblock(int);
|
||||
int sigsetmask(int);
|
||||
#endif /* _NETBSD_SOURCE */
|
||||
|
||||
Reference in New Issue
Block a user