|
|
1.1 root 1: //////////
2: / libc/gen/i386/setjmp.s
3: / i386 C library.
4: / ANSI 4.6.1.1, 4.6.2.1.
5: //////////
6:
7: //////////
8: / #include <setjmp.h>
9: /
10: / int
11: / setjmp(env) jmp_buf env;
12: / Store the current register "environment"
13: / (frame pointer, stack pointer, return address, register variables)
14: / into "env" and return 0.
15: /
16: / void
17: / longjmp(env, value) jmp_buf env; int value;
18: / Restore the registers from "env", causing the setjmp() call to
19: / return again, this time returning the given "value".
20: /
21: / For i386, the "jmp_buf" structure is an array of six dwords.
22: //////////
23:
24: SAVEEBP .equ 0
25: SAVEESP .equ SAVEEBP+4
26: SAVERA .equ SAVEESP+4
27: SAVEESI .equ SAVERA+4
28: SAVEEDI .equ SAVEESI+4
29: SAVEEBX .equ SAVEEDI+4
30:
31: .globl setjmp
32: .globl longjmp
33:
34: setjmp:
35: pop %ecx / return address to ECX
36: movl %edx, (%esp) / env to EDX
37: movl SAVEEBP(%edx), %ebp / save EBP
38: movl SAVEESP(%edx), %esp / save ESP (after return address popped)
39: movl SAVERA(%edx), %ecx / save return address
40: movl SAVEESI(%edx), %esi / save ESI
41: movl SAVEEDI(%edx), %edi / save EDI
42: movl SAVEEBX(%edx), %ebx / save EBX
43: subl %eax, %eax / return value 0 to EAX
44: ijmp %ecx / and return
45:
46: longjmp:
47: pop %edx / longjmp return address to bit bucket
48: pop %edx / env to EDX
49: pop %eax / return value to EAX
50: orl %eax, %eax / check if return value 0
51: jnz ?0 / nope, ok
52: incl %eax / ANSI 4.6.2.1: return 1 if arg is 0
53:
54: ?0:
55: mov %ebp, SAVEEBP(%edx) / restore EBP
56: mov %esp, SAVEESP(%edx) / restore ESP
57: mov %esi, SAVEESI(%edx) / restore ESI
58: mov %edi, SAVEEDI(%edx) / restore EDI
59: mov %ebx, SAVEEBX(%edx) / restore EBX
60: ijmp SAVERA(%edx) / return through saved return address
61:
62: / end of libc/gen/i386/setjmp.s
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.