c3969c507c4839ad9c03497abe8c10fb3795c9a6
[openafs.git] / src / lwp / process.i386.s
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /* Sun 386i... I hope this does the right thing!!!
11  * 
12  * Written by Derek Atkins <warlord@MIT.EDU>
13  * (debugging help by Chris Provenzano <proven@mit.edu>)
14  * 11/1991
15  *
16  * "ojala que es correcto!"
17  */
18
19 #define IGNORE_STDS_H  1
20 #include <afs/param.h>
21 #include <lwp_elf.h>
22
23         .file "process.s"
24
25         .data
26
27         .text
28
29 /*
30  * struct savearea {
31  *      char    *topstack;
32  * }
33  */
34
35         .set    topstack,0
36
37 /*
38  * savecontext(f, area1, newsp)
39  *      int (*f)(); struct savearea *area1; char *newsp;
40  */
41
42 /* offsets, to make my life easier! */
43         .set    f,8
44         .set    area1,12
45         .set    newsp,16
46
47 .globl  _C_LABEL(PRE_Block)
48 .globl  _C_LABEL(savecontext)
49
50 ENTRY(savecontext)
51         pushl   %ebp                    /* New Frame! */
52         movl    %esp,%ebp
53         pusha                           /* Push all registers */
54         movl    $1,_C_LABEL(PRE_Block)  /* Pre-emption code */
55         movl    area1(%ebp),%eax        /* eax = base of savearea */
56         movl    %esp,(%eax)             /* area->topstack = esp */
57         movl    newsp(%ebp),%eax        /* get new sp into eax */
58         cmpl    $0,%eax
59         je      L1                      /* if new sp is 0 then dont change esp */
60         movl    %eax,%esp               /* go ahead.  make my day! */
61 L1:
62         jmp     *f(%ebp)                        /* ebx = &f */
63
64 /* Shouldn't be here....*/
65
66         call    _C_LABEL(abort)
67
68 /*
69  * returnto(area2)
70  *      struct savearea *area2;
71  */
72
73 /* stack offset */
74         .set    area2,8
75
76 .globl  _C_LABEL(returnto)
77
78 ENTRY(returnto)
79         pushl   %ebp
80         movl    %esp, %ebp              /* New frame, to get correct pointer */
81         movl    area2(%ebp),%eax        /* eax = area2 */
82         movl    (%eax),%esp             /* restore esp */
83         popa 
84         movl    $0,_C_LABEL(PRE_Block)          /* clear it up... */
85         popl    %ebp
86         ret
87
88 /* I see, said the blind man, as he picked up his hammer and saw! */
89         pushl   $1234
90         call    _C_LABEL(abort)