@@ -1010,6 +1010,9 @@ class UnwindCursor : public AbstractUnwindCursor{
1010
1010
template <typename Registers> int stepThroughSigReturn (Registers &) {
1011
1011
return UNW_STEP_END;
1012
1012
}
1013
+ #elif defined(_LIBUNWIND_TARGET_HAIKU)
1014
+ bool setInfoForSigReturn ();
1015
+ int stepThroughSigReturn ();
1013
1016
#endif
1014
1017
1015
1018
#if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
@@ -1313,7 +1316,8 @@ class UnwindCursor : public AbstractUnwindCursor{
1313
1316
unw_proc_info_t _info;
1314
1317
bool _unwindInfoMissing;
1315
1318
bool _isSignalFrame;
1316
- #if defined(_LIBUNWIND_CHECK_LINUX_SIGRETURN)
1319
+ #if defined(_LIBUNWIND_CHECK_LINUX_SIGRETURN) || \
1320
+ defined (_LIBUNWIND_TARGET_HAIKU)
1317
1321
bool _isSigReturn = false;
1318
1322
#endif
1319
1323
};
@@ -2549,7 +2553,8 @@ int UnwindCursor<A, R>::stepWithTBTable(pint_t pc, tbtable *TBTable,
2549
2553
2550
2554
template <typename A, typename R>
2551
2555
void UnwindCursor<A, R>::setInfoBasedOnIPRegister(bool isReturnAddress) {
2552
- #if defined(_LIBUNWIND_CHECK_LINUX_SIGRETURN)
2556
+ #if defined(_LIBUNWIND_CHECK_LINUX_SIGRETURN) || \
2557
+ defined (_LIBUNWIND_TARGET_HAIKU)
2553
2558
_isSigReturn = false ;
2554
2559
#endif
2555
2560
@@ -2673,7 +2678,8 @@ void UnwindCursor<A, R>::setInfoBasedOnIPRegister(bool isReturnAddress) {
2673
2678
}
2674
2679
#endif // #if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
2675
2680
2676
- #if defined(_LIBUNWIND_CHECK_LINUX_SIGRETURN)
2681
+ #if defined(_LIBUNWIND_CHECK_LINUX_SIGRETURN) || \
2682
+ defined (_LIBUNWIND_TARGET_HAIKU)
2677
2683
if (setInfoForSigReturn ())
2678
2684
return ;
2679
2685
#endif
@@ -2749,6 +2755,63 @@ int UnwindCursor<A, R>::stepThroughSigReturn(Registers_arm64 &) {
2749
2755
_isSignalFrame = true ;
2750
2756
return UNW_STEP_SUCCESS;
2751
2757
}
2758
+
2759
+ #elif defined(_LIBUNWIND_TARGET_HAIKU) && defined(_LIBUNWIND_TARGET_X86_64)
2760
+ #include < commpage_defs.h>
2761
+ #include < signal.h>
2762
+
2763
+ extern " C" {
2764
+ extern void *__gCommPageAddress;
2765
+ }
2766
+
2767
+ template <typename A, typename R>
2768
+ bool UnwindCursor<A, R>::setInfoForSigReturn() {
2769
+ #if defined(_LIBUNWIND_TARGET_X86_64)
2770
+ addr_t signal_handler =
2771
+ (((addr_t *)__gCommPageAddress)[COMMPAGE_ENTRY_X86_SIGNAL_HANDLER] +
2772
+ (addr_t )__gCommPageAddress);
2773
+ addr_t signal_handler_ret = signal_handler + 45 ;
2774
+ #endif
2775
+ pint_t pc = static_cast <pint_t >(this ->getReg (UNW_REG_IP));
2776
+ if (pc == signal_handler_ret) {
2777
+ _info = {};
2778
+ _info.start_ip = signal_handler;
2779
+ _info.end_ip = signal_handler_ret;
2780
+ _isSigReturn = true ;
2781
+ return true ;
2782
+ }
2783
+ return false ;
2784
+ }
2785
+
2786
+ template <typename A, typename R>
2787
+ int UnwindCursor<A, R>::stepThroughSigReturn() {
2788
+ _isSignalFrame = true ;
2789
+ pint_t sp = _registers.getSP ();
2790
+ #if defined(_LIBUNWIND_TARGET_X86_64)
2791
+ vregs *regs = (vregs *)(sp + 0x70 );
2792
+
2793
+ _registers.setRegister (UNW_REG_IP, regs->rip );
2794
+ _registers.setRegister (UNW_REG_SP, regs->rsp );
2795
+ _registers.setRegister (UNW_X86_64_RAX, regs->rax );
2796
+ _registers.setRegister (UNW_X86_64_RDX, regs->rdx );
2797
+ _registers.setRegister (UNW_X86_64_RCX, regs->rcx );
2798
+ _registers.setRegister (UNW_X86_64_RBX, regs->rbx );
2799
+ _registers.setRegister (UNW_X86_64_RSI, regs->rsi );
2800
+ _registers.setRegister (UNW_X86_64_RDI, regs->rdi );
2801
+ _registers.setRegister (UNW_X86_64_RBP, regs->rbp );
2802
+ _registers.setRegister (UNW_X86_64_R8, regs->r8 );
2803
+ _registers.setRegister (UNW_X86_64_R9, regs->r9 );
2804
+ _registers.setRegister (UNW_X86_64_R10, regs->r10 );
2805
+ _registers.setRegister (UNW_X86_64_R11, regs->r11 );
2806
+ _registers.setRegister (UNW_X86_64_R12, regs->r12 );
2807
+ _registers.setRegister (UNW_X86_64_R13, regs->r13 );
2808
+ _registers.setRegister (UNW_X86_64_R14, regs->r14 );
2809
+ _registers.setRegister (UNW_X86_64_R15, regs->r15 );
2810
+ // TODO: XMM
2811
+ #endif
2812
+
2813
+ return UNW_STEP_SUCCESS;
2814
+ }
2752
2815
#endif // defined(_LIBUNWIND_CHECK_LINUX_SIGRETURN) &&
2753
2816
// defined(_LIBUNWIND_TARGET_AARCH64)
2754
2817
@@ -2917,7 +2980,8 @@ template <typename A, typename R> int UnwindCursor<A, R>::step(bool stage2) {
2917
2980
2918
2981
// Use unwinding info to modify register set as if function returned.
2919
2982
int result;
2920
- #if defined(_LIBUNWIND_CHECK_LINUX_SIGRETURN)
2983
+ #if defined(_LIBUNWIND_CHECK_LINUX_SIGRETURN) || \
2984
+ defined (_LIBUNWIND_TARGET_HAIKU)
2921
2985
if (_isSigReturn) {
2922
2986
result = this ->stepThroughSigReturn ();
2923
2987
} else
0 commit comments