Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Support SH3 in our unwinder.



details:   https://anonhg.NetBSD.org/src/rev/afb73287ec94
branches:  trunk
changeset: 328416:afb73287ec94
user:      joerg <joerg%NetBSD.org@localhost>
date:      Wed Apr 02 22:34:29 2014 +0000

description:
Support SH3 in our unwinder.

diffstat:

 share/mk/bsd.own.mk                  |   4 +-
 sys/lib/libunwind/Registers.hpp      |  64 ++++++++++++++++++++++++++++++++++++
 sys/lib/libunwind/libunwind.cxx      |   2 +
 sys/lib/libunwind/unwind_registers.S |  57 ++++++++++++++++++++++++++++++++
 4 files changed, 126 insertions(+), 1 deletions(-)

diffs (168 lines):

diff -r 69bb6e5d592c -r afb73287ec94 share/mk/bsd.own.mk
--- a/share/mk/bsd.own.mk       Wed Apr 02 22:22:37 2014 +0000
+++ b/share/mk/bsd.own.mk       Wed Apr 02 22:34:29 2014 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: bsd.own.mk,v 1.792 2014/03/25 09:52:55 ozaki-r Exp $
+#      $NetBSD: bsd.own.mk,v 1.793 2014/04/02 22:34:29 joerg Exp $
 
 # This needs to be before bsd.init.mk
 .if defined(BSD_MK_COMPAT_FILE)
@@ -101,6 +101,8 @@
 _LIBC_UNWIND_SUPPORT.i386=     yes
 _LIBC_UNWIND_SUPPORT.m68k=     yes
 _LIBC_UNWIND_SUPPORT.powerpc=  yes
+_LIBC_UNWIND_SUPPORT.sh3el=    yes
+_LIBC_UNWIND_SUPPORT.sh3eb=    yes
 _LIBC_UNWIND_SUPPORT.vax=      yes
 _LIBC_UNWIND_SUPPORT.x86_64=   yes
 .if ${MKLLVM:Uno} == "yes" && ${_LIBC_UNWIND_SUPPORT.${MACHINE_ARCH}:Uno} == "yes"
diff -r 69bb6e5d592c -r afb73287ec94 sys/lib/libunwind/Registers.hpp
--- a/sys/lib/libunwind/Registers.hpp   Wed Apr 02 22:22:37 2014 +0000
+++ b/sys/lib/libunwind/Registers.hpp   Wed Apr 02 22:34:29 2014 +0000
@@ -454,6 +454,70 @@
   fpreg_t fpreg[8];
 };
 
+enum {
+  DWARF_SH3_R0 = 0,
+  DWARF_SH3_R15 = 15,
+  DWARF_SH3_PC = 16,
+  DWARF_SH3_PR = 17,
+
+  REGNO_SH3_R0 = 0,
+  REGNO_SH3_R15 = 15,
+  REGNO_SH3_PC = 16,
+  REGNO_SH3_PR = 17,
+};
+
+class Registers_SH3 {
+public:
+  enum {
+    LAST_REGISTER = REGNO_SH3_PR,
+    LAST_RESTORE_REG = REGNO_SH3_PR,
+    RETURN_REG = REGNO_SH3_PR,
+  };
+
+  __dso_hidden Registers_SH3();
+
+  static int dwarf2regno(int num) {
+    if (num >= DWARF_SH3_R0 && num <= DWARF_SH3_R15)
+      return REGNO_SH3_R0 + (num - DWARF_SH3_R0);
+    if (num == DWARF_SH3_PC)
+      return REGNO_SH3_PC;
+    if (num == DWARF_SH3_PR)
+      return REGNO_SH3_PR;
+    return LAST_REGISTER + 1;
+  }
+
+  bool validRegister(int num) const {
+    return num >= 0 && num <= REGNO_SH3_PR;
+  }
+
+  uint64_t getRegister(int num) const {
+    assert(validRegister(num));
+    return reg[num];
+  }
+
+  void setRegister(int num, uint64_t value) {
+    assert(validRegister(num));
+    reg[num] = value;
+  }
+
+  uint64_t getIP() const { return reg[REGNO_SH3_PC]; }
+
+  void setIP(uint64_t value) { reg[REGNO_SH3_PC] = value; }
+
+  uint64_t getSP() const { return reg[REGNO_SH3_R15]; }
+
+  void setSP(uint64_t value) { reg[REGNO_SH3_R15] = value; }
+
+  bool validFloatVectorRegister(int num) const { return false; }
+
+  void copyFloatVectorRegister(int num, uint64_t addr_) {}
+
+  __dso_hidden void jumpto() const __dead;
+
+private:
+  uint32_t reg[REGNO_SH3_PR + 1];
+};
+
 } // namespace _Unwind
 
 #endif // __REGISTERS_HPP__
diff -r 69bb6e5d592c -r afb73287ec94 sys/lib/libunwind/libunwind.cxx
--- a/sys/lib/libunwind/libunwind.cxx   Wed Apr 02 22:22:37 2014 +0000
+++ b/sys/lib/libunwind/libunwind.cxx   Wed Apr 02 22:34:29 2014 +0000
@@ -29,6 +29,8 @@
 typedef Registers_vax ThisUnwindRegisters;
 #elif __m68k__
 typedef Registers_M68K ThisUnwindRegisters;
+#elif __sh3__
+typedef Registers_SH3 ThisUnwindRegisters;
 #else
 #error Unsupported architecture
 #endif
diff -r 69bb6e5d592c -r afb73287ec94 sys/lib/libunwind/unwind_registers.S
--- a/sys/lib/libunwind/unwind_registers.S      Wed Apr 02 22:22:37 2014 +0000
+++ b/sys/lib/libunwind/unwind_registers.S      Wed Apr 02 22:34:29 2014 +0000
@@ -364,3 +364,60 @@
        rts
 END(_ZNK7_Unwind14Registers_M68K6jumptoEv)
 #endif
+
+#if defined(__sh3__)
+       .hidden _ZN7_Unwind13Registers_SH3C1Ev
+ENTRY(_ZN7_Unwind13Registers_SH3C1Ev)
+       add     #64, r4
+       mov.l   r8, @-r15
+       sts.l   pr, @-r15
+       mov.l   @r15+, r8
+       mov.l   r8, @r4
+       mov.l   @r15+, r8
+
+       mov.l   r15, @-r4
+       mov.l   r14, @-r4
+       mov.l   r13, @-r4
+       mov.l   r12, @-r4
+       mov.l   r11, @-r4
+       mov.l   r10, @-r4
+       mov.l   r9, @-r4
+       mov.l   r8, @-r4
+       mov.l   r7, @-r4
+       mov.l   r6, @-r4
+       mov.l   r5, @-r4
+       add     #-4, r4
+       mov.l   r3, @-r4
+       mov.l   r2, @-r4
+       mov.l   r1, @-r4
+       mov.l   r0, @-r4
+       rts
+         mov.l r4, @(16,r4)
+SET_ENTRY_SIZE(_ZN7_Unwind13Registers_SH3C1Ev)
+
+       .hidden _ZNK7_Unwind13Registers_SH36jumptoEv
+ENTRY(_ZNK7_Unwind13Registers_SH36jumptoEv)
+       mov     r4, r0
+       add     #4, r0
+       mov.l   @r0+, r1
+       mov.l   @r0+, r2
+       mov.l   @r0+, r3
+       mov.l   @r0+, r4
+       mov.l   @r0+, r5
+       mov.l   @r0+, r6
+       mov.l   @r0+, r7
+       mov.l   @r0+, r8
+       mov.l   @r0+, r9
+       mov.l   @r0+, r10
+       mov.l   @r0+, r11
+       mov.l   @r0+, r12
+       mov.l   @r0+, r13
+       mov.l   @(12, r0), r14
+       lds     r14, pr
+       mov.l   @r0+, r14
+       mov.l   @r0+, r15
+       mov.l   @r0, r0
+       jmp     @r0
+         nop
+SET_ENTRY_SIZE(_ZNK7_Unwind13Registers_SH36jumptoEv)
+#endif



Home | Main Index | Thread Index | Old Index