initial-freebsd-port-work-20010414
[openafs.git] / src / lwp / process.fbsd.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 #define IGNORE_STDS_H   1
11 /* Sun 386i... I hope this does the right thing!!!
12  * 
13  * Written by Derek Atkins <warlord@MIT.EDU>
14  * (debugging help by Chris Provenzano <proven@mit.edu>)
15  * 11/1991
16  *
17  * "ojala que es correcto!"
18  */
19         .file "process.s"
20
21         .data
22
23         .text
24
25 /*
26  * struct savearea {
27  *      char    *topstack;
28  * }
29  */
30
31         .set    topstack,0
32
33 /*
34  * savecontext(f, area1, newsp)
35  *      int (*f)(); struct savearea *area1; char *newsp;
36  */
37
38 /* offsets, to make my life easier! */
39         .set    f,8
40         .set    area1,12
41         .set    newsp,16
42
43
44 .globl  PRE_Block
45 .globl  savecontext
46
47 savecontext:
48         pushl   %ebp                    /* New Frame! */
49         movl    %esp,%ebp
50         pusha                           /* Push all registers */
51         movl    $1,PRE_Block            /* Pre-emption code */
52         movl    area1(%ebp),%eax        /* eax = base of savearea */
53         movl    %esp,(%eax)             /* area->topstack = esp */
54         movl    newsp(%ebp),%eax        /* get new sp into eax */
55         cmpl    $0,%eax
56         je      L1                      /* if new sp is 0 then dont change esp */
57         movl    %eax,%esp               /* go ahead.  make my day! */
58 L1:
59         jmp     *f(%ebp)                        /* ebx = &f */
60
61 /* Shouldnt be here....*/
62
63         call    abort
64
65 /*
66  * returnto(area2)
67  *      struct savearea *area2;
68  */
69
70 /* stack offset */
71         .set    area2,8
72
73 .globl  returnto
74
75 returnto:
76         pushl   %ebp
77         movl    %esp, %ebp              /* New frame, to get correct pointer */
78         movl    area2(%ebp),%eax        /* eax = area2 */
79         movl    (%eax),%esp             /* restore esp */
80         popa 
81         movl    $0,PRE_Block            /* clear it up... */
82         popl    %ebp
83         ret
84
85 /* I see, said the blind man, as he picked up his hammer and saw! */
86         pushl   $1234
87         call    abort
88
89
90