source: trunk/libs/newlib/src/newlib/libc/machine/xscale/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: 3.9 KB
Line 
1/* This is a simple version of setjmp and longjmp.
2
3   Nick Clifton, Cygnus Solutions, 13 June 1997.  */
4
5/* ANSI concatenation macros.  */
6#define CONCAT(a, b)  CONCAT2(a, b)
7#define CONCAT2(a, b) a##b
8
9#ifndef __USER_LABEL_PREFIX__
10#error  __USER_LABEL_PREFIX__ not defined
11#endif
12
13#define SYM(x) CONCAT (__USER_LABEL_PREFIX__, x)
14
15#ifdef __ELF__
16#define TYPE(x) .type SYM(x),function
17#define SIZE(x) .size SYM(x), . - SYM(x)
18#else
19#define TYPE(x)
20#define SIZE(x)
21#endif
22
23/* Arm/Thumb interworking support:
24
25   The interworking scheme expects functions to use a BX instruction
26   to return control to their parent.  Since we need this code to work
27   in both interworked and non-interworked environments as well as with
28   older processors which do not have the BX instruction we do the
29   following:
30        Test the return address.
31        If the bottom bit is clear perform an "old style" function exit.
32        (We know that we are in ARM mode and returning to an ARM mode caller).
33        Otherwise use the BX instruction to perform the function exit.
34
35   We know that we will never attempt to perform the BX instruction on
36   an older processor, because that kind of processor will never be
37   interworked, and a return address with the bottom bit set will never
38   be generated.
39
40   In addition, we do not actually assemble the BX instruction as this would
41   require us to tell the assembler that the processor is an ARM7TDMI and
42   it would store this information in the binary.  We want this binary to be
43   able to be linked with binaries compiled for older processors however, so
44   we do not want such information stored there. 
45
46   If we are running using the APCS-26 convention however, then we never
47   test the bottom bit, because this is part of the processor status. 
48   Instead we just do a normal return, since we know that we cannot be
49   returning to a Thumb caller - the Thumb does not support APCS-26.
50       
51   Function entry is much simpler.  If we are compiling for the Thumb we
52   just switch into ARM mode and then drop through into the rest of the
53   function.  The function exit code will take care of the restore to
54   Thumb mode.  */
55
56#ifdef __APCS_26__
57#define RET     movs            pc, lr
58#else
59#define RET     tst             lr, #1; \
60                moveq           pc, lr ; \
61.word           0xe12fff1e      /* bx lr */
62#endif
63
64#ifdef __thumb__
65#define MODE            .thumb_func
66.macro PROLOGUE name
67        .code 16
68        bx      pc
69        nop     
70        .code 32
71SYM (.arm_start_of.\name):
72.endm
73#else
74#define MODE            .code 32
75.macro PROLOGUE name
76.endm
77#endif
78       
79.macro FUNC_START name
80        .text
81        .align 2
82        MODE
83        .globl SYM (\name)
84        TYPE (\name)
85SYM (\name):
86        PROLOGUE \name
87.endm
88
89.macro FUNC_END name
90        RET
91        SIZE (\name)
92.endm
93       
94/* --------------------------------------------------------------------
95                 int setjmp (jmp_buf);
96   -------------------------------------------------------------------- */
97       
98        FUNC_START setjmp
99
100        /* Save all the callee-preserved registers into the jump buffer.  */
101        stmea           a1!, { v1-v7, fp, ip, sp, lr }
102       
103#if 0   /* Simulator does not cope with FP instructions yet.  */
104#ifndef __SOFTFP__
105        /* Save the floating point registers.  */
106        sfmea           f4, 4, [a1]
107#endif
108#endif         
109        /* When setting up the jump buffer return 0.  */
110        mov             a1, #0
111
112        FUNC_END setjmp
113       
114/* --------------------------------------------------------------------
115                volatile void longjmp (jmp_buf, int);
116   -------------------------------------------------------------------- */
117       
118        FUNC_START longjmp
119
120        /* If we have stack extension code it ought to be handled here.  */
121       
122        /* Restore the registers, retrieving the state when setjmp() was called.  */
123        ldmfd           a1!, { v1-v7, fp, ip, sp, lr }
124       
125#if 0   /* Simulator does not cope with FP instructions yet.  */
126#ifndef __SOFTFP__
127        /* Restore floating point registers as well.  */
128        lfmfd           f4, 4, [a1]
129#endif
130#endif 
131        /* Put the return value into the integer result register.
132           But if it is zero then return 1 instead.  */
133        movs            a1, a2
134        moveq           a1, #1
135
136        FUNC_END longjmp
137
Note: See TracBrowser for help on using the repository browser.