diff options
Diffstat (limited to 'libthreads/i386')
-rw-r--r-- | libthreads/i386/csw.S | 76 | ||||
-rw-r--r-- | libthreads/i386/cthreads.h | 50 | ||||
-rw-r--r-- | libthreads/i386/lock.s | 28 | ||||
-rw-r--r-- | libthreads/i386/thread.c | 105 |
4 files changed, 176 insertions, 83 deletions
diff --git a/libthreads/i386/csw.S b/libthreads/i386/csw.S index 0951c5cc..69c93652 100644 --- a/libthreads/i386/csw.S +++ b/libthreads/i386/csw.S @@ -1,31 +1,57 @@ -/* +/* * Mach Operating System * Copyright (c) 1991,1990,1989 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ /* * HISTORY * $Log: csw.S,v $ + * Revision 1.9 1998/07/20 06:58:28 roland + * 1998-07-20 Roland McGrath <roland@baalperazim.frob.com> + * + * * i386/csw.S (cproc_prepare): Take address of cthread_body as third + * arg, so we don't have to deal with PIC magic to find its address + * without producing a text reloc. + * * cprocs.c (cproc_create): Pass &cthread_body to cproc_prepare. + * + * Revision 1.8 1997/04/04 01:31:16 thomas + * Thu Apr 3 20:29:27 1997 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu> + * + * * i386/csw.S: Define __ELF__ too. + * + * Revision 1.7 1996/10/24 19:30:10 thomas + * Mon Oct 21 22:05:48 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu> + * + * * i386/csw.S (CALL_MCOUNT): New macro. + * (cproc_swtich, cproc_start_wait, cproc_prepare): Use CALL_MCOUNT. + * + * Revision 1.6 1996/08/29 17:44:42 thomas + * *** empty log message *** + * + * Revision 1.5 1995/10/04 20:55:28 roland + * (JUMPTARGET): New macro, versions for [PIC] and not. + * Use it in place of EXT. + * * Revision 1.4 1995/10/04 20:22:17 roland * [PIC] (EXT): Redefine to use PLT. * @@ -38,28 +64,31 @@ * Revision 2.7 91/07/31 18:36:32 dbg * Fix for ANSI C preprocessor. * [91/07/30 17:35:16 dbg] - * + * * Revision 2.6 91/05/14 17:56:56 mrt * Correcting copyright - * + * * Revision 2.5 91/05/08 13:35:49 dbg * Unlock lock with a locked instruction (xchg). * [91/03/20 dbg] - * + * * Revision 2.4 91/02/14 14:20:02 mrt * Changed to new Mach copyright * [91/02/13 12:15:27 mrt] - * + * * Revision 2.3 91/01/08 16:46:20 rpd * Don't use Times - horta doesn't like it for some reason. * [91/01/06 rpd] - * + * * Revision 2.2 90/05/03 15:54:37 dbg * Created. * [90/02/05 dbg] - * + * */ -#include <i386/asm.h> +#define ELF +#undef __ELF__ +#define __ELF__ 1 +#include <mach/i386/asm.h> #ifdef PIC #define JUMPTARGET(name) EXT(name##@PLT) @@ -67,12 +96,21 @@ #define JUMPTARGET(name) EXT(name) #endif +#ifdef PROF +#define CALL_MCOUNT \ + pushl %ebp; movl %esp, %ebp; call JUMPTARGET(mcount); popl %ebp; +#else +#define CALL_MCOUNT +#endif + + /* * Suspend the current thread and resume the next one. * * void cproc_switch(int *cur, int *next, int *lock) */ ENTRY(cproc_switch) + CALL_MCOUNT pushl %ebp /* save ebp */ movl %esp,%ebp /* set frame pointer to get arguments */ pushl %ebx /* save ebx */ @@ -86,7 +124,7 @@ ENTRY(cproc_switch) movl (%eax),%esp /* get new stack pointer */ xorl %eax,%eax /* unlock */ xchgl %eax,(%edx) /* the lock - now old thread can run */ - + popl %edi /* restore di */ popl %esi /* si */ popl %ebx /* bx */ @@ -104,6 +142,7 @@ ENTRY(cproc_switch) * int *lock) */ ENTRY(cproc_start_wait) + CALL_MCOUNT pushl %ebp /* save ebp */ movl %esp,%ebp /* set frame pointer */ pushl %ebx /* save ebx */ @@ -126,9 +165,11 @@ ENTRY(cproc_start_wait) * it, it will start up as if it called * cproc_body(child) * - * void cproc_prepare(cproc_t child, int *context, int stack) + * void cproc_prepare(cproc_t child, int *context, int stack, + * void (*cthread_body)(cproc_t)); */ ENTRY(cproc_prepare) + CALL_MCOUNT pushl %ebp /* save ebp */ movl %esp,%ebp /* set frame pointer */ movl B_ARG2,%edx /* get child`s stack */ @@ -142,8 +183,8 @@ ENTRY(cproc_prepare) /* 20 return PC from cthread_body */ /* 24 argument to cthread_body */ movl $0,12(%edx) /* clear frame pointer */ - movl $JUMPTARGET(cthread_body),16(%edx) - /* resume at cthread_body */ + movl B_ARG3,%ecx /* get address of cthread_body passed in */ + movl %ecx,16(%edx) /* set child to resume at cthread_body */ movl $0,20(%edx) /* fake return address from cthread_body */ movl B_ARG0,%ecx /* get child thread pointer */ movl %ecx,24(%edx) /* set as argument to cthread_body */ @@ -151,4 +192,3 @@ ENTRY(cproc_prepare) movl %edx,(%ecx) /* save context */ leave ret - diff --git a/libthreads/i386/cthreads.h b/libthreads/i386/cthreads.h index 8ffe4b72..694387b6 100644 --- a/libthreads/i386/cthreads.h +++ b/libthreads/i386/cthreads.h @@ -1,6 +1,6 @@ /* * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University + * Copyright (c) 1993,1991,1990 Carnegie Mellon University * All Rights Reserved. * * Permission to use, copy, modify and distribute this software and its @@ -25,7 +25,37 @@ */ /* * HISTORY - * $Log: cthreads.h,v $ + * $Log: cthreads.h,v $ + * Revision 1.3 2007/03/03 23:57:37 sthibaul + * 2006-03-04 Samuel Thibault <samuel.thibault@ens-lyon.org> + * + * * libpthread/sysdeps/i386/machine-sp.h (thread_stack_pointer): + * Optimize esp read. + * * libpthread/i386/cthreads.h (cthread_sp): Likewise. + * + * Revision 1.2 2002/05/27 02:50:10 roland + * 2002-05-26 Roland McGrath <roland@frob.com> + * + * Changes merged from CMU MK83a version: + * * cthreads.h, options.h: Various cleanups. + * * call.c, cthread_data.c, sync.c, mig_support.c: Likewise. + * * i386/cthreads.h, i386/thread.c, i386/lock.s: Likewise. + * * cthread_internals.h: Add decls for internal functions. + * (struct cproc): Use vm_offset_t for stack_base and stack_size members. + * Use natural_t for context member. + * * cprocs.c: Use prototypes for all defns. + * * cthreads.c: Likewise. + * (cthread_exit): Cast any_t to integer_t before int. + * + * Revision 2.9 93/01/24 13:24:58 danner + * Move ! in spin_try_lock to give the compiler + * a fighting chance. + * [92/11/19 rvb] + * + * Revision 2.8 93/01/14 18:05:09 danner + * asm -> __asm__ + * [93/01/10 danner] + * * Revision 2.7 92/01/03 20:36:59 dbg * Add volatile to spin_lock_t. Change spin_unlock and * spin_try_lock definitions back to memory operands, but rely on @@ -66,22 +96,20 @@ typedef volatile int spin_lock_t; #define spin_unlock(p) \ ({ register int _u__ ; \ - asm volatile("xorl %0, %0; \n\ + __asm__ volatile("xorl %0, %0; \n\ xchgl %0, %1" \ - : "=&r" (_u__), "=m" (*(p)) ); \ + : "=&r" (_u__), "=m" (*(p)) :: "memory" ); \ 0; }) #define spin_try_lock(p)\ - ({ boolean_t _r__; \ - asm volatile("movl $1, %0; \n\ + (!({ boolean_t _r__; \ + __asm__ volatile("movl $1, %0; \n\ xchgl %0, %1" \ - : "=&r" (_r__), "=m" (*(p)) ); \ - !_r__; }) + : "=&r" (_r__), "=m" (*(p)) :: "memory" ); \ + _r__; })) #define cthread_sp() \ - ({ int _sp__; \ - asm("movl %%esp, %0" \ - : "=g" (_sp__) ); \ + ({ register int _sp__ asm("esp"); \ _sp__; }) #endif /* __GNUC__ */ diff --git a/libthreads/i386/lock.s b/libthreads/i386/lock.s index e27fa7ff..f064e5bb 100644 --- a/libthreads/i386/lock.s +++ b/libthreads/i386/lock.s @@ -26,6 +26,10 @@ /* * HISTORY * $Log: lock.s,v $ + * Revision 2.6 93/05/10 17:51:38 rvb + * Use C Comment + * [93/05/04 18:14:05 rvb] + * * Revision 2.5 91/05/14 17:57:20 mrt * Correcting copyright * @@ -49,22 +53,22 @@ * boolean_t spin_try_lock(int *m) */ ENTRY(spin_try_lock) - movl 4(%esp),%ecx / point at mutex - movl $1,%eax / set locked value in acc - xchg %eax,(%ecx) / swap with mutex - / xchg with memory is automatically - / locked - xorl $1,%eax / 1 (locked) => FALSE - / 0 (locked) => TRUE + movl 4(%esp),%ecx /* point at mutex */ + movl $1,%eax /* set locked value in acc */ + xchg %eax,(%ecx) /* swap with mutex */ + /* xchg with memory is automatically */ + /* locked */ + xorl $1,%eax /* 1 (locked) => FALSE */ + /* 0 (locked) => TRUE */ ret /* * void spin_unlock(int *m) */ ENTRY(spin_unlock) - movl 4(%esp),%ecx / point at mutex - xorl %eax,%eax / set unlocked value in acc - xchg %eax,(%ecx) / swap with mutex - / xchg with memory is automatically - / locked + movl 4(%esp),%ecx /* point at mutex */ + xorl %eax,%eax /* set unlocked value in acc */ + xchg %eax,(%ecx) /* swap with mutex */ + /* xchg with memory is automatically */ + /* locked */ ret diff --git a/libthreads/i386/thread.c b/libthreads/i386/thread.c index 8ba81826..00537be5 100644 --- a/libthreads/i386/thread.c +++ b/libthreads/i386/thread.c @@ -1,50 +1,52 @@ -/* +/* * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University + * Copyright (c) 1992,1991,1990 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ /* * HISTORY * $Log: thread.c,v $ + * Revision 2.8 93/02/02 21:54:58 mrt + * Changed include of mach/mach.h to mach.h. + * [93/02/02 mrt] + * + * Revision 2.7 93/01/14 18:05:15 danner + * Converted file to ANSI C. + * Fixed argument types. + * [92/12/18 pds] + * * Revision 2.6 91/07/31 18:37:07 dbg * Undefine cthread_sp macro around function definition. * [91/07/30 17:36:23 dbg] - * - * Revision 2.5 91/05/14 17:57:27 mrt - * Correcting copyright - * - * Revision 2.4 91/02/14 14:20:21 mrt - * Changed to new Mach copyright - * [91/02/13 12:20:10 mrt] - * + * * Revision 2.3 90/06/02 15:13:53 rpd * Added definition of cthread_sp. * [90/06/02 rpd] - * + * * Revision 2.2 90/05/03 15:55:03 dbg * Created (from 68020 version). * [90/02/05 dbg] - * + * */ /* * i386/thread.c @@ -52,20 +54,28 @@ */ #ifndef lint -static char rcs_id[] = "$Header: cvs-sans-libpthread/hurd/libthreads/i386/thread.c,v 1.2 1994/05/04 19:05:26 mib Exp $"; -#endif not lint +char rcs_id[] = "$Header: cvs-sans-libpthread/hurd/libthreads/i386/thread.c,v 1.7 2002/05/27 02:50:10 roland Exp $"; +#endif /* not lint */ -#include "../cthreads.h" -#include "../cthread_internals.h" - +#include <cthreads.h> +#include "cthread_internals.h" +#include <mach.h> +#include <mach/i386/mach_i386.h> +#include <mach/mig_errors.h> -#include <mach/mach.h> - -/* - * C library imports: - */ -extern bzero(); +#define HURD_TLS_DESC_DECL(desc, tcb) \ + struct descriptor desc = \ + { /* low word: */ \ + 0xffff /* limit 0..15 */ \ + | (((unsigned int) (tcb)) << 16) /* base 0..15 */ \ + , /* high word: */ \ + ((((unsigned int) (tcb)) >> 16) & 0xff) /* base 16..23 */ \ + | ((0x12 | 0x60 | 0x80) << 8) /* access = ACC_DATA_W|ACC_PL_U|ACC_P */ \ + | (0xf << 16) /* limit 16..19 */ \ + | ((4 | 8) << 20) /* granularity = SZ_32|SZ_G */ \ + | (((unsigned int) (tcb)) & 0xff000000) /* base 24..31 */ \ + } /* * Set up the initial state of a MACH thread @@ -73,42 +83,53 @@ extern bzero(); * when it is resumed. */ void -cproc_setup(child, thread, routine) - register cproc_t child; - int thread; - int routine; +cproc_setup(register cproc_t child, thread_t thread, tcbhead_t *tcb, void (*routine)(cproc_t)) { - register int *top = (int *) (child->stack_base + child->stack_size); + extern unsigned int __hurd_threadvar_max; /* GNU */ + register int *top = (int *) + cproc_stack_base (child, + sizeof(ur_cthread_t *) + + /* Account for GNU per-thread variables. */ + __hurd_threadvar_max * + sizeof (long int)); struct i386_thread_state state; register struct i386_thread_state *ts = &state; kern_return_t r; unsigned int count; + HURD_TLS_DESC_DECL(desc, tcb); + int sel; /* * Set up i386 call frame and registers. * Read registers first to get correct segment values. */ count = i386_THREAD_STATE_COUNT; - MACH_CALL(thread_get_state(thread,i386_THREAD_STATE,(thread_state_t) &state,&count),r); + MACH_CALL(thread_get_state(thread,i386_REGS_SEGS_STATE,(thread_state_t) &state,&count),r); - ts->eip = routine; + ts->eip = (int) routine; *--top = (int) child; /* argument to function */ *--top = 0; /* fake return address */ ts->uesp = (int) top; /* set stack pointer */ ts->ebp = 0; /* clear frame pointer */ - MACH_CALL(thread_set_state(thread,i386_THREAD_STATE,(thread_state_t) &state,i386_THREAD_STATE_COUNT),r); + asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0)); + tcb->tcb = tcb; + tcb->self = thread; + if (__builtin_expect (sel, 0x48) & 4) /* LDT selector */ + __i386_set_ldt (thread, sel, &desc, 1); + else + __i386_set_gdt (thread, &sel, desc); + ts->gs = sel; + + MACH_CALL(thread_set_state(thread,i386_REGS_SEGS_STATE,(thread_state_t) &state,i386_THREAD_STATE_COUNT),r); } -#ifdef cthread_sp +#if defined(cthread_sp) #undef cthread_sp #endif int -cthread_sp() +cthread_sp(void) { - int x; - - return (int) &x; + return (int) __thread_stack_pointer (); } - |