summaryrefslogtreecommitdiff
path: root/newlib/libc/machine/i386/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/i386/setjmp.S')
-rw-r--r--newlib/libc/machine/i386/setjmp.S136
1 files changed, 136 insertions, 0 deletions
diff --git a/newlib/libc/machine/i386/setjmp.S b/newlib/libc/machine/i386/setjmp.S
new file mode 100644
index 00000000000..0f4b537b96d
--- /dev/null
+++ b/newlib/libc/machine/i386/setjmp.S
@@ -0,0 +1,136 @@
+/* This is file is a merger of SETJMP.S and LONGJMP.S */
+/*
+ * This file was modified to use the __USER_LABEL_PREFIX__ and
+ * __REGISTER_PREFIX__ macros defined by later versions of GNU cpp by
+ * Joel Sherrill (joel@OARcorp.com)
+ *
+ ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+ **
+ ** This file is distributed under the terms listed in the document
+ ** "copying.dj", available from DJ Delorie at the address above.
+ ** A copy of "copying.dj" should accompany this file; if not, a copy
+ ** should be available from where this file was obtained. This file
+ ** may not be distributed without a verbatim copy of "copying.dj".
+ **
+ ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
+ ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+ /*
+ ** jmp_buf:
+ ** eax ebx ecx edx esi edi ebp esp eip
+ ** 0 4 8 12 16 20 24 28 32
+ */
+
+/* These are predefined by new versions of GNU cpp. */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+/***************************** TEMPORARY ******************************
+ *
+ * It appears that the i386-coff configuration of gcc 2.6.2 does not
+ * do the __REGISTER_PREFIX__ correctly. Fix this when it does.
+ **********************************************************************/
+#define __REGISTER_PREFIX__ %
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+#define eax REG (eax)
+#define ebx REG (ebx)
+#define ecx REG (ecx)
+#define edx REG (edx)
+#define esi REG (esi)
+#define edi REG (edi)
+#define ebp REG (ebp)
+#define esp REG (esp)
+
+#define ax REG (ax)
+#define bx REG (bx)
+#define cx REG (cx)
+#define dx REG (dx)
+
+#define ah REG (ah)
+#define bh REG (bh)
+#define ch REG (ch)
+#define dh REG (dh)
+
+#define al REG (al)
+#define bl REG (bl)
+#define cl REG (cl)
+#define dl REG (dl)
+
+ .global SYM (setjmp)
+ .global SYM (longjmp)
+
+SYM (setjmp):
+
+ pushl ebp
+ movl esp,ebp
+
+ pushl edi
+ movl 8 (ebp),edi
+
+ movl eax,0 (edi)
+ movl ebx,4 (edi)
+ movl ecx,8 (edi)
+ movl edx,12 (edi)
+ movl esi,16 (edi)
+
+ movl -4 (ebp),eax
+ movl eax,20 (edi)
+
+ movl 0 (ebp),eax
+ movl eax,24 (edi)
+
+ movl esp,eax
+ addl $12,eax
+ movl eax,28 (edi)
+
+ movl 4 (ebp),eax
+ movl eax,32 (edi)
+
+ popl edi
+ movl $0,eax
+ leave
+ ret
+
+SYM (longjmp):
+ pushl ebp
+ movl esp,ebp
+
+ movl 8(ebp),edi /* get jmp_buf */
+ movl 12(ebp),eax /* store retval in j->eax */
+ movl eax,0(edi)
+
+ movl 24(edi),ebp
+
+ cli
+ movl 28(edi),esp
+
+ pushl 32(edi)
+
+ movl 0(edi),eax
+ movl 4(edi),ebx
+ movl 8(edi),ecx
+ movl 12(edi),edx
+ movl 16(edi),esi
+ movl 20(edi),edi
+ sti
+
+ ret