diff options
Diffstat (limited to 'libthreads/i386')
-rw-r--r-- | libthreads/i386/csw.S | 139 | ||||
-rw-r--r-- | libthreads/i386/thread.c | 114 |
2 files changed, 253 insertions, 0 deletions
diff --git a/libthreads/i386/csw.S b/libthreads/i386/csw.S new file mode 100644 index 00000000..efc739f0 --- /dev/null +++ b/libthreads/i386/csw.S @@ -0,0 +1,139 @@ +/* + * 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 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> + +/* + * Suspend the current thread and resume the next one. + * + * void cproc_switch(int *cur, int *next, int *lock) + */ +ENTRY(cproc_switch) + pushl %ebp / save ebp + movl %esp,%ebp / set frame pointer to get arguments + pushl %ebx / save ebx + pushl %esi / esi + pushl %edi / edi + movl B_ARG0,%eax / get cur + movl %esp,(%eax) / save current esp + movl B_ARG2,%edx / get address of lock before switching + / stacks + movl B_ARG1,%eax / get next + 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 + popl %ebp / and bp (don`t use "leave" - bp + / still points to old stack) + ret + +/* + * Create a new stack frame for a 'waiting' thread, + * save current thread's frame, and switch to waiting thread. + * + * void cproc_start_wait(int *cur, + * cproc_t child, + * int stackp, + * int *lock) + */ +ENTRY(cproc_start_wait) + pushl %ebp / save ebp + movl %esp,%ebp / set frame pointer + pushl %ebx / save ebx + pushl %esi / esi + pushl %edi / edi + movl B_ARG0,%eax / get cur + movl %esp,(%eax) / save current esp + movl B_ARG1,%eax / get child thread + movl B_ARG3,%edx / point to lock before switching stack + movl B_ARG2,%esp / get new stack + pushl %eax / push child thread as argument + movl $0,%ebp / (clear frame pointer) + xorl %eax,%eax / unlock + xchgl %eax,(%edx) / the lock - now old thread can run + call _cproc_waiting / call cproc_waiting + /*NOTREACHED*/ + +/* + * Set up a thread's stack so that when cproc_switch switches to + * it, it will start up as if it called + * cproc_body(child) + * + * void cproc_prepare(cproc_t child, int *context, int stack) + */ +ENTRY(cproc_prepare) + pushl %ebp / save ebp + movl %esp,%ebp / set frame pointer + movl B_ARG2,%edx / get child`s stack + subl $28,%edx + / make room for context: + / 0 saved edi () + / 4 saved esi () + / 8 saved ebx () + / 12 saved ebp () + / 16 return PC from cproc_switch + / 20 return PC from cthread_body + / 24 argument to cthread_body + movl $0,12(%edx) / clear frame pointer + movl $_cthread_body,16(%edx) + / 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 + movl B_ARG1,%ecx / get pointer to context + movl %edx,(%ecx) / save context + leave + ret + diff --git a/libthreads/i386/thread.c b/libthreads/i386/thread.c new file mode 100644 index 00000000..155146b2 --- /dev/null +++ b/libthreads/i386/thread.c @@ -0,0 +1,114 @@ +/* + * Mach Operating System + * Copyright (c) 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.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 + * + */ + +#ifndef lint +static char rcs_id[] = "$Header: cvs-sans-libpthread/hurd/libthreads/i386/thread.c,v 1.1 1992/10/06 18:31:16 mib Exp $"; +#endif not lint + + +#include <cthreads.h> +#include "cthread_internals.h" + + +#include <mach/mach.h> + +/* + * C library imports: + */ +extern bzero(); + +/* + * Set up the initial state of a MACH thread + * so that it will invoke cthread_body(child) + * when it is resumed. + */ +void +cproc_setup(child, thread, routine) + register cproc_t child; + int thread; + int routine; +{ + register int *top = (int *) (child->stack_base + child->stack_size); + struct i386_thread_state state; + register struct i386_thread_state *ts = &state; + kern_return_t r; + unsigned int count; + + /* + * 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); + + ts->eip = 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); +} + +#ifdef cthread_sp +#undef cthread_sp +#endif + +int +cthread_sp() +{ + int x; + + return (int) &x; +} + |