/* * 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 * * * 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 * * * 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 * * * 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. * * Revision 1.3 1995/05/12 18:35:55 roland * Use EXT macro instead of explicit underscores. * # Revision 1.2 1994/05/04 19:01:50 mib # entered into RCS # * 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] * */ #define ELF #ifndef __ELF__ #define __ELF__ #endif #include /* * Suspend the current thread and resume the next one. * * void cproc_switch(int *cur, int *next, int *lock) */ ENTRY(cproc_switch,TAG_NO_FRAME_USED) stwu %r1,-16(%r1) /* update stack pointer */ mflr %r0 /* save link register */ stw %r0,20(%r1) stw %r1,0(%r3) /* save stack pointer in CUR */ li %r0,0 stw %r0,0(%r5) /* unlock */ lwz %r1,0(%r4) /* get new stack pointer from NEXT */ lwz %r0,20(%r1) /* get link register */ addi %r1,%r1,16 /* update stack pointer */ mtlr %r0 blr /* return */ /* * 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,TAG_NO_FRAME_USED) /* Not done yet, but it doesn't seem to be used. */ BREAKPOINT_TRAP /* * 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, * void (*cthread_body)(cproc_t)); */ ENTRY(cproc_prepare,TAG_NO_FRAME_USED) /* Not done yet, but this function is only used if the user defines a maximum number of kernel threads by setting cthread_max_kernel_threads. */ BREAKPOINT_TRAP