aboutsummaryrefslogtreecommitdiff
path: root/libthreads/i386
diff options
context:
space:
mode:
Diffstat (limited to 'libthreads/i386')
-rw-r--r--libthreads/i386/csw.S76
-rw-r--r--libthreads/i386/cthreads.h50
-rw-r--r--libthreads/i386/lock.s28
-rw-r--r--libthreads/i386/thread.c105
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 ();
}
-