[Xenomai-git] Gilles Chanteperdrix : skins: add per-skin user-space signal handler, and dispatch function.
Module: xenomai-head Branch: master Commit: b5204f9aa6d64b96f80202433d816727dc4e3743 URL: http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=b5204f9aa6d64b96f80202433d816727dc4e3743 Author: Gilles Chanteperdrix gilles.chanteperd...@xenomai.org Date: Sun Nov 22 23:07:21 2009 +0100 skins: add per-skin user-space signal handler, and dispatch function. --- include/asm-generic/bits/bind.h | 12 ++-- include/asm-generic/syscall.h | 58 ++- src/skins/common/bind.c | 23 +++- src/skins/native/init.c |2 +- src/skins/posix/init.c |3 +- src/skins/psos+/init.c |3 +- src/skins/rtai/init.c |3 +- src/skins/rtdm/init.c |3 +- src/skins/uitron/init.c |3 +- src/skins/vrtx/init.c |2 +- src/skins/vxworks/init.c|2 +- 11 files changed, 94 insertions(+), 20 deletions(-) diff --git a/include/asm-generic/bits/bind.h b/include/asm-generic/bits/bind.h index 7da2c43..7267e0d 100644 --- a/include/asm-generic/bits/bind.h +++ b/include/asm-generic/bits/bind.h @@ -5,15 +5,21 @@ #include stdlib.h #include signal.h +union xnsiginfo; + +typedef void xnsighandler(union xnsiginfo *si); + void xeno_handle_mlock_alert(int sig); int -xeno_bind_skin_opt(unsigned skin_magic, const char *skin, const char *module); +xeno_bind_skin_opt(unsigned skin_magic, const char *skin, + const char *module, xnsighandler *sighandler); static inline int -xeno_bind_skin(unsigned skin_magic, const char *skin, const char *module) +xeno_bind_skin(unsigned skin_magic, const char *skin, + const char *module, xnsighandler *sighandler) { - int muxid = xeno_bind_skin_opt(skin_magic, skin, module); + int muxid = xeno_bind_skin_opt(skin_magic, skin, module, sighandler); struct sigaction sa; if (muxid == -1) { diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h index 09c9128..926498b 100644 --- a/include/asm-generic/syscall.h +++ b/include/asm-generic/syscall.h @@ -21,6 +21,16 @@ #define _XENO_ASM_GENERIC_SYSCALL_H #include asm/xenomai/features.h +#ifdef __KERNEL__ +#include linux/types.h +#include linux/signal.h +#include asm/uaccess.h +#include asm/xenomai/wrappers.h +#include asm/xenomai/hal.h +#else /* !__KERNEL__ */ +#include sys/types.h +#include signal.h +#endif /* !__KERNEL__ */ /* Xenomai multiplexer syscall. */ #define __xn_sys_mux 555 /* Must fit within 15bit */ @@ -35,6 +45,7 @@ #define __xn_sys_sem_heap 7 #define __xn_sys_current 8 /* threadh = xnthread_handle(cur) */ #define __xn_sys_current_info 9 /* r = xnshadow_current_info(info) */ +#define __xn_sys_get_next_sigs 10 /* only unqueue pending signals. */ #define XENOMAI_LINUX_DOMAIN 0 #define XENOMAI_XENO_DOMAIN 1 @@ -51,12 +62,20 @@ typedef struct xnsysinfo { #define sigshadow_arg(code) (((code) 8) 0xff) #define sigshadow_int(action, arg) ((action) | ((arg) 8)) -#ifdef __KERNEL__ +union xnsiginfo { + struct siginfo pse51_si; +}; -#include linux/types.h -#include asm/uaccess.h -#include asm/xenomai/wrappers.h -#include asm/xenomai/hal.h +struct xnsig { + unsigned nsigs; + unsigned remaining; + struct { + unsigned muxid; + union xnsiginfo si; + } pending[16]; +}; + +#ifdef __KERNEL__ struct task_struct; struct pt_regs; @@ -137,8 +156,33 @@ static inline int __xn_safe_strncpy_from_user(char *dst, } #else /* !__KERNEL__ */ -#include sys/types.h -#endif /* __KERNEL__ */ + +#ifdef __cplusplus +extern C +#endif /* __cplusplus */ +int __xnsig_dispatch(struct xnsig *sigs, int cumulated_error, int last_error); + +/* Called to dispatch signals which interrupted a system call. */ +static inline int xnsig_dispatch(struct xnsig *sigs, int cumul, int last) +{ + if (sigs-nsigs) + return __xnsig_dispatch(sigs, cumul, last); + return last; +} + +/* Called to dispatch additional signals (received with the special + system call __xn_sys_get_next_sigs), it may happen that this + syscall was in fact called whereas no additional signal was + pending, in this case, ignore the syscall return value (last) and + preserve the cumulated error. */ +static inline int xnsig_dispatch_next(struct xnsig *sigs, int cumul, int last) +{ + if (sigs-nsigs) + return __xnsig_dispatch(sigs, cumul, last); + return cumul; +} + +#endif /* !__KERNEL__ */ typedef struct xncompletion { long syncflag; /* Semaphore variable. */ diff --git a/src/skins/common/bind.c b/src/skins/common/bind.c index 1315840..e4a4c3c 100644 --- a/src/skins/common/bind.c +++ b/src/skins/common/bind.c @@ -9,6 +9,8 @@ #include asm-generic/xenomai/bits/current.h #include sem_heap.h +static xnsighandler *xnsig_handlers[32]; + void __attribute__((weak)) xeno_sigill_handler(int sig)
[Xenomai-git] Gilles Chanteperdrix : skins: add per-skin user-space signal handler, and dispatch function.
Module: xenomai-gch Branch: for-head Commit: b5204f9aa6d64b96f80202433d816727dc4e3743 URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=b5204f9aa6d64b96f80202433d816727dc4e3743 Author: Gilles Chanteperdrix gilles.chanteperd...@xenomai.org Date: Sun Nov 22 23:07:21 2009 +0100 skins: add per-skin user-space signal handler, and dispatch function. --- include/asm-generic/bits/bind.h | 12 ++-- include/asm-generic/syscall.h | 58 ++- src/skins/common/bind.c | 23 +++- src/skins/native/init.c |2 +- src/skins/posix/init.c |3 +- src/skins/psos+/init.c |3 +- src/skins/rtai/init.c |3 +- src/skins/rtdm/init.c |3 +- src/skins/uitron/init.c |3 +- src/skins/vrtx/init.c |2 +- src/skins/vxworks/init.c|2 +- 11 files changed, 94 insertions(+), 20 deletions(-) diff --git a/include/asm-generic/bits/bind.h b/include/asm-generic/bits/bind.h index 7da2c43..7267e0d 100644 --- a/include/asm-generic/bits/bind.h +++ b/include/asm-generic/bits/bind.h @@ -5,15 +5,21 @@ #include stdlib.h #include signal.h +union xnsiginfo; + +typedef void xnsighandler(union xnsiginfo *si); + void xeno_handle_mlock_alert(int sig); int -xeno_bind_skin_opt(unsigned skin_magic, const char *skin, const char *module); +xeno_bind_skin_opt(unsigned skin_magic, const char *skin, + const char *module, xnsighandler *sighandler); static inline int -xeno_bind_skin(unsigned skin_magic, const char *skin, const char *module) +xeno_bind_skin(unsigned skin_magic, const char *skin, + const char *module, xnsighandler *sighandler) { - int muxid = xeno_bind_skin_opt(skin_magic, skin, module); + int muxid = xeno_bind_skin_opt(skin_magic, skin, module, sighandler); struct sigaction sa; if (muxid == -1) { diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h index 09c9128..926498b 100644 --- a/include/asm-generic/syscall.h +++ b/include/asm-generic/syscall.h @@ -21,6 +21,16 @@ #define _XENO_ASM_GENERIC_SYSCALL_H #include asm/xenomai/features.h +#ifdef __KERNEL__ +#include linux/types.h +#include linux/signal.h +#include asm/uaccess.h +#include asm/xenomai/wrappers.h +#include asm/xenomai/hal.h +#else /* !__KERNEL__ */ +#include sys/types.h +#include signal.h +#endif /* !__KERNEL__ */ /* Xenomai multiplexer syscall. */ #define __xn_sys_mux 555 /* Must fit within 15bit */ @@ -35,6 +45,7 @@ #define __xn_sys_sem_heap 7 #define __xn_sys_current 8 /* threadh = xnthread_handle(cur) */ #define __xn_sys_current_info 9 /* r = xnshadow_current_info(info) */ +#define __xn_sys_get_next_sigs 10 /* only unqueue pending signals. */ #define XENOMAI_LINUX_DOMAIN 0 #define XENOMAI_XENO_DOMAIN 1 @@ -51,12 +62,20 @@ typedef struct xnsysinfo { #define sigshadow_arg(code) (((code) 8) 0xff) #define sigshadow_int(action, arg) ((action) | ((arg) 8)) -#ifdef __KERNEL__ +union xnsiginfo { + struct siginfo pse51_si; +}; -#include linux/types.h -#include asm/uaccess.h -#include asm/xenomai/wrappers.h -#include asm/xenomai/hal.h +struct xnsig { + unsigned nsigs; + unsigned remaining; + struct { + unsigned muxid; + union xnsiginfo si; + } pending[16]; +}; + +#ifdef __KERNEL__ struct task_struct; struct pt_regs; @@ -137,8 +156,33 @@ static inline int __xn_safe_strncpy_from_user(char *dst, } #else /* !__KERNEL__ */ -#include sys/types.h -#endif /* __KERNEL__ */ + +#ifdef __cplusplus +extern C +#endif /* __cplusplus */ +int __xnsig_dispatch(struct xnsig *sigs, int cumulated_error, int last_error); + +/* Called to dispatch signals which interrupted a system call. */ +static inline int xnsig_dispatch(struct xnsig *sigs, int cumul, int last) +{ + if (sigs-nsigs) + return __xnsig_dispatch(sigs, cumul, last); + return last; +} + +/* Called to dispatch additional signals (received with the special + system call __xn_sys_get_next_sigs), it may happen that this + syscall was in fact called whereas no additional signal was + pending, in this case, ignore the syscall return value (last) and + preserve the cumulated error. */ +static inline int xnsig_dispatch_next(struct xnsig *sigs, int cumul, int last) +{ + if (sigs-nsigs) + return __xnsig_dispatch(sigs, cumul, last); + return cumul; +} + +#endif /* !__KERNEL__ */ typedef struct xncompletion { long syncflag; /* Semaphore variable. */ diff --git a/src/skins/common/bind.c b/src/skins/common/bind.c index 1315840..e4a4c3c 100644 --- a/src/skins/common/bind.c +++ b/src/skins/common/bind.c @@ -9,6 +9,8 @@ #include asm-generic/xenomai/bits/current.h #include sem_heap.h +static xnsighandler *xnsig_handlers[32]; + void __attribute__((weak)) xeno_sigill_handler(int sig)
[Xenomai-git] Gilles Chanteperdrix : skins: add per-skin user-space signal handler, and dispatch function.
Module: xenomai-gch Branch: for-head Commit: f01fa99b5e0764ea0805259ce9144ae655aa3231 URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=f01fa99b5e0764ea0805259ce9144ae655aa3231 Author: Gilles Chanteperdrix gilles.chanteperd...@xenomai.org Date: Sun Nov 22 23:07:21 2009 +0100 skins: add per-skin user-space signal handler, and dispatch function. --- include/asm-generic/bits/bind.h | 12 ++-- include/asm-generic/syscall.h | 55 ++- src/skins/common/bind.c | 23 +++- src/skins/native/init.c |2 +- src/skins/posix/init.c |3 +- src/skins/psos+/init.c |3 +- src/skins/rtai/init.c |3 +- src/skins/rtdm/init.c |3 +- src/skins/uitron/init.c |3 +- src/skins/vrtx/init.c |2 +- src/skins/vxworks/init.c|2 +- 11 files changed, 91 insertions(+), 20 deletions(-) diff --git a/include/asm-generic/bits/bind.h b/include/asm-generic/bits/bind.h index 7da2c43..7267e0d 100644 --- a/include/asm-generic/bits/bind.h +++ b/include/asm-generic/bits/bind.h @@ -5,15 +5,21 @@ #include stdlib.h #include signal.h +union xnsiginfo; + +typedef void xnsighandler(union xnsiginfo *si); + void xeno_handle_mlock_alert(int sig); int -xeno_bind_skin_opt(unsigned skin_magic, const char *skin, const char *module); +xeno_bind_skin_opt(unsigned skin_magic, const char *skin, + const char *module, xnsighandler *sighandler); static inline int -xeno_bind_skin(unsigned skin_magic, const char *skin, const char *module) +xeno_bind_skin(unsigned skin_magic, const char *skin, + const char *module, xnsighandler *sighandler) { - int muxid = xeno_bind_skin_opt(skin_magic, skin, module); + int muxid = xeno_bind_skin_opt(skin_magic, skin, module, sighandler); struct sigaction sa; if (muxid == -1) { diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h index 09c9128..157a97c 100644 --- a/include/asm-generic/syscall.h +++ b/include/asm-generic/syscall.h @@ -21,6 +21,16 @@ #define _XENO_ASM_GENERIC_SYSCALL_H #include asm/xenomai/features.h +#ifdef __KERNEL__ +#include linux/types.h +#include linux/signal.h +#include asm/uaccess.h +#include asm/xenomai/wrappers.h +#include asm/xenomai/hal.h +#else /* !__KERNEL__ */ +#include sys/types.h +#include signal.h +#endif /* !__KERNEL__ */ /* Xenomai multiplexer syscall. */ #define __xn_sys_mux 555 /* Must fit within 15bit */ @@ -35,6 +45,7 @@ #define __xn_sys_sem_heap 7 #define __xn_sys_current 8 /* threadh = xnthread_handle(cur) */ #define __xn_sys_current_info 9 /* r = xnshadow_current_info(info) */ +#define __xn_sys_get_next_sigs 10 /* only unqueue pending signals. */ #define XENOMAI_LINUX_DOMAIN 0 #define XENOMAI_XENO_DOMAIN 1 @@ -51,12 +62,20 @@ typedef struct xnsysinfo { #define sigshadow_arg(code) (((code) 8) 0xff) #define sigshadow_int(action, arg) ((action) | ((arg) 8)) -#ifdef __KERNEL__ +union xnsiginfo { + struct siginfo pse51_si; +}; -#include linux/types.h -#include asm/uaccess.h -#include asm/xenomai/wrappers.h -#include asm/xenomai/hal.h +struct xnsig { + unsigned nsigs; + unsigned remaining; + struct { + unsigned muxid; + union xnsiginfo si; + } pending[16]; +}; + +#ifdef __KERNEL__ struct task_struct; struct pt_regs; @@ -137,8 +156,30 @@ static inline int __xn_safe_strncpy_from_user(char *dst, } #else /* !__KERNEL__ */ -#include sys/types.h -#endif /* __KERNEL__ */ + +int __xnsig_dispatch(struct xnsig *sigs, int cumulated_error, int last_error); + +/* Called to dispatch signals which interrupted a system call. */ +static inline int xnsig_dispatch(struct xnsig *sigs, int cumul, int last) +{ + if (sigs-nsigs) + return __xnsig_dispatch(sigs, cumul, last); + return last; +} + +/* Called to dispatch additional signals (received with the special + system call __xn_sys_get_next_sigs), it may happen that this + syscall was in fact called whereas no additional signal was + pending, in this case, ignore the syscall return value (last) and + preserve the cumulated error. */ +static inline int xnsig_dispatch_next(struct xnsig *sigs, int cumul, int last) +{ + if (sigs-nsigs) + return __xnsig_dispatch(sigs, cumul, last); + return cumul; +} + +#endif /* !__KERNEL__ */ typedef struct xncompletion { long syncflag; /* Semaphore variable. */ diff --git a/src/skins/common/bind.c b/src/skins/common/bind.c index 1775f17..b8883d9 100644 --- a/src/skins/common/bind.c +++ b/src/skins/common/bind.c @@ -8,6 +8,8 @@ #include asm-generic/xenomai/bits/bind.h #include sem_heap.h +static xnsighandler *xnsig_handlers[32]; + void __attribute__((weak)) xeno_sigill_handler(int sig) { fprintf(stderr, Xenomai or