svn commit: r231350 - in head/lib/libthr/arch/mips: include mips
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Fri Feb 10 06:53:26 UTC 2012
Author: gonzo
Date: Fri Feb 10 06:53:25 2012
New Revision: 231350
URL: http://svn.freebsd.org/changeset/base/231350
Log:
Switch MIPS TLS implementation to Variant I:
Save pointer to the TLS structure taking into account TP_OFFSET
and TCB structure size.
Modified:
head/lib/libthr/arch/mips/include/pthread_md.h
head/lib/libthr/arch/mips/mips/pthread_md.c
Modified: head/lib/libthr/arch/mips/include/pthread_md.h
==============================================================================
--- head/lib/libthr/arch/mips/include/pthread_md.h Fri Feb 10 06:44:30 2012 (r231349)
+++ head/lib/libthr/arch/mips/include/pthread_md.h Fri Feb 10 06:53:25 2012 (r231350)
@@ -39,15 +39,19 @@
#define CPU_SPINWAIT
#define DTV_OFFSET offsetof(struct tcb, tcb_dtv)
+#ifdef __mips_n64
+#define TP_OFFSET 0x7010
+#else
+#define TP_OFFSET 0x7008
+#endif
/*
- * Variant II tcb, first two members are required by rtld.
+ * Variant I tcb. The structure layout is fixed, don't blindly
+ * change it!
*/
struct tcb {
- struct tcb *tcb_self; /* required by rtld */
- void *tcb_dtv; /* required by rtld */
- struct pthread *tcb_thread; /* our hook */
- void *tcb_spare[1];
+ void *tcb_dtv;
+ struct pthread *tcb_thread;
};
/*
@@ -61,7 +65,7 @@ static __inline void
_tcb_set(struct tcb *tcb)
{
- sysarch(MIPS_SET_TLS, tcb);
+ sysarch(MIPS_SET_TLS, ((uint8_t*)tcb + TP_OFFSET));
}
/*
@@ -70,10 +74,10 @@ _tcb_set(struct tcb *tcb)
static __inline struct tcb *
_tcb_get(void)
{
- void *tcb;
+ uint8_t *tcb;
sysarch(MIPS_GET_TLS, &tcb);
- return tcb;
+ return ((struct tcb *)(tcb - TP_OFFSET));
}
extern struct pthread *_thr_initial;
Modified: head/lib/libthr/arch/mips/mips/pthread_md.c
==============================================================================
--- head/lib/libthr/arch/mips/mips/pthread_md.c Fri Feb 10 06:44:30 2012 (r231349)
+++ head/lib/libthr/arch/mips/mips/pthread_md.c Fri Feb 10 06:53:25 2012 (r231350)
@@ -34,6 +34,8 @@ __FBSDID("$FreeBSD$");
#include <rtld_tls.h>
#include <strings.h>
+#include <machine/sysarch.h>
+
#include "pthread_md.h"
struct tcb *
@@ -41,16 +43,17 @@ _tcb_ctor(struct pthread *thread, int in
{
struct tcb *tcb;
- tcb = malloc(sizeof(struct tcb));
- if (tcb) {
- bzero(tcb, sizeof(struct tcb));
+ tcb = _rtld_allocate_tls((initial) ? _tcb_get() : NULL,
+ sizeof(struct tcb), 16);
+ if (tcb)
tcb->tcb_thread = thread;
- }
+
return (tcb);
}
void
_tcb_dtor(struct tcb *tcb)
{
- free(tcb);
+
+ _rtld_free_tls(tcb, sizeof(struct tcb), 16);
}
More information about the svn-src-head
mailing list