summaryrefslogtreecommitdiffstats
path: root/newlib/libc/machine/or1k/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/or1k/setjmp.S')
-rw-r--r--newlib/libc/machine/or1k/setjmp.S100
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