18d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* libunwind - a platform-independent unwind library
28d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
38d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
48d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaThis file is part of libunwind.
58d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
68d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaPermission is hereby granted, free of charge, to any person obtaining
78d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaa copy of this software and associated documentation files (the
88d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala"Software"), to deal in the Software without restriction, including
98d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalawithout limitation the rights to use, copy, modify, merge, publish,
108d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladistribute, sublicense, and/or sell copies of the Software, and to
118d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalapermit persons to whom the Software is furnished to do so, subject to
128d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalathe following conditions:
138d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
148d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaThe above copyright notice and this permission notice shall be
158d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaincluded in all copies or substantial portions of the Software.
168d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
178d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
188d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
198d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
208d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
218d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
228d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
238d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
248d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
258d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include "unwind_i.h"
268d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
278d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* Disassembly of the Linux VDSO sigreturn functions:
288d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
298d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala00000000 <__kernel_sigreturn>:
308d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   0:   05 93           mov.w   e <__kernel_sigreturn+0xe>,r3   ! 77
318d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   2:   10 c3           trapa   #16
328d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   4:   0b 20           or      r0,r0
338d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   6:   0b 20           or      r0,r0
348d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   8:   0b 20           or      r0,r0
358d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   a:   0b 20           or      r0,r0
368d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   c:   0b 20           or      r0,r0
378d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   e:   77 00           .word 0x0077
388d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  10:   09 00           nop
398d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  12:   09 00           nop
408d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  14:   09 00           nop
418d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  16:   09 00           nop
428d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  18:   09 00           nop
438d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  1a:   09 00           nop
448d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  1c:   09 00           nop
458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  1e:   09 00           nop
468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala00000020 <__kernel_rt_sigreturn>:
488d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  20:   05 93           mov.w   2e <__kernel_rt_sigreturn+0xe>,r3       ! ad
498d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  22:   10 c3           trapa   #16
508d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  24:   0b 20           or      r0,r0
518d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  26:   0b 20           or      r0,r0
528d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  28:   0b 20           or      r0,r0
538d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  2a:   0b 20           or      r0,r0
548d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  2c:   0b 20           or      r0,r0
558d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  2e:   ad 00           mov.w   @(r0,r10),r0
568d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  30:   09 00           nop
578d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  32:   09 00           nop
588d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  34:   09 00           nop
598d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  36:   09 00           nop
608d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  38:   09 00           nop
618d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  3a:   09 00           nop
628d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  3c:   09 00           nop
638d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  3e:   09 00           nop
648d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala*/
658d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
668d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaPROTECTED int
678d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaunw_is_signal_frame (unw_cursor_t *cursor)
688d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
698d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#ifdef __linux__
708d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  struct cursor *c = (struct cursor *) cursor;
718d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  unw_word_t w0, ip;
728d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  unw_addr_space_t as;
738d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  unw_accessors_t *a;
748d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  void *arg;
758d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  int ret;
768d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
778d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  as = c->dwarf.as;
788d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  a = unw_get_accessors (as);
798d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  arg = c->dwarf.as_arg;
808d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
818d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  ip = c->dwarf.ip;
828d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
838d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  ret = (*a->access_mem) (as, ip, &w0, 0, arg);
848d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (ret < 0)
858d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return ret;
868d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
878d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (w0 != 0xc3109305)
888d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return 0;
898d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
908d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  ret = (*a->access_mem) (as, ip+4, &w0, 0, arg);
918d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (ret < 0)
928d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return ret;
938d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
948d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (w0 != 0x200b200b)
958d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return 0;
968d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
978d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  ret = (*a->access_mem) (as, ip+8, &w0, 0, arg);
988d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (ret < 0)
998d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return ret;
1008d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1018d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (w0 != 0x200b200b)
1028d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return 0;
1038d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1048d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  ret = (*a->access_mem) (as, ip+12, &w0, 0, arg);
1058d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (ret < 0)
1068d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return ret;
1078d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1088d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (w0 == 0x0077200b)
1098d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return 1; /* non-RT */
1108d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  else if (w0 == 0x00ad200b)
1118d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return 2; /* RT */
1128d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1138d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  /* does not look like a signal frame */
1148d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return 0;
1158d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1168d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#else
1178d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return -UNW_ENOINFO;
1188d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif
1198d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
120