tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: pthread_getspecific without prior pthread_setspecific
The patch below seems to toggle between crash (#if 1) and working (#if 0).
Matt: we verified some time ago that rdhwr works in principle, but something
must go wrong somewhere (tm).
Testcase: invoke gdb (no params), if you get to the (gdb) prompt, it works.
Carefull: for testing you need to replace both libpthread.so and ld.elf_so!
Martin
Index: mcontext.h
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/include/mcontext.h,v
retrieving revision 1.20
diff -u -r1.20 mcontext.h
--- mcontext.h 12 Sep 2012 15:09:49 -0000 1.20
+++ mcontext.h 19 May 2015 15:25:45 -0000
@@ -195,11 +195,15 @@
__CTASSERT(TLS_TP_OFFSET + sizeof(struct tls_tcb) < 0x8000);
__CTASSERT(TLS_TP_OFFSET % sizeof(struct tls_tcb) == 0);
+void _lwp_setprivate(void *);
+void *_lwp_getprivate(void);
+
static __inline struct tls_tcb *
__lwp_gettcb_fast(void)
{
struct tls_tcb *__tcb;
+#if 1
/*
* Only emit a rdhwr $3, $29 so the kernel can quickly emulate it.
*/
@@ -213,11 +217,13 @@
: [__tcb]"=r"(__tcb)
: [__offset]"n"(-(TLS_TP_OFFSET + sizeof(*__tcb)))
: "v1");
+#else
+ __tcb = _lwp_getprivate();
+ __tcb -= TLS_TP_OFFSET / sizeof(*__tcb) + 1;
+#endif
return __tcb;
}
-void _lwp_setprivate(void *);
-
static inline void
__lwp_settcb(struct tls_tcb *__tcb)
{
Home |
Main Index |
Thread Index |
Old Index