NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: lib/41891: our pthread doesn't like wine 1.1.27
the following patch implements pthread_self using %gs register for i386.
YAMAMOTO Takashi
Index: lib/libc/arch/i386/gen/_lwp.c
===================================================================
RCS file: /cvsroot/src/lib/libc/arch/i386/gen/_lwp.c,v
retrieving revision 1.6
diff -u -p -r1.6 _lwp.c
--- lib/libc/arch/i386/gen/_lwp.c 28 Apr 2008 20:22:56 -0000 1.6
+++ lib/libc/arch/i386/gen/_lwp.c 16 Aug 2009 07:20:40 -0000
@@ -66,5 +66,11 @@ _lwp_makecontext(ucontext_t *u, void (*s
/* LINTED uintptr_t is safe */
u->uc_mcontext.__gregs[_REG_UESP] = (uintptr_t) sp;
- /* LINTED private is currently unused */
+ /*
+ * abuse _REG_ESP to pass the private pointer.
+ * cf. cpu_setmcontext
+ */
+ /* LINTED uintptr_t is safe */
+ u->uc_mcontext.__gregs[_REG_ESP] = (uintptr_t)private;
+ u->uc_flags |= _UC_LWPPRIVATE;
}
Index: sys/sys/ucontext.h
===================================================================
RCS file: /cvsroot/src/sys/sys/ucontext.h,v
retrieving revision 1.11
diff -u -p -r1.11 ucontext.h
--- sys/sys/ucontext.h 15 Oct 2008 06:51:21 -0000 1.11
+++ sys/sys/ucontext.h 16 Aug 2009 07:20:40 -0000
@@ -57,6 +57,7 @@ struct __ucontext {
#define _UC_STACK 0x02 /* valid uc_stack */
#define _UC_CPU 0x04 /* valid GPR context in
uc_mcontext */
#define _UC_FPU 0x08 /* valid FPU context in
uc_mcontext */
+#define _UC_LWPPRIVATE 0x10 /* valid lwp private in uc_mcontext */
#ifdef _KERNEL
struct lwp;
Index: sys/arch/i386/i386/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/i386/machdep.c,v
retrieving revision 1.670
diff -u -p -r1.670 machdep.c
--- sys/arch/i386/i386/machdep.c 29 Jul 2009 12:02:05 -0000 1.670
+++ sys/arch/i386/i386/machdep.c 16 Aug 2009 07:20:41 -0000
@@ -1833,6 +1833,14 @@ cpu_setmcontext(struct lwp *l, const mco
tf->tf_esp = gr[_REG_UESP];
tf->tf_ss = gr[_REG_SS];
}
+ if ((flags & _UC_LWPPRIVATE) != 0) {
+ /*
+ * abuse _REG_ESP for the private pointer.
+ * cf. _lwp_makecontext
+ */
+ l->l_private = (void *)gr[_REG_ESP];
+ cpu_lwp_setprivate(l, l->l_private);
+ }
#if NNPX > 0
/*
Index: lib/libpthread/pthread_int.h
===================================================================
RCS file: /cvsroot/src/lib/libpthread/pthread_int.h,v
retrieving revision 1.72
diff -u -p -r1.72 pthread_int.h
--- lib/libpthread/pthread_int.h 17 May 2009 14:49:00 -0000 1.72
+++ lib/libpthread/pthread_int.h 16 Aug 2009 07:20:41 -0000
@@ -253,7 +253,9 @@ int pthread__find(pthread_t) PTHREAD_HID
#define pthread__id(sp) \
((pthread_t) (((vaddr_t)(sp)) & pthread__threadmask))
-#ifdef PTHREAD__HAVE_THREADREG
+#if defined(PTHREAD__HAVE_MD_PTHREAD_SELF)
+#define pthread__self() pthread__md_self()
+#elif defined(PTHREAD__HAVE_THREADREG)
#define pthread__self() pthread__threadreg_get()
#else
#define pthread__self() (pthread__id(pthread__sp()))
Index: lib/libpthread/arch/i386/pthread_md.h
===================================================================
RCS file: /cvsroot/src/lib/libpthread/arch/i386/pthread_md.h,v
retrieving revision 1.17
diff -u -p -r1.17 pthread_md.h
--- lib/libpthread/arch/i386/pthread_md.h 16 May 2009 22:20:40 -0000
1.17
+++ lib/libpthread/arch/i386/pthread_md.h 16 Aug 2009 07:20:41 -0000
@@ -46,6 +46,16 @@ pthread__sp(void)
#define pthread__uc_sp(ucp) ((ucp)->uc_mcontext.__gregs[_REG_UESP])
+static inline pthread_t
+pthread__md_self(void)
+{
+ void *ret;
+
+ /* 0 == offsetof(pthread_t, pt_self) */
+ __asm("movl %%gs:0, %0" : "=r" (ret));
+ return ret;
+}
+
/*
* Set initial, sane values for registers whose values aren't just
* "don't care".
@@ -80,6 +90,8 @@ pthread__sp(void)
/* Don't need additional memory barriers. */
#define PTHREAD__ATOMIC_IS_MEMBAR
+#define PTHREAD__HAVE_MD_PTHREAD_SELF
+
static inline pthread_t
#ifdef __GNUC__
__attribute__ ((__const__))
Home |
Main Index |
Thread Index |
Old Index