aboutsummaryrefslogtreecommitdiffstats
path: root/vppinfra/vppinfra/longjmp.S
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2016-01-20 09:11:55 -0500
committerGerrit Code Review <gerrit@fd.io>2016-01-21 12:33:07 +0000
commitbfdedbd5a3ba7e6fdc036d212253aa55c9062211 (patch)
tree63cf45fd5839e377ef757946be8bdcaa90dbc2a4 /vppinfra/vppinfra/longjmp.S
parent08ff7e00bf0e7cf93a732e98a026a76a4349fd41 (diff)
PowerPC64-be arch support. Qemu ("qppc") platform support.
Change-Id: Ib0a05f9d1b08bacef09f6d7c101391737031ee0d Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'vppinfra/vppinfra/longjmp.S')
-rw-r--r--vppinfra/vppinfra/longjmp.S60
1 files changed, 32 insertions, 28 deletions
diff --git a/vppinfra/vppinfra/longjmp.S b/vppinfra/vppinfra/longjmp.S
index a469b644766..ac138a96257 100644
--- a/vppinfra/vppinfra/longjmp.S
+++ b/vppinfra/vppinfra/longjmp.S
@@ -290,38 +290,42 @@ _prologue (clib_longjmp)
blr
-_prologue (clib_calljmp)
- /* Make sure stack is 16 byte aligned. */
- andi. 0, 5, 0xf
- sub 5, 5, 0
- addi 5, 5, -16
-
- /* Save old stack/link pointer on new stack. */
- std 1, 0(5)
+ .globl clib_calljmp
+ .section ".opd","aw"
+ .align 3
+clib_calljmp:
+ .quad .L.clib_calljmp,.TOC.@tocbase,0
+ .previous
+ .type clib_calljmp, @function
+.L.clib_calljmp:
mflr 0
- std 0, 8(5)
-
- /* Switch stacks. */
- mr 1, 5
-
- /* Get function pointer. */
- ld 0, 0(3)
- mtctr 0
-
- /* Move argument into place. */
- mr 3, 4
-
- /* Away we go. */
+ mr 9,3
+ std 0,16(1)
+ stdu 1,-112(1)
+#APP
+ std 1,-8(5)
+ addi 5,5,-256
+ mr 1,5
+#NO_APP
+ ld 10,0(9)
+ std 2,40(1)
+ mr 3,4
+ mtctr 10
+ ld 11,16(9)
+ ld 2,8(9)
bctrl
-
- /* Switch back to old stack. */
- ld 0, 8(1)
+ ld 2,40(1)
+#APP
+ addi 1,1,256
+ ld 1,-8(1)
+#NO_APP
+ addi 1,1,112
+ ld 0,16(1)
mtlr 0
- ld 0, 0(1)
- mr 1, 0
-
- /* Return to caller. */
blr
+ .long 0
+ .byte 0,0,0,1,128,0,0,0
+ .size clib_calljmp,.-.L.clib_calljmp
#elif defined(__powerpc__)