Jan Kiszka wrote: > Gilles Chanteperdrix wrote: >> Jan Kiszka wrote: >>> Gilles Chanteperdrix wrote: >>>> Hi, >>>> >>>> on some (all ?) platforms, we get a SIGILL when trying to emit the first >>> I don't see this on x86, though. >>> >>>> Xenomai syscall, instead of the -ENOSYS return value. This patches >>>> handles the SIGILL by printing an error message and exiting. >>>> >>>> Index: include/asm-generic/bits/bind.h >>>> =================================================================== >>>> --- include/asm-generic/bits/bind.h (revision 4175) >>>> +++ include/asm-generic/bits/bind.h (working copy) >>>> @@ -9,6 +9,7 @@ >>>> #include <signal.h> >>>> #include <pthread.h> >>>> #include <fcntl.h> >>>> +#include <setjmp.h> >>>> #include <sys/ioctl.h> >>>> #include <sys/mman.h> >>>> #include <asm/xenomai/syscall.h> >>>> @@ -17,6 +18,8 @@ __attribute__ ((weak)) >>>> pthread_key_t xeno_current_key; >>>> __attribute__ ((weak)) >>>> pthread_once_t xeno_init_current_key_once = PTHREAD_ONCE_INIT; >>>> +__attribute__ ((weak)) >>>> +jmp_buf xeno_sigill_jmpbuf; >>>> >>>> __attribute__ ((weak)) >>>> void xeno_set_current(void) >>>> @@ -99,13 +102,28 @@ static void unmap_sem_heap(unsigned long >>>> } >>>> #endif /* CONFIG_XENO_FASTSEM */ >>>> >>>> +void __attribute__((weak)) xeno_sigill_handler(int sig) >>>> +{ >>>> + siglongjmp(xeno_sigill_jmpbuf, 1); >>>> +} >>>> + >>> Just one question: Can we safely assume that sigsetjmp&siglongjump are >>> always available, also in uclibc environments e.g.? >> Ok. We can use setjmp/longjmp and assume that only SIGILL is masked at >> the longjmp call site ? > > Hmm, good question. But maybe this is a non-issue and sig{set|long}jmp > is actually always available (these days). On first glance, ucLibc seems > to have an implementation.
We can also manually save and restore the signal mask. > > Alternative idea: What about defining a common xenomai_does_not_exist > service that warns and terminates? It could be called it both on ENOSYS > and from the signal handler. Yes, but in the xeno_bind_skin_opt case, we are expected to return a status, and not exit. So, longjmp is the only way... Unless we accept to exit in the SIGILL case. -- Gilles. _______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core