12a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris/* 22a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * Copyright (C) 2016 The Android Open Source Project 32a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * All rights reserved. 42a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * 52a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * Redistribution and use in source and binary forms, with or without 62a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * modification, are permitted provided that the following conditions 72a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * are met: 82a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * * Redistributions of source code must retain the above copyright 92a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * notice, this list of conditions and the following disclaimer. 102a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * * Redistributions in binary form must reproduce the above copyright 112a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * notice, this list of conditions and the following disclaimer in 122a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * the documentation and/or other materials provided with the 132a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * distribution. 142a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * 152a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 182a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 192a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 202a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 212a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 222a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 232a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 242a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 252a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 262a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * SUCH DAMAGE. 272a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris */ 282a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris 292a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris#ifndef _LIBUNWINDSTACK_REGS_GET_LOCAL_H 302a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris#define _LIBUNWINDSTACK_REGS_GET_LOCAL_H 312a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris 32d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferrisnamespace unwindstack { 33d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris 342a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris#if defined(__arm__) 352a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris 36be788d891da26943b1ad6abe0f07a8745fa676d5Christopher Ferrisinline __always_inline void RegsGetLocal(Regs* regs) { 372a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris void* reg_data = regs->RawData(); 382a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris asm volatile( 392a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris ".align 2\n" 402a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "bx pc\n" 412a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "nop\n" 422a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris ".code 32\n" 432a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stmia %[base], {r0-r12}\n" 442a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "add %[base], #52\n" 452a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "mov r1, r13\n" 462a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "mov r2, r14\n" 472a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "mov r3, r15\n" 482a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stmia %[base], {r1-r3}\n" 492a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "orr %[base], pc, #1\n" 502a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "bx %[base]\n" 512a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris : [base] "+r"(reg_data) 522a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris : 532a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris : "memory"); 542a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris} 552a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris 562a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris#elif defined(__aarch64__) 572a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris 58be788d891da26943b1ad6abe0f07a8745fa676d5Christopher Ferrisinline __always_inline void RegsGetLocal(Regs* regs) { 592a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris void* reg_data = regs->RawData(); 602a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris asm volatile( 612a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "1:\n" 622a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x0, x1, [%[base], #0]\n" 632a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x2, x3, [%[base], #16]\n" 642a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x4, x5, [%[base], #32]\n" 652a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x6, x7, [%[base], #48]\n" 662a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x8, x9, [%[base], #64]\n" 672a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x10, x11, [%[base], #80]\n" 682a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x12, x13, [%[base], #96]\n" 692a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x14, x15, [%[base], #112]\n" 702a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x16, x17, [%[base], #128]\n" 712a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x18, x19, [%[base], #144]\n" 722a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x20, x21, [%[base], #160]\n" 732a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x22, x23, [%[base], #176]\n" 742a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x24, x25, [%[base], #192]\n" 752a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x26, x27, [%[base], #208]\n" 762a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x28, x29, [%[base], #224]\n" 772a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "str x30, [%[base], #240]\n" 782a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "mov x12, sp\n" 792a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "adr x13, 1b\n" 802a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris "stp x12, x13, [%[base], #248]\n" 812a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris : [base] "+r"(reg_data) 822a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris : 832a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris : "x12", "x13", "memory"); 842a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris} 852a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris 8661b1a1ae7797e0d3177400cdb3cda028ea14669dDouglas Leung#elif defined(__i386__) || defined(__x86_64__) || defined(__mips__) 872a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris 882a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisextern "C" void AsmGetRegs(void* regs); 892a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris 902a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisinline void RegsGetLocal(Regs* regs) { 912a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris AsmGetRegs(regs->RawData()); 922a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris} 932a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris 942a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris#endif 952a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris 96d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris} // namespace unwindstack 97d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris 982a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris#endif // _LIBUNWINDSTACK_REGS_GET_LOCAL_H 99