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