litex/software/libbase/setjmp-or1k.S

67 lines
1.6 KiB
ArmAsm

/* setjmp.S. Implementation of setjmp.
Copyright (C) 2010, Embecosm Limited <info@embecosm.com>
Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
Licensed under 2-clause BSD.
*/
/* -------------------------------------------------------------------------- */
/*!setjmp
All processor state is saved in the buffer provided. We need not save r0
(it will always be zero) and we need not save r11 (it will always be
overridden here, and in longjmp).
@todo We should prefer to save and restore the status register, but this is
not directly possible in user code. There is some merit in code to
set the flag, since in compiled C code, that might be expected to hold
a value. We leave a space for this information for future enhancement.
@param[out] env(r3) A buffer to save all the current processor state.
@return zero.*/
/* -------------------------------------------------------------------------- */
.align 4
.global setjmp
.type setjmp,@function
setjmp:
l.sw 4(r3),r1 /* Slot 0 saved for flag in future */
l.sw 8(r3),r2
l.sw 12(r3),r3
l.sw 16(r3),r4
l.sw 20(r3),r5
l.sw 24(r3),r6
l.sw 28(r3),r7
l.sw 32(r3),r8
l.sw 36(r3),r9
l.sw 40(r3),r10 /* Skip r11 */
l.sw 44(r3),r12
l.sw 48(r3),r13
l.sw 52(r3),r14
l.sw 56(r3),r15
l.sw 60(r3),r16
l.sw 64(r3),r17
l.sw 68(r3),r18
l.sw 72(r3),r19
l.sw 76(r3),r20
l.sw 80(r3),r21
l.sw 84(r3),r22
l.sw 88(r3),r23
l.sw 92(r3),r24
l.sw 96(r3),r25
l.sw 100(r3),r26
l.sw 104(r3),r27
l.sw 108(r3),r28
l.sw 112(r3),r29
l.sw 116(r3),r30
l.sw 120(r3),r31
l.jr r9
l.addi r11,r0,0 /* Zero result */
.size setjmp, .-setjmp