*** empty log message ***
[arla.git] / lwp / process.i386.S
blob5672cfd2e4698791de9af1a0d90625c2b2305d14
1 /* $Id$ */
3 /*
4 ****************************************************************************
5 *        Copyright IBM Corporation 1988, 1989 - All Rights Reserved        *
6 *                                                                          *
7 * Permission to use, copy, modify, and distribute this software and its    *
8 * documentation for any purpose and without fee is hereby granted,         *
9 * provided that the above copyright notice appear in all copies and        *
10 * that both that copyright notice and this permission notice appear in     *
11 * supporting documentation, and that the name of IBM not be used in        *
12 * advertising or publicity pertaining to distribution of the software      *
13 * without specific, written prior permission.                              *
14 *                                                                          *
15 * IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL *
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL IBM *
17 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY      *
18 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER  *
19 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING   *
20 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.    *
21 ****************************************************************************
24 #include <config.h>
26 #undef RCSID
28 /* i386 Assembly
29  *
30  * Written by Derek Atkins <warlord@MIT.EDU>
31  * (debugging help by Chris Provenzano <proven@mit.edu>)
32  * 11/1991
33  * +  * "ojala que sea correcto!"
34  */
35         
36 #ifdef HAVE_MACHINE_ASM_H
37 #include <machine/asm.h>
38 #endif
40 #include <lwp_elf.h>
42 #ifdef AFS_DARWIN_ENV
43 #define LWP_ABORT       L_abort$stub
44 #else
45 #define LWP_ABORT       _C_LABEL(abort)
46 #endif
47         
48         .file "process.s"
49         
50         .data
51         
52         .text
55  * struct savearea {
56  *    char    *topstack;
57  * }
58  */
60         .set    topstack,0
63  * savecontext(f, area1, newsp)
64  *    int (*f)(); struct savearea *area1; char *newsp;
65  */
67 /* offsets, to make my life easier! */
68         .set    f,8
69         .set    area1,12
70         .set    newsp,16
72 .globl          _C_LABEL(PRE_Block)
73 .globl          _C_LABEL(savecontext)
75 ENTRY(savecontext)
76         pushl   %ebp                    /* New Frame! */
77         movl    %esp,%ebp
78         pushal                           /* Push all registers */
79         movl    $1,_C_LABEL(PRE_Block)        /* Do not allow any interrupt finagling */
80         movl    area1(%ebp),%eax        /* eax = base of savearea */
81         movl    %esp,topstack(%eax)     /* area->topstack = esp */
82         movl    newsp(%ebp),%eax        /* get new sp into eax */
83         cmpl    $0,%eax
84         je      L1                      /* if new sp is 0 then dont change esp */
85         movl    %eax,%esp               /* go ahead.  make my day! */
86 L1:
87         jmp     *f(%ebp)                        /* ebx = &f */
89 /* Shouldnt be here....*/
91         call    LWP_ABORT
94  * returnto(area2)
95  *    struct savearea *area2;
96  */
98 /* stack offset */
99         .set    area2,8
101 .globl          _C_LABEL(returnto)
103 ENTRY(returnto)
104         pushl   %ebp
105         movl    %esp, %ebp              /* New frame, to get correct pointer */
106         movl    area2(%ebp),%eax        /* eax = area2 */
107         movl    topstack(%eax),%esp     /* restore esp */
108         popal
109         movl    $0,_C_LABEL(PRE_Block)            /* clear it up... */
110         popl    %ebp
111         ret
112         
113 /* I see, said the blind man, as he picked up his hammer and saw! */
114         pushl   $1234
115         call    LWP_ABORT
116         
117 #ifdef AFS_DARWIN_ENV
118         .section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
119 L_abort$stub:
120         .indirect_symbol _abort
121         hlt ; hlt ; hlt ; hlt ; hlt
122         .subsections_via_symbols
123 #endif