Index: sys/arm/arm/trap-v6.c =================================================================== --- sys/arm/arm/trap-v6.c +++ sys/arm/arm/trap-v6.c @@ -28,6 +28,7 @@ */ #include "opt_ktrace.h" +#include "opt_compat.h" #include __FBSDID("$FreeBSD$"); @@ -58,6 +59,10 @@ #include #include +#ifdef COMPAT_LINUX +#include +#endif + #ifdef KDB #include #include @@ -501,6 +506,16 @@ abort_fatal(tf, idx, fsr, far, prefetch, td, &ksig); return; } +#ifdef COMPAT_LINUX + else + { + if (far == LINUX_GETTLS_HELPER) { + tf->tf_r0 = linux_get_tls(td); + tf->tf_pc = tf->tf_r14; + goto out; + } + } +#endif /* COMPAT_LINUX */ ksig.sig = SIGSEGV; ksig.code = (rv == KERN_PROTECTION_FAILURE) ? SEGV_ACCERR : SEGV_MAPERR; Index: sys/arm/linux/linux.h =================================================================== --- sys/arm/linux/linux.h +++ sys/arm/linux/linux.h @@ -588,4 +588,8 @@ struct linux_robust_list *pending_list; }; +#define LINUX_GETTLS_HELPER 0xffff0fe0 + +uint32_t linux_get_tls(struct thread *td); + #endif /* !_ARM_LINUX_H_ */ Index: sys/arm/linux/linux_machdep.c =================================================================== --- sys/arm/linux/linux_machdep.c +++ sys/arm/linux/linux_machdep.c @@ -806,4 +806,11 @@ set_tls(args->tls); return (0); -} \ No newline at end of file +} + +uint32_t +linux_get_tls(struct thread *td) +{ + + return (td->td_md.md_tp); +}