Switch MIPS TLS implementation to Variant I:

Save pointer to the TLS structure taking into account TP_OFFSET
and TCB structure size.
This commit is contained in:
Oleksandr Tymoshenko 2012-02-10 06:53:25 +00:00
parent f44d97bd0c
commit dda3ee8770
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=231350
2 changed files with 20 additions and 13 deletions

View File

@ -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;

View File

@ -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 initial)
{
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);
}