~ubuntu-branches/ubuntu/raring/avr-libc/raring-proposed

« back to all changes in this revision

Viewing changes to libc/stdlib/setjmp.S

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2007-12-29 16:20:03 UTC
  • mto: This revision was merged to the branch mainline in revision 7.
  • Revision ID: james.westby@ubuntu.com-20071229162003-xx0w1lyakuvfwrhm
Tags: upstream-1.4.7
ImportĀ upstreamĀ versionĀ 1.4.7

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
27
  POSSIBILITY OF SUCH DAMAGE. */
28
28
 
29
 
/* $Id: setjmp.S,v 1.2 2005/11/10 19:52:44 aesok Exp $ */
 
29
/* $Id: setjmp.S,v 1.2.2.1 2007/06/09 04:10:53 arcanum Exp $ */
30
30
 
31
31
/*
32
32
   setjmp.S
73
73
 
74
74
_U(setjmp):
75
75
        X_movw  ZL, jmpb_lo
76
 
        in      r26, _SFR_IO_ADDR(SPL)
77
 
        in      r27, _SFR_IO_ADDR(SPH)
 
76
        in      r26, AVR_STACK_POINTER_LO_ADDR
 
77
#ifdef _HAVE_AVR_STACK_POINTER_HI    
 
78
        in      r27, AVR_STACK_POINTER_HI_ADDR
 
79
#else
 
80
    clr r27
 
81
#endif
78
82
        /* save program counter (return address) */
79
83
        /* return address on stack (pushed by "call") is big endian! */
80
84
        /* SP is post-decremented by "call" */
81
85
        adiw    r26, 1
82
 
#ifdef EIND  /* devices with >128K bytes of flash - none yet */
 
86
#ifdef AVR_EXTENDED_INDIRECT_REG  /* devices with >128K bytes of flash */
83
87
        ld      __tmp_reg__, X+
84
88
        std     Z+23, __tmp_reg__
85
89
#endif
91
95
        std     Z+18,r26
92
96
        std     Z+19,r27
93
97
        /* save status register (I flag) */
94
 
        in      __tmp_reg__, _SFR_IO_ADDR(SREG)
 
98
        in      __tmp_reg__, AVR_STATUS_ADDR
95
99
        std     Z+20, __tmp_reg__
96
100
        /* save call-saved registers */
97
101
        st      Z, r2
152
156
        ld      __tmp_reg__, X+
153
157
        /* interrupts disabled for shortest possible time (3 cycles) */
154
158
        cli
155
 
        out     _SFR_IO_ADDR(SPH), r31
 
159
#ifdef _HAVE_AVR_STACK_POINTER_HI    
 
160
        out     AVR_STACK_POINTER_HI_ADDR, r31
 
161
#endif
156
162
        /* Restore status register (including the interrupt enable flag).
157
163
           Interrupts are re-enabled only after the next instruction.  */
158
 
        out     _SFR_IO_ADDR(SREG), __tmp_reg__
159
 
        out     _SFR_IO_ADDR(SPL), r30
 
164
        out     AVR_STATUS_ADDR, __tmp_reg__
 
165
        out     AVR_STACK_POINTER_LO_ADDR, r30
160
166
        /* restore return address */
161
167
        ld      r30,X+
162
168
        ld      r31,X+
163
 
#ifdef EIND
 
169
#ifdef AVR_EXTENDED_INDIRECT_REG
164
170
        ld      __tmp_reg__, X
165
 
        out     _SFR_IO_ADDR(EIND), __tmp_reg__
166
 
        .word   0x9419  /* eijmp */
 
171
        out     AVR_EXTENDED_INDIRECT_ADDR, __tmp_reg__
 
172
        eijmp
167
173
#else
168
174
        ijmp
169
175
#endif