UnwindRegistersRestore.S revision 5ff06b0156f5820a87b4dd90bcd06f8ed41af8cc
1be38d822057438996715f7bcae3d293a50908d03Nico Weber//===-------------------- UnwindRegistersRestore.S ------------------------===// 2b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// 3b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// The LLVM Compiler Infrastructure 4b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// 5b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// This file is dual licensed under the MIT and the University of Illinois Open 6b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// Source Licenses. See LICENSE.TXT for details. 7b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// 8b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik//===----------------------------------------------------------------------===// 9b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 107c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico Weber#include "assembly.h" 11b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 127be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik .text 137c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico Weber 147c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico Weber#if __i386__ 157c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico WeberDEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_x866jumptoEv) 16b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik# 177be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# void libunwind::Registers_x86::jumpto() 18b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik# 19b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik# On entry: 207be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# + + 217be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# +-----------------------+ 227be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# + thread_state pointer + 237be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# +-----------------------+ 247be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# + return address + 257be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# +-----------------------+ <-- SP 267be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# + + 277be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 4(%esp), %eax 287be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik # set up eax and ret on new stack location 297be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 28(%eax), %edx # edx holds new stack pointer 307be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik subl $8,%edx 317be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl %edx, 28(%eax) 327be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 0(%eax), %ebx 337be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl %ebx, 0(%edx) 347be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 40(%eax), %ebx 357be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl %ebx, 4(%edx) 367be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik # we now have ret and eax pushed onto where new stack will be 377be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik # restore all registers 387be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 4(%eax), %ebx 397be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 8(%eax), %ecx 407be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 12(%eax), %edx 417be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 16(%eax), %edi 427be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 20(%eax), %esi 437be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 24(%eax), %ebp 447be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movl 28(%eax), %esp 45b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip ss 46b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip eflags 477be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik pop %eax # eax was already pushed on new stack 487be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ret # eip was already pushed on new stack 49b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip cs 50b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip ds 51b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip es 52b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip fs 53b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip gs 54b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 55b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#elif __x86_64__ 56b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 577c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico WeberDEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind16Registers_x86_646jumptoEv) 58b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik# 597be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# void libunwind::Registers_x86_64::jumpto() 60b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik# 617be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik# On entry, thread_state pointer is in rdi 627be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik 637be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 56(%rdi), %rax # rax holds new stack pointer 647be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik subq $16, %rax 657be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq %rax, 56(%rdi) 667be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 32(%rdi), %rbx # store new rdi on new stack 677be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq %rbx, 0(%rax) 687be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 128(%rdi), %rbx # store new rip on new stack 697be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq %rbx, 8(%rax) 707be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik # restore all registers 717be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 0(%rdi), %rax 727be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 8(%rdi), %rbx 737be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 16(%rdi), %rcx 747be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 24(%rdi), %rdx 757be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik # restore rdi later 767be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 40(%rdi), %rsi 777be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 48(%rdi), %rbp 787be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik # restore rsp later 797be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 64(%rdi), %r8 807be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 72(%rdi), %r9 817be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 80(%rdi), %r10 827be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 88(%rdi), %r11 837be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 96(%rdi), %r12 847be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 104(%rdi), %r13 857be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 112(%rdi), %r14 867be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 120(%rdi), %r15 87b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip rflags 88b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip cs 89b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip fs 90b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik # skip gs 917be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik movq 56(%rdi), %rsp # cut back rsp to new location 927be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik pop %rdi # rdi was saved here earlier 937be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ret # rip was saved here 947be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik 95b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 96b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#elif __ppc__ 97b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 987c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico WeberDEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_ppc6jumptoEv) 99b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; 1007be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik; void libunwind::Registers_ppc::jumpto() 101b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; 102b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; On entry: 103b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; thread_state pointer is in r3 104b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; 105b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 1067be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ; restore integral registerrs 1077be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ; skip r0 for now 1087be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ; skip r1 for now 1097be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r2, 16(r3) 1107be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ; skip r3 for now 1117be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ; skip r4 for now 1127be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ; skip r5 for now 1137be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r6, 32(r3) 1147be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r7, 36(r3) 1157be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r8, 40(r3) 1167be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r9, 44(r3) 1177be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r10, 48(r3) 1187be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r11, 52(r3) 1197be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r12, 56(r3) 1207be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r13, 60(r3) 1217be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r14, 64(r3) 1227be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r15, 68(r3) 1237be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r16, 72(r3) 1247be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r17, 76(r3) 1257be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r18, 80(r3) 1267be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r19, 84(r3) 1277be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r20, 88(r3) 1287be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r21, 92(r3) 1297be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r22, 96(r3) 1307be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r23,100(r3) 1317be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r24,104(r3) 1327be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r25,108(r3) 1337be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r26,112(r3) 1347be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r27,116(r3) 1357be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r28,120(r3) 1367be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r29,124(r3) 1377be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r30,128(r3) 1387be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r31,132(r3) 139b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 1407be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ; restore float registers 1417be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f0, 160(r3) 1427be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f1, 168(r3) 1437be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f2, 176(r3) 1447be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f3, 184(r3) 1457be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f4, 192(r3) 1467be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f5, 200(r3) 1477be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f6, 208(r3) 1487be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f7, 216(r3) 1497be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f8, 224(r3) 1507be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f9, 232(r3) 1517be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f10,240(r3) 1527be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f11,248(r3) 1537be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f12,256(r3) 1547be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f13,264(r3) 1557be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f14,272(r3) 1567be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f15,280(r3) 1577be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f16,288(r3) 1587be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f17,296(r3) 1597be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f18,304(r3) 1607be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f19,312(r3) 1617be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f20,320(r3) 1627be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f21,328(r3) 1637be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f22,336(r3) 1647be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f23,344(r3) 1657be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f24,352(r3) 1667be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f25,360(r3) 1677be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f26,368(r3) 1687be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f27,376(r3) 1697be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f28,384(r3) 1707be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f29,392(r3) 1717be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f30,400(r3) 1727be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lfd f31,408(r3) 173b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 1747be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ; restore vector registers if any are in use 1757be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r5,156(r3) ; test VRsave 1767be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik cmpwi r5,0 1777be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik beq Lnovec 178b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 179b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik subi r4,r1,16 180b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik rlwinm r4,r4,0,0,27 ; mask low 4-bits 181b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik ; r4 is now a 16-byte aligned pointer into the red zone 1827be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ; the _vectorRegisters may not be 16-byte aligned so copy via red zone temp buffer 183b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 184b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 1857be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#define LOAD_VECTOR_UNALIGNEDl(_index) \ 1867be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik andis. r0,r5,(1<<(15-_index)) @\ 1877be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik beq Ldone ## _index @\ 1887be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 424+_index*16(r3) @\ 1897be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik stw r0, 0(r4) @\ 1907be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 424+_index*16+4(r3) @\ 1917be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik stw r0, 4(r4) @\ 1927be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 424+_index*16+8(r3) @\ 1937be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik stw r0, 8(r4) @\ 1947be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 424+_index*16+12(r3)@\ 1957be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik stw r0, 12(r4) @\ 1967be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lvx v ## _index,0,r4 @\ 1977be749ac9c2c7b1871d29e5db957352d82728721Nick KledzikLdone ## _index: 198b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 1997be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik#define LOAD_VECTOR_UNALIGNEDh(_index) \ 2007be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik andi. r0,r5,(1<<(31-_index)) @\ 2017be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik beq Ldone ## _index @\ 2027be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 424+_index*16(r3) @\ 2037be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik stw r0, 0(r4) @\ 2047be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 424+_index*16+4(r3) @\ 2057be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik stw r0, 4(r4) @\ 2067be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 424+_index*16+8(r3) @\ 2077be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik stw r0, 8(r4) @\ 2087be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 424+_index*16+12(r3)@\ 2097be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik stw r0, 12(r4) @\ 2107be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lvx v ## _index,0,r4 @\ 2117be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik Ldone ## _index: 212b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 213b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 2147be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(0) 2157be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(1) 2167be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(2) 2177be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(3) 2187be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(4) 2197be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(5) 2207be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(6) 2217be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(7) 2227be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(8) 2237be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(9) 2247be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(10) 2257be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(11) 2267be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(12) 2277be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(13) 2287be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(14) 2297be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDl(15) 2307be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(16) 2317be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(17) 2327be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(18) 2337be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(19) 2347be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(20) 2357be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(21) 2367be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(22) 2377be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(23) 2387be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(24) 2397be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(25) 2407be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(26) 2417be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(27) 2427be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(28) 2437be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(29) 2447be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(30) 2457be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik LOAD_VECTOR_UNALIGNEDh(31) 2467be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik 2477be749ac9c2c7b1871d29e5db957352d82728721Nick KledzikLnovec: 2487be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 136(r3) ; __cr 2497be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik mtocrf 255,r0 2507be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 148(r3) ; __ctr 2517be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik mtctr r0 2527be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 0(r3) ; __ssr0 2537be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik mtctr r0 2547be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r0, 8(r3) ; do r0 now 2557be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r5,28(r3) ; do r5 now 2567be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r4,24(r3) ; do r4 now 2577be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r1,12(r3) ; do sp now 2587be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik lwz r3,20(r3) ; do r3 last 2597be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik bctr 2607be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik 261b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#elif __arm64__ 262b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 263b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; 2647be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik; void libunwind::Registers_arm64::jumpto() 265b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; 266b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; On entry: 267b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; thread_state pointer is in x0 268b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik; 2697c61d80c68ef9af39fbc49ef532c2252fa719ac9Nico WeberDEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind15Registers_arm646jumptoEv) 2707be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ; skip restore of x0,x1 for now 2717be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x2, x3, [x0, #0x010] 2727be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x4, x5, [x0, #0x020] 2737be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x6, x7, [x0, #0x030] 2747be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x8, x9, [x0, #0x040] 2757be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x10,x11, [x0, #0x050] 2767be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x12,x13, [x0, #0x060] 2777be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x14,x15, [x0, #0x070] 2787be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x16,x17, [x0, #0x080] 2797be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x18,x19, [x0, #0x090] 2807be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x20,x21, [x0, #0x0A0] 2817be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x22,x23, [x0, #0x0B0] 2827be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x24,x25, [x0, #0x0C0] 2837be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x26,x27, [x0, #0x0D0] 2847be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x28,fp, [x0, #0x0E0] 2857be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldr lr, [x0, #0x100] ; restore pc into lr 2867be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldr x1, [x0, #0x0F8] 2877be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik mov sp,x1 ; restore sp 2887be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik 2897be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d0, d1, [x0, #0x110] 2907be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d2, d3, [x0, #0x120] 2917be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d4, d5, [x0, #0x130] 2927be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d6, d7, [x0, #0x140] 2937be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d8, d9, [x0, #0x150] 2947be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d10,d11, [x0, #0x160] 2957be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d12,d13, [x0, #0x170] 2967be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d14,d15, [x0, #0x180] 2977be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d16,d17, [x0, #0x190] 2987be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d18,d19, [x0, #0x1A0] 2997be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d20,d21, [x0, #0x1B0] 3007be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d22,d23, [x0, #0x1C0] 3017be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d24,d25, [x0, #0x1D0] 3027be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d26,d27, [x0, #0x1E0] 3037be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp d28,d29, [x0, #0x1F0] 3047be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldr d30, [x0, #0x200] 3057be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldr d31, [x0, #0x208] 3067be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik 3077be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ldp x0, x1, [x0, #0x000] ; restore x0,x1 3087be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik ret lr ; jump to pc 3097be749ac9c2c7b1871d29e5db957352d82728721Nick Kledzik 3105ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber#elif __arm__ 3115ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber 3125ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@ 3135ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@ void libunwind::Registers_arm::jumpto() 3145ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@ 3155ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@ On entry: 3165ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@ thread_state pointer is in r0 3175ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber@ 3185ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico WeberDEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm6jumptoEv) 3195ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber @ Use lr as base so that r0 can be restored. 3205ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber mov lr, r0 3215ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber @ 32bit thumb-2 restrictions for ldm: 3225ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber @ . the sp (r13) cannot be in the list 3235ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber @ . the pc (r15) and lr (r14) cannot both be in the list in an LDM instruction 3245ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber ldm lr, {r0-r12} 3255ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber ldr sp, [lr, #52] 3265ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber ldr lr, [lr, #60] @ restore pc into lr 3275ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber mov pc, lr 3285ff06b0156f5820a87b4dd90bcd06f8ed41af8ccNico Weber 329b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#endif 330