static void low_init(void) { sighandler_t old_sigill_handler; struct cobalt_bindreq breq; struct cobalt_featinfo *f; int ret; if (mlockall(MCL_CURRENT | MCL_FUTURE)) { report_error("mlockall: %s", strerror(errno)); exit(EXIT_FAILURE); } old_sigill_handler = signal(SIGILL, sigill_handler); if (old_sigill_handler == SIG_ERR) { report_error("signal(SIGILL): %s", strerror(errno)); exit(EXIT_FAILURE); } f = &breq.feat_ret; breq.feat_req = XENOMAI_FEAT_DEP; if (__cobalt_control_bind) breq.feat_req |= __xn_feat_control; breq.abi_rev = XENOMAI_ABI_REV; ret = XENOMAI_SYSBIND(&breq); signal(SIGILL, old_sigill_handler); switch (ret) { case 0: break; case -EINVAL: report_error("incompatible feature set"); report_error_cont("(userland requires \"%s\", kernel provides \"%s\", missing=\"%s\")", f->feat_man_s, f->feat_all_s, f->feat_mis_s); exit(EXIT_FAILURE); case -ENOEXEC: report_error("incompatible ABI revision level"); report_error_cont("(user-space requires '%lu', kernel provides '%lu')", XENOMAI_ABI_REV, f->feat_abirev); exit(EXIT_FAILURE); default: report_error("binding failed: %s", strerror(-ret)); exit(EXIT_FAILURE); } cobalt_check_features(f); cobalt_init_umm(f->vdso_offset); cobalt_init_current_keys(); cobalt_ticks_init(f->clock_freq); }
void __init_posix_interface(void) { struct xnbindreq breq; #ifndef CONFIG_XENO_LIBS_DLOPEN struct sched_param parm; int policy; #endif /* !CONFIG_XENO_LIBS_DLOPEN */ int muxid, err; rt_print_auto_init(1); muxid = xeno_bind_skin(PSE51_SKIN_MAGIC, "POSIX", "xeno_posix"); pse51_clock_init(muxid); __pse51_muxid = __xn_mux_shifted_id(muxid); breq.feat_req = XENOMAI_FEAT_DEP; breq.abi_rev = XENOMAI_ABI_REV; muxid = XENOMAI_SYSBIND(RTDM_SKIN_MAGIC, &breq); if (muxid > 0) { __rtdm_muxid = __xn_mux_shifted_id(muxid); __rtdm_fd_start = FD_SETSIZE - XENOMAI_SKINCALL0(__rtdm_muxid, __rtdm_fdcount); } /* If not dlopening, we are going to shadow the main thread, so mlock the whole memory for the time of the syscall, in order to avoid the SIGXCPU signal. */ #if defined(CONFIG_XENO_POSIX_AUTO_MLOCKALL) || !defined(CONFIG_XENO_LIBS_DLOPEN) if (mlockall(MCL_CURRENT | MCL_FUTURE)) { perror("Xenomai Posix skin init: mlockall"); exit(EXIT_FAILURE); } #endif /* auto mlockall || !dlopen */ /* Don't use auto-shadowing if we are likely invoked from dlopen. */ #ifndef CONFIG_XENO_LIBS_DLOPEN err = __STD(pthread_getschedparam(pthread_self(), &policy, &parm)); if (err) { fprintf(stderr, "Xenomai Posix skin init: " "pthread_getschedparam: %s\n", strerror(err)); exit(EXIT_FAILURE); } err = __wrap_pthread_setschedparam(pthread_self(), policy, &parm); if (err) { fprintf(stderr, "Xenomai Posix skin init: " "pthread_setschedparam: %s\n", strerror(err)); exit(EXIT_FAILURE); } #ifndef CONFIG_XENO_POSIX_AUTO_MLOCKALL if (munlockall()) { perror("Xenomai Posix skin init: munlockall"); exit(EXIT_FAILURE); } #endif /* !CONFIG_XENO_POSIX_AUTO_MLOCKALL */ #endif /* !CONFIG_XENO_LIBS_DLOPEN */ if (fork_handler_registered) return; err = pthread_atfork(NULL, NULL, &__init_posix_interface); if (err) { fprintf(stderr, "Xenomai Posix skin init: " "pthread_atfork: %s\n", strerror(err)); exit(EXIT_FAILURE); } fork_handler_registered = 1; if (sizeof(struct __shadow_mutex) > sizeof(pthread_mutex_t)) { fprintf(stderr, "sizeof(pthread_mutex_t): %d <" " sizeof(shadow_mutex): %d !\n", (int) sizeof(pthread_mutex_t), (int) sizeof(struct __shadow_mutex)); exit(EXIT_FAILURE); } }
static __constructor__ void __init_posix_interface(void) { struct sched_param parm; int policy; int muxid, err; const char *noshadow; rt_print_auto_init(1); muxid = xeno_bind_skin(PSE51_SKIN_MAGIC, "POSIX", "xeno_posix"); #ifdef XNARCH_HAVE_NONPRIV_TSC pse51_clock_init(muxid); #endif /* XNARCH_HAVE_NONPRIV_TSC */ __pse51_muxid = __xn_mux_shifted_id(muxid); muxid = XENOMAI_SYSBIND(RTDM_SKIN_MAGIC, XENOMAI_FEAT_DEP, XENOMAI_ABI_REV, NULL); if (muxid > 0) { __pse51_rtdm_muxid = __xn_mux_shifted_id(muxid); __pse51_rtdm_fd_start = FD_SETSIZE - XENOMAI_SKINCALL0(__pse51_rtdm_muxid, __rtdm_fdcount); } pse51_mutex_init(); noshadow = getenv("XENO_NOSHADOW"); if ((!noshadow || !*noshadow) && xeno_get_current() == XN_NO_HANDLE) { err = __real_pthread_getschedparam(pthread_self(), &policy, &parm); if (err) { fprintf(stderr, "Xenomai Posix skin init: " "pthread_getschedparam: %s\n", strerror(err)); exit(EXIT_FAILURE); } err = __wrap_pthread_setschedparam(pthread_self(), policy, &parm); if (err) { fprintf(stderr, "Xenomai Posix skin init: " "pthread_setschedparam: %s\n", strerror(err)); exit(EXIT_FAILURE); } } if (fork_handler_registered) return; err = pthread_atfork(NULL, NULL, &__init_posix_interface); if (err) { fprintf(stderr, "Xenomai Posix skin init: " "pthread_atfork: %s\n", strerror(err)); exit(EXIT_FAILURE); } fork_handler_registered = 1; if (sizeof(struct __shadow_mutex) > sizeof(pthread_mutex_t)) { fprintf(stderr, "sizeof(pthread_mutex_t): %d <" " sizeof(shadow_mutex): %d !\n", (int) sizeof(pthread_mutex_t), (int) sizeof(struct __shadow_mutex)); exit(EXIT_FAILURE); } }
int xeno_bind_skin_opt(unsigned skin_magic, const char *skin, const char *module) { sighandler_t old_sigill_handler; xnfeatinfo_t finfo; int muxid; /* Some sanity checks first. */ if (access(XNHEAP_DEV_NAME, 0)) { fprintf(stderr, "Xenomai: %s is missing\n(chardev, major=10 minor=%d)\n", XNHEAP_DEV_NAME, XNHEAP_DEV_MINOR); exit(EXIT_FAILURE); } old_sigill_handler = signal(SIGILL, xeno_sigill_handler); if (old_sigill_handler == SIG_ERR) { perror("signal(SIGILL)"); exit(EXIT_FAILURE); } muxid = XENOMAI_SYSBIND(skin_magic, XENOMAI_FEAT_DEP, XENOMAI_ABI_REV, &finfo); signal(SIGILL, old_sigill_handler); switch (muxid) { case -EINVAL: fprintf(stderr, "Xenomai: incompatible feature set\n"); fprintf(stderr, "(userland requires \"%s\", kernel provides \"%s\", missing=\"%s\").\n", finfo.feat_man_s, finfo.feat_all_s, finfo.feat_mis_s); exit(EXIT_FAILURE); case -ENOEXEC: fprintf(stderr, "Xenomai: incompatible ABI revision level\n"); fprintf(stderr, "(user-space requires '%lu', kernel provides '%lu').\n", XENOMAI_ABI_REV, finfo.feat_abirev); exit(EXIT_FAILURE); case -ENOSYS: case -ESRCH: return -1; } if (muxid < 0) { fprintf(stderr, "Xenomai: binding failed: %s.\n", strerror(-muxid)); exit(EXIT_FAILURE); } if (mlockall(MCL_CURRENT | MCL_FUTURE)) { perror("Xenomai: mlockall"); exit(EXIT_FAILURE); } xeno_featinfo = finfo; xeno_init_arch_features(); xeno_init_sem_heaps(); xeno_init_current_keys(); xeno_main_tid = pthread_self(); xeno_init_timeconv(muxid); return muxid; }