]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4re-core/uclibc/lib/contrib/uclibc/libc/sysdeps/linux/bfin/bsdsetjmp.c
Update
[l4.git] / l4 / pkg / l4re-core / uclibc / lib / contrib / uclibc / libc / sysdeps / linux / bfin / bsdsetjmp.c
1 /* setjmp for the Blackfin project
2  *
3  * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
4  * Copyright (C) 2003 Metrowerks
5  * Based on code from Analog Devices.
6  *
7  * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
8  */
9
10 #include <setjmp.h>
11
12 #undef setjmp
13
14 int setjmp(jmp_buf env)
15 {
16         __asm__ __volatile__(
17                 "[--SP] = p0;\n\t"
18                 "p0 = r0;\n\t"
19                 "r0 = [SP++];\n\t"
20
21                 "[p0++] = r0;\n\t"       /* GP address registers */
22                 "[p0++] = p1;\n\t"
23                 "[p0++] = p2;\n\t"
24                 "[p0++] = p3;\n\t"
25                 "[p0++] = p4;\n\t"
26                 "[p0++] = p5;\n\t"
27
28                 "[p0++] = FP;\n\t"       /* frame pointer */
29                 "[p0++] = SP;\n\t"       /* stack pointer */
30
31                 "[p0++] = p0;\n\t"       /* data regs */
32                 "[p0++] = r1;\n\t"
33                 "[p0++] = r2;\n\t"
34                 "[p0++] = r3;\n\t"
35                 "[p0++] = r4;\n\t"
36                 "[p0++] = r5;\n\t"
37                 "[p0++] = r6;\n\t"
38                 "[p0++] = r7;\n\t"
39
40                 "r0 = ASTAT;\n\t"
41                 "[p0++] = r0;\n\t"
42
43                 "r0 = LC0;\n\t"          /* loop counters */
44                 "[p0++] = r0;\n\t"
45                 "r0 = LC1;\n\t"
46                 "[p0++] = r0;\n\t"
47
48                 "r0 = A0.w;\n\t"
49                 "[p0++] = r0;\n\t"
50                 "r0.l = A0.x;\n\t"
51                 "[p0++] = r0;\n\t"
52                 "r0 = A1.w;\n\t"
53                 "[p0++] = r0;\n\t"
54                 "r0.l = A1.x;\n\t"
55                 "[p0++] = r0;\n\t"
56
57                                  /* Dag regs */
58                 "r0 = i0;\n\t"           /* index registers */
59                 "[p0++] = r0;\n\t"
60                 "r0 = i1;\n\t"
61                 "[p0++] = r0;\n\t"
62                 "r0 = i2;\n\t"
63                 "[p0++] = r0;\n\t"
64                 "r0 = i3;\n\t"
65                 "[p0++] = r0;\n\t"
66
67                 "r0 = m0;\n\t"           /* modifier registers */
68                 "[p0++] = r0;\n\t"
69                 "r0 = m1;\n\t"
70                 "[p0++] = r0;\n\t"
71                 "r0 = m2;\n\t"
72                 "[p0++] = r0;\n\t"
73                 "r0 = m3;\n\t"
74                 "[p0++] = r0;\n\t"
75
76                 "r0 = l0;\n\t"           /* length registers */
77                 "[p0++] = r0;\n\t"
78                 "r0 = l1;\n\t"
79                 "[p0++] = r0;\n\t"
80                 "r0 = l2;\n\t"
81                 "[p0++] = r0;\n\t"
82                 "r0 = l3;\n\t"
83                 "[p0++] = r0;\n\t"
84
85                 "r0 = b0;\n\t"           /* base registers */
86                 "[p0++] = r0;\n\t"
87                 "r0 = b1;\n\t"
88                 "[p0++] = r0;\n\t"
89                 "r0 = b2;\n\t"
90                 "[p0++] = r0;\n\t"
91                 "r0 = b3;\n\t"
92                 "[p0++] = r0;\n\t"
93
94                 "r0 = RETS;\n\t"         /* store return address */
95                 "[p0++] = r0;\n\t"
96
97                 "r0 = 0;\n\t"
98                 :
99                 :
100         );
101
102         return 0;
103 }