PERFORCE change 71819 for review
David Xu
davidxu at FreeBSD.org
Fri Feb 25 13:19:38 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=71819
Change 71819 by davidxu at davidxu_tiger on 2005/02/25 13:19:07
Sync with newest rtld tls code.
Affected files ...
.. //depot/projects/davidxu_thread/src/lib/libthread/arch/alpha/include/pthread_md.h#5 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/arch/ia64/ia64/pthread_md.c#4 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/arch/ia64/include/pthread_md.h#6 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/arch/powerpc/include/pthread_md.h#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/arch/powerpc/powerpc/pthread_md.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/arch/sparc64/include/pthread_md.h#5 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/arch/sparc64/sparc64/pthread_md.c#4 edit
Differences ...
==== //depot/projects/davidxu_thread/src/lib/libthread/arch/alpha/include/pthread_md.h#5 (text+ko) ====
@@ -32,32 +32,15 @@
#include <stddef.h>
#include <sys/types.h>
-#define DTV_OFFSET offsetof(struct tcb, tcb_tp.tp_tdv)
+#define DTV_OFFSET offsetof(struct tcb, tcb_dtv)
-struct pthread;
-struct tcb;
-struct tdv; /* We don't know what this is yet? */
-
-/*
- * tp points to one of these. We define the static TLS as an array
- * of long double to enforce 16-byte alignment of the TLS memory,
- * struct alpha_tp, struct tcb and also struct kcb. Both static and
- * dynamic allocation of any of these structures will result in a
- * valid, well-aligned thread pointer.
- */
-struct alpha_tp {
- struct tdv *tp_tdv; /* dynamic TLS */
- uint64_t _reserved_;
- long double tp_tls[0]; /* static TLS */
-};
-
struct tcb {
+ void *tcb_dtv;
struct pthread *tcb_thread;
- struct alpha_tp tcb_tp;
};
#define _tp __builtin_thread_pointer()
-#define _tcb ((struct tcb*)((char*)(_tp) - offsetof(struct tcb, tcb_tp)))
+#define _tcb ((struct tcb *)_tp)
struct tcb *_tcb_ctor(struct pthread *, int);
void _tcb_dtor(struct tcb *);
@@ -66,7 +49,7 @@
static __inline void
_tcb_set(struct tcb *tcb)
{
- __builtin_set_thread_pointer(&tcb->tcb_tp);
+ __builtin_set_thread_pointer(tcb);
}
static __inline struct tcb *
==== //depot/projects/davidxu_thread/src/lib/libthread/arch/ia64/ia64/pthread_md.c#4 (text+ko) ====
@@ -48,14 +48,14 @@
oldtls = NULL;
#if 1
- if ((tcb = malloc(sizeof(struct tcb))) != NULL) {
+ if ((tcb = malloc(sizeof(struct tcb))) != NULL) {
memset(tcb, 0, sizeof(struct tcb));
- tcb->tcb_thread = thread;
+ tcb->tcb_thread = thread;
}
#else
tcb = _rtld_allocate_tls(oldtls, sizeof(struct tcb), 16);
if (tcb) {
- tcb->tcb_thread = thread;
+ tcb->tcb_thread = thread;
}
#endif
return (tcb);
==== //depot/projects/davidxu_thread/src/lib/libthread/arch/ia64/include/pthread_md.h#6 (text+ko) ====
@@ -31,41 +31,28 @@
#include <stddef.h>
-#define DTV_OFFSET offsetof(struct tcb, tcb_tp.tp_tdv)
-
-struct pthread;
-struct tcb;
-struct tdv; /* We don't know what this is yet? */
+#define DTV_OFFSET offsetof(struct tcb, tcb_dtv)
-/*
- * tp points to one of these. We define the static TLS as an array
- * of long double to enforce 16-byte alignment of the TLS memory,
- * struct ia64_tp, struct tcb and also struct kcb. Both static and
- * dynamic allocation of any of these structures will result in a
- * valid, well-aligned thread pointer.
- */
-struct ia64_tp {
- struct tdv *tp_tdv; /* dynamic TLS */
- uint64_t _reserved_;
- long double tp_tls[0]; /* static TLS */
-};
-
struct tcb {
+ void *tcb_dtv;
struct pthread *tcb_thread;
- struct ia64_tp tcb_tp;
};
-register struct ia64_tp *_tp __asm("%r13");
+register struct tcb *_tp __asm("%r13");
-#define _tcb ((struct tcb*)((char*)(_tp) - offsetof(struct tcb, tcb_tp)))
+#define _tcb _tp
+/*
+ * The tcb constructors.
+ */
struct tcb *_tcb_ctor(struct pthread *, int);
void _tcb_dtor(struct tcb *);
+/* Called from the KSE to set its private data. */
static __inline void
_tcb_set(struct tcb *tcb)
{
- _tp = &tcb->tcb_tp;
+ _tp = tcb;
}
static __inline struct tcb *
==== //depot/projects/davidxu_thread/src/lib/libthread/arch/powerpc/include/pthread_md.h#3 (text+ko) ====
@@ -36,36 +36,22 @@
#include <stddef.h>
#include <sys/types.h>
-#define DTV_OFFSET offsetof(struct tcb, tcb_tp.tp_tdv)
-
-struct pthread;
-struct tcb;
-struct tdv;
+#define DTV_OFFSET offsetof(struct tcb, tcb_dtv)
/*
- * %r2 points to a struct kcb.
+ * %r2 points to end of struct tcb. Variant I tls, the
+ * tcb structure layout is fixed, totally 8 bytes on 32 bits
+ * machine, don't change it.
*/
-struct ppc32_tp {
- struct tdv *tp_tdv; /* dynamic TLS */
- uint32_t _reserved_;
- long double tp_tls[0]; /* static TLS */
-};
struct tcb {
+ void *tcb_dtv;
struct pthread *tcb_thread;
- struct ppc32_tp tcb_tp;
};
-/*
- * From the PowerPC32 TLS spec:
- *
- * "r2 is the thread pointer, and points 0x7000 past the end of the
- * thread control block." Or, 0x7008 past the start of the 8-byte tcb
- */
-#define TP_OFFSET 0x7008
-register uint8_t *_tpr __asm("%r2");
+register uint8_t *_tp __asm("%r2");
-#define _tcb ((struct tcb *)(_tpr - TP_OFFSET - offsetof(struct tcb, tcb_tp)))
+#define _tcb ((struct tcb *)(_tp - sizeof(struct tcb)))
struct tcb *_tcb_ctor(struct pthread *, int);
void _tcb_dtor(struct tcb *);
@@ -73,7 +59,7 @@
static __inline void
_tcb_set(struct tcb *tcb)
{
- _tpr = (uint8_t *)&tcb->tcb_tp + TP_OFFSET;
+ _tp = (uint8_t *)tcb + sizeof(struct tcb);
}
static __inline struct tcb *
==== //depot/projects/davidxu_thread/src/lib/libthread/arch/powerpc/powerpc/pthread_md.c#2 (text+ko) ====
@@ -22,13 +22,13 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libpthread/arch/powerpc/powerpc/pthread_md.c,v 1.2 2004/08/16 05:41:39 grehan Exp $");
-
#include <stdlib.h>
#include <strings.h>
+#include "rtld_tls.h"
#include "pthread_md.h"
/*
@@ -38,39 +38,34 @@
_tcb_ctor(struct pthread *thread, int initial)
{
struct tcb *tcb;
+ void *oldtls;
+ if (initial)
+ oldtls = _tp;
+ else
+ oldtls = NULL;
+
+#if 1
if ((tcb = malloc(sizeof(struct tcb))) != NULL) {
- bzero(tcb, sizeof(struct tcb));
+ memset(tcb, 0, sizeof(struct tcb));
+ tcb->tcb_thread = thread;
+ }
+#else
+ tcb = _rtld_allocate_tls(oldtls, sizeof(struct tcb), 16);
+ if (tcb) {
tcb->tcb_thread = thread;
- /* Allocate TDV */
}
+#endif
return (tcb);
+
}
void
_tcb_dtor(struct tcb *tcb)
{
- /* Free TDV */
+#if 1
free(tcb);
-}
-
-struct kcb *
-_kcb_ctor(struct kse *kse)
-{
- struct kcb *kcb;
-
- if ((kcb = malloc(sizeof(struct kcb))) != NULL) {
- bzero(kcb, sizeof(struct kcb));
- kcb->kcb_faketcb.tcb_isfake = 1;
- kcb->kcb_faketcb.tcb_tmbx.tm_flags = TMF_NOUPCALL;
- kcb->kcb_curtcb = &kcb->kcb_faketcb;
- kcb->kcb_kse = kse;
- }
- return (kcb);
-}
-
-void
-_kcb_dtor(struct kcb *kcb)
-{
- free(kcb);
+#else
+ _rtld_free_tls(tcb, sizeof(tcb), 16);
+#endif
}
==== //depot/projects/davidxu_thread/src/lib/libthread/arch/sparc64/include/pthread_md.h#5 (text+ko) ====
@@ -35,43 +35,36 @@
#include <stddef.h>
-#define DTV_OFFSET offsetof(struct tcb, tcb_tp.tp_tdv)
+#define DTV_OFFSET offsetof(struct tcb, tcb_dtv)
struct pthread;
-struct tcb;
-struct tdv; /* We don't know what this is yet? */
-
-/*
- * %g6 points to one of these. We define the static TLS as an array
- * of long double to enforce 16-byte alignment of the TLS memory.
- *
- * XXX - Both static and dynamic allocation of any of these structures
- * will result in a valid, well-aligned thread pointer???
- */
-struct sparc64_tp {
- struct tdv *tp_tdv; /* dynamic TLS */
- uint64_t _reserved_;
- long double tp_tls[0]; /* static TLS */
-};
struct tcb {
- struct pthread *tcb_thread;
- struct sparc64_tp tcb_tp;
+ struct tcb *tcb_self; /* required by rtld */
+ void *tcb_dtv; /* required by rtld */
+ struct pthread *tcb_thread; /* our hook */
};
-register struct sparc64_tp *_tp __asm("%g6");
+register struct tcb *_tp __asm("%g7");
-#define _tcb ((struct tcb*)((char*)(_tp) - offsetof(struct tcb, tcb_tp)))
+#define _tcb (_tp)
+/*
+ * The tcb constructors.
+ */
struct tcb *_tcb_ctor(struct pthread *, int);
void _tcb_dtor(struct tcb *);
+/* Called from the thread to set its private data. */
static __inline void
_tcb_set(struct tcb *tcb)
{
- _tp = &tcb->tcb_tp;
+ _tp = tcb;
}
+/*
+ * Get the current tcb.
+ */
static __inline struct tcb *
_tcb_get(void)
{
==== //depot/projects/davidxu_thread/src/lib/libthread/arch/sparc64/sparc64/pthread_md.c#4 (text+ko) ====
@@ -24,31 +24,38 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $FreeBSD$
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libpthread/arch/sparc64/sparc64/pthread_md.c,v 1.3 2004/08/15 16:28:05 dfr Exp $");
-
#include <sys/types.h>
-
#include <stdlib.h>
#include <string.h>
-
+#include "rtld_tls.h"
#include "pthread_md.h"
struct tcb *
_tcb_ctor(struct pthread *thread, int initial)
{
struct tcb *tcb;
+ void *oldtls;
- if ((tcb = malloc(sizeof(struct tcb))) != NULL) {
+ if (initial) {
+ oldtls = _tp;
+ } else {
+ oldtls = NULL;
+ }
+
+ tcb = _rtld_allocate_tls(oldtls, 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 p4-projects
mailing list