source: trunk/libs/newlib/src/newlib/libc/machine/i386/setjmp.S @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 2.3 KB
Line 
1/* This is file is a merger of SETJMP.S and LONGJMP.S */
2/*
3 *  This file was modified to use the __USER_LABEL_PREFIX__ and
4 *  __REGISTER_PREFIX__ macros defined by later versions of GNU cpp by
5 *  Joel Sherrill (joel@OARcorp.com)
6 *  Slight change: now includes i386mach.h for this (Werner Almesberger)
7 *
8 * Copyright (C) 1991 DJ Delorie
9 * All rights reserved.
10 *
11 * Redistribution, modification, and use in source and binary forms is permitted
12 * provided that the above copyright notice and following paragraph are
13 * duplicated in all such forms.
14 *
15 * This file is distributed WITHOUT ANY WARRANTY; without even the implied
16 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 */
18
19 /*
20 **     jmp_buf:
21 **      eax ebx ecx edx esi edi ebp esp eip
22 **      0   4   8   12  16  20  24  28  32
23 **
24 **     Intel MCU jmp_buf:
25 **      ebx esi edi ebp esp eip
26 **      0   4   8   12  16  20
27 */
28
29       #include "i386mach.h"
30
31        .global SYM (setjmp)
32        .global SYM (longjmp)
33       SOTYPE_FUNCTION(setjmp)
34       SOTYPE_FUNCTION(longjmp)
35 
36SYM (setjmp):
37
38#ifdef __iamcu__
39        /* Store EIP.  */
40        movl    0(esp),ecx
41        movl    ecx,20(eax)
42
43        movl    ebx,0 (eax)
44        movl    esi,4 (eax)
45        movl    edi,8 (eax)
46        movl    ebp,12(eax)
47
48        /* Skip return address, which will be pushed onto stack in
49           longjmp, and store SP.  */
50        leal    4(esp),ecx
51        movl    ecx,16(eax)
52
53        xorl    eax,eax
54#else
55        pushl   ebp
56        movl    esp,ebp
57
58        pushl   edi
59        movl    8 (ebp),edi
60
61        movl    eax,0 (edi)
62        movl    ebx,4 (edi)
63        movl    ecx,8 (edi)
64        movl    edx,12 (edi)
65        movl    esi,16 (edi)
66
67        movl    -4 (ebp),eax
68        movl    eax,20 (edi)
69
70        movl    0 (ebp),eax
71        movl    eax,24 (edi)
72
73        movl    esp,eax
74        addl    $12,eax
75        movl    eax,28 (edi)
76       
77        movl    4 (ebp),eax
78        movl    eax,32 (edi)
79
80        popl    edi
81        movl    $0,eax
82        leave
83#endif
84        ret
85
86SYM (longjmp):
87#ifdef __iamcu__
88        /* Check retval.  */
89        testl   edx,edx
90        jne     0f
91        incl    edx
920:
93        /* Restore stack first.  */
94        movl    16(eax),esp
95
96        /* Put return address on stack.  */
97        pushl   20(eax)
98
99        movl    0(eax),ebx
100        movl    4(eax),esi
101        movl    8(eax),edi
102        movl    12(eax),ebp
103        movl    edx,eax
104#else
105        pushl   ebp
106        movl    esp,ebp
107
108        movl    8(ebp),edi      /* get jmp_buf */
109        movl    12(ebp),eax     /* store retval in j->eax */
110        testl   eax,eax
111        jne     0f
112        incl    eax
1130:
114        movl    eax,0(edi)
115
116        movl    24(edi),ebp
117
118       __CLI
119        movl    28(edi),esp
120       
121        pushl   32(edi)
122
123        movl    0(edi),eax
124        movl    4(edi),ebx
125        movl    8(edi),ecx
126        movl    12(edi),edx
127        movl    16(edi),esi
128        movl    20(edi),edi
129       __STI
130#endif
131
132        ret
Note: See TracBrowser for help on using the repository browser.