[Xenomai-core] [PATCH 2/3] skins: fault the main thread stack when shadowing it.
--- include/asm-generic/bits/bind.h |2 ++ src/skins/common/bind.c | 14 ++ src/skins/native/task.c |2 ++ src/skins/posix/thread.c|2 ++ src/skins/psos+/task.c |2 ++ src/skins/uitron/task.c |9 +++-- 6 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/asm-generic/bits/bind.h b/include/asm-generic/bits/bind.h index 7267e0d..f43e096 100644 --- a/include/asm-generic/bits/bind.h +++ b/include/asm-generic/bits/bind.h @@ -37,4 +37,6 @@ xeno_bind_skin(unsigned skin_magic, const char *skin, return muxid; } +void xeno_fault_stack(void); + #endif /* _XENO_ASM_GENERIC_BITS_BIND_H */ diff --git a/src/skins/common/bind.c b/src/skins/common/bind.c index 44017e8..0717ac1 100644 --- a/src/skins/common/bind.c +++ b/src/skins/common/bind.c @@ -7,8 +7,10 @@ #include #include #include +#include #include "sem_heap.h" +static pthread_t xeno_main_tid; static xnsighandler *xnsig_handlers[32]; void __attribute__((weak)) xeno_sigill_handler(int sig) @@ -133,5 +135,17 @@ xeno_bind_skin_opt(unsigned skin_magic, const char *skin, xeno_featinfo = finfo; + xeno_main_tid = pthread_self(); + return muxid; } + +void xeno_fault_stack(void) +{ + char stk[xeno_stacksize(1)]; + + if (pthread_self() != xeno_main_tid) + return; + + stk[0] = stk[sizeof(stk) - 1] = 0xA5; +} diff --git a/src/skins/native/task.c b/src/skins/native/task.c index 341e4d8..e0b3bbd 100644 --- a/src/skins/native/task.c +++ b/src/skins/native/task.c @@ -187,6 +187,8 @@ int rt_task_shadow(RT_TASK *task, const char *name, int prio, int mode) RT_TASK *self; int err; + xeno_fault_stack(); + #ifdef HAVE___THREAD self = &__native_self; #else /* !HAVE___THREAD */ diff --git a/src/skins/posix/thread.c b/src/skins/posix/thread.c index 9115a58..dcc9373 100644 --- a/src/skins/posix/thread.c +++ b/src/skins/posix/thread.c @@ -43,6 +43,8 @@ int __wrap_pthread_setschedparam(pthread_t thread, int err, promoted; if (thread == myself) { + xeno_fault_stack(); + #ifdef HAVE___THREAD mode_buf = xeno_init_current_mode(); #else /* !HAVE___THREAD */ diff --git a/src/skins/psos+/task.c b/src/skins/psos+/task.c index b5f36d2..4325a97 100644 --- a/src/skins/psos+/task.c +++ b/src/skins/psos+/task.c @@ -172,6 +172,8 @@ u_long t_shadow(const char *name, /* Xenomai extension. */ struct psos_arg_bulk bulk; int ret; + xeno_fault_stack(); + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); sigshadow_install_once(); diff --git a/src/skins/uitron/task.c b/src/skins/uitron/task.c index 69022c2..ed91a09 100644 --- a/src/skins/uitron/task.c +++ b/src/skins/uitron/task.c @@ -23,11 +23,14 @@ #include #include #include + #include #include +#include +#include +#include #include #include -#include extern int __uitron_muxid; @@ -149,7 +152,9 @@ ER shd_tsk(ID tskid, T_CTSK *pk_ctsk) /* Xenomai extension. */ { struct sched_param param; int policy, err; - + + xeno_fault_stack(); + /* Make sure the POSIX library caches the right priority. */ policy = uitron_task_set_posix_priority(pk_ctsk->itskpri, ¶m); pthread_setschedparam(pthread_self(), policy, ¶m); -- 1.5.6.5 ___ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core
[Xenomai-core] [PATCH 2/3] skins: fault the main thread stack when shadowing it.
--- include/asm-generic/bits/bind.h |2 ++ src/skins/common/bind.c | 14 ++ src/skins/native/task.c |2 ++ src/skins/posix/thread.c|2 ++ src/skins/psos+/task.c |2 ++ src/skins/uitron/task.c |9 +++-- 6 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/asm-generic/bits/bind.h b/include/asm-generic/bits/bind.h index 7267e0d..f43e096 100644 --- a/include/asm-generic/bits/bind.h +++ b/include/asm-generic/bits/bind.h @@ -37,4 +37,6 @@ xeno_bind_skin(unsigned skin_magic, const char *skin, return muxid; } +void xeno_fault_stack(void); + #endif /* _XENO_ASM_GENERIC_BITS_BIND_H */ diff --git a/src/skins/common/bind.c b/src/skins/common/bind.c index 44017e8..0717ac1 100644 --- a/src/skins/common/bind.c +++ b/src/skins/common/bind.c @@ -7,8 +7,10 @@ #include #include #include +#include #include "sem_heap.h" +static pthread_t xeno_main_tid; static xnsighandler *xnsig_handlers[32]; void __attribute__((weak)) xeno_sigill_handler(int sig) @@ -133,5 +135,17 @@ xeno_bind_skin_opt(unsigned skin_magic, const char *skin, xeno_featinfo = finfo; + xeno_main_tid = pthread_self(); + return muxid; } + +void xeno_fault_stack(void) +{ + char stk[xeno_stacksize(1)]; + + if (pthread_self() != xeno_main_tid) + return; + + stk[0] = stk[sizeof(stk) - 1] = 0xA5; +} diff --git a/src/skins/native/task.c b/src/skins/native/task.c index 341e4d8..e0b3bbd 100644 --- a/src/skins/native/task.c +++ b/src/skins/native/task.c @@ -187,6 +187,8 @@ int rt_task_shadow(RT_TASK *task, const char *name, int prio, int mode) RT_TASK *self; int err; + xeno_fault_stack(); + #ifdef HAVE___THREAD self = &__native_self; #else /* !HAVE___THREAD */ diff --git a/src/skins/posix/thread.c b/src/skins/posix/thread.c index 9115a58..dcc9373 100644 --- a/src/skins/posix/thread.c +++ b/src/skins/posix/thread.c @@ -43,6 +43,8 @@ int __wrap_pthread_setschedparam(pthread_t thread, int err, promoted; if (thread == myself) { + xeno_fault_stack(); + #ifdef HAVE___THREAD mode_buf = xeno_init_current_mode(); #else /* !HAVE___THREAD */ diff --git a/src/skins/psos+/task.c b/src/skins/psos+/task.c index b5f36d2..4325a97 100644 --- a/src/skins/psos+/task.c +++ b/src/skins/psos+/task.c @@ -172,6 +172,8 @@ u_long t_shadow(const char *name, /* Xenomai extension. */ struct psos_arg_bulk bulk; int ret; + xeno_fault_stack(); + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); sigshadow_install_once(); diff --git a/src/skins/uitron/task.c b/src/skins/uitron/task.c index 69022c2..ed91a09 100644 --- a/src/skins/uitron/task.c +++ b/src/skins/uitron/task.c @@ -23,11 +23,14 @@ #include #include #include + #include #include +#include +#include +#include #include #include -#include extern int __uitron_muxid; @@ -149,7 +152,9 @@ ER shd_tsk(ID tskid, T_CTSK *pk_ctsk) /* Xenomai extension. */ { struct sched_param param; int policy, err; - + + xeno_fault_stack(); + /* Make sure the POSIX library caches the right priority. */ policy = uitron_task_set_posix_priority(pk_ctsk->itskpri, ¶m); pthread_setschedparam(pthread_self(), policy, ¶m); -- 1.5.6.5 ___ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core