1adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.org/* libunwind - a platform-independent unwind library 2adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.org Copyright (C) 2008 CodeSourcery 3adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.org Copyright 2011 Linaro Limited 4adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.org 5adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgThis file is part of libunwind. 6adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.org 7adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgPermission is hereby granted, free of charge, to any person obtaining 81f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.coma copy of this software and associated documentation files (the 91f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com"Software"), to deal in the Software without restriction, including 10770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.comwithout limitation the rights to use, copy, modify, merge, publish, 11adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgdistribute, sublicense, and/or sell copies of the Software, and to 128f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.orgpermit persons to whom the Software is furnished to do so, subject to 13adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgthe following conditions: 14adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.org 15adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgThe above copyright notice and this permission notice shall be 16adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgincluded in all copies or substantial portions of the Software. 17adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.org 18adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 230e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.orgOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 240e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.orgWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 250e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org 260e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org#include <stdio.h> 270e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org#include "unwind_i.h" 280e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org 290e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org#ifdef __linux__ 300e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org#define ARM_NR_sigreturn 119 310e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org#define ARM_NR_rt_sigreturn 173 320e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org#define ARM_NR_OABI_SYSCALL_BASE 0x900000 330e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org 340e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org/* ARM EABI sigreturn (the syscall number is loaded into r7) */ 359f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org#define MOV_R7_SIGRETURN (0xe3a07000UL | ARM_NR_sigreturn) 369f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org#define MOV_R7_RT_SIGRETURN (0xe3a07000UL | ARM_NR_rt_sigreturn) 375fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org 389f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org/* ARM OABI sigreturn (using SWI) */ 399f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org#define ARM_SIGRETURN \ 409f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org (0xef000000UL | ARM_NR_sigreturn | ARM_NR_OABI_SYSCALL_BASE) 419f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org#define ARM_RT_SIGRETURN \ 429f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org (0xef000000UL | ARM_NR_rt_sigreturn | ARM_NR_OABI_SYSCALL_BASE) 439f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org 449f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org/* Thumb sigreturn (two insns, syscall number is loaded into r7) */ 459f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org#define THUMB_SIGRETURN (0xdf00UL << 16 | 0x2700 | ARM_NR_sigreturn) 469f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org#define THUMB_RT_SIGRETURN (0xdf00UL << 16 | 0x2700 | ARM_NR_rt_sigreturn) 479f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org#endif /* __linux__ */ 489f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org 499f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org/* Returns 1 in case of a non-RT signal frame and 2 in case of a RT signal 509f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org frame. */ 519f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.orgPROTECTED int 52adc58e4f485a24a3f28587bdcd3b90e5cbd09659junov@chromium.orgunw_is_signal_frame (unw_cursor_t *cursor) 539f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org{ 540e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org#ifdef __linux__ 555fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org struct cursor *c = (struct cursor *) cursor; 569f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org unw_word_t w0, ip; 579f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org unw_addr_space_t as; 589f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org unw_accessors_t *a; 590e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org void *arg; 600e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org int ret; 610e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org 620e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org as = c->dwarf.as; 635fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org a = unw_get_accessors (as); 645fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org arg = c->dwarf.as_arg; 655fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org 660e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org ip = c->dwarf.ip; 670e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org 680e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org if ((ret = (*a->access_mem) (as, ip, &w0, 0, arg)) < 0) 6984b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com /* ANDROID support update. */ 700e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org return 0; 710e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org /* End ANDROID update. */ 720e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org 733cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org /* Return 1 if the IP points to a non-RT sigreturn sequence. */ 749f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org if (w0 == MOV_R7_SIGRETURN || w0 == ARM_SIGRETURN || w0 == THUMB_SIGRETURN) 759f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org return 1; 760e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org /* Return 2 if the IP points to a RT sigreturn sequence. */ 7784b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com else if (w0 == MOV_R7_RT_SIGRETURN || w0 == ARM_RT_SIGRETURN 780e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org || w0 == THUMB_RT_SIGRETURN) 790e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org return 2; 809f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org 819f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org return 0; 820e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org#elif defined(__QNX__) 830e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org /* Not supported yet */ 8484b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com return 0; 850e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org#else 860e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org printf ("%s: implement me\n", __FUNCTION__); 879f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org return -UNW_ENOINFO; 889f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org#endif 899f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org} 900e9e6a331394721bdc47607733880d4c67b595ddcommit-bot@chromium.org