diff options
Diffstat (limited to 'newlib/libc/machine/or1k/setjmp.S')
-rw-r--r-- | newlib/libc/machine/or1k/setjmp.S | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/newlib/libc/machine/or1k/setjmp.S b/newlib/libc/machine/or1k/setjmp.S new file mode 100644 index 000000000..2fbf15d0f --- /dev/null +++ b/newlib/libc/machine/or1k/setjmp.S @@ -0,0 +1,100 @@ +/* +Copyright (c) 2014, Hesham ALMatary +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +.align 4 +.global setjmp +.type setjmp,@function +setjmp: + + l.sw 4(r3), r1 + 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 + /* Skip r10 as it's preserved to be used by TLS */ + /* Skip r11, setjmp always set it to 0 */ + /* The following set if registers are preserved across function calls */ + l.sw 52(r3), r14 + l.sw 60(r3), r16 + l.sw 68(r3), r18 + l.sw 76(r3), r20 + l.sw 84(r3), r22 + l.sw 92(r3), r24 + l.sw 100(r3), r26 + l.sw 108(r3), r28 + l.sw 116(r3), r30 + /* Save Status Register */ + l.mfspr r13, r0, 17 + l.sw 124(r3), r13 +/* Set result register to 0 and jump */ + l.jr r9 + l.addi r11, r0, 0 + +.align 4 +.global longjmp +.type longjmp,@function +longjmp: + + /* If the second argument to longjmp is zero, set return address to 1, + otherwise set it to the value of the second argument */ + l.addi r11, r0, 1 + l.sfne r4, r0 + l.bf 1f + l.nop + l.addi r11, r4, 0 + + /* Load status register */ +1: + l.lwz r15, 124(r3) + l.mtspr r0, r15, 17 + + l.lwz r1, 4(r3) + l.lwz r2, 8(r3) + /* Skip r3 as it contains the current buffer address */ + l.lwz r4, 16(r3) + l.lwz r5, 20(r3) + l.lwz r6, 24(r3) + l.lwz r7, 28(r3) + l.lwz r8, 32(r3) + l.lwz r9, 36(r3) + /* Skip r11 as it's always set by longjmp */ + l.lwz r14, 52(r3) + l.lwz r16, 60(r3) + l.lwz r18, 68(r3) + l.lwz r20, 76(r3) + l.lwz r22, 84(r3) + l.lwz r24, 92(r3) + l.lwz r26, 100(r3) + l.lwz r28, 108(r3) + l.lwz r30, 116(r3) + l.lwz r3, 12(r3) + + l.jr r9 + l.nop |