1 /* 2 * Copyright 2004 by Peter Grehan. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 3. The name of the author may not be used to endorse or promote products 13 * derived from this software without specific prior written permission. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 20 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 22 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * $FreeBSD$ 28 */ 29 30 /* 31 * Machine-dependent thread prototypes/definitions. 32 */ 33 #ifndef _PTHREAD_MD_H_ 34 #define _PTHREAD_MD_H_ 35 36 #include <stddef.h> 37 #include <sys/types.h> 38 39 #define DTV_OFFSET offsetof(struct tcb, tcb_dtv) 40 41 /* 42 * Variant I tcb. The structure layout is fixed, don't blindly 43 * change it. 44 * %r2 points to end of the structure. 45 */ 46 struct tcb { 47 void *tcb_dtv; 48 struct pthread *tcb_thread; 49 }; 50 51 register uint8_t *_tp __asm("%r2"); 52 53 #define _tcb ((struct tcb *)(_tp - sizeof(struct tcb))) 54 55 struct tcb *_tcb_ctor(struct pthread *, int); 56 void _tcb_dtor(struct tcb *); 57 58 static __inline void 59 _tcb_set(struct tcb *tcb) 60 { 61 _tp = (uint8_t *)tcb + sizeof(struct tcb); 62 } 63 64 static __inline struct tcb * 65 _tcb_get(void) 66 { 67 return (_tcb); 68 } 69 70 extern struct pthread *_thr_initial; 71 72 static __inline struct pthread * 73 _get_curthread(void) 74 { 75 if (_thr_initial) 76 return (_tcb->tcb_thread); 77 return (NULL); 78 } 79 80 #endif /* _PTHREAD_MD_H_ */ 81