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