Loading arch/sh/include/asm/bug.h +31 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ #define __ASM_SH_BUG_H #define TRAPA_BUG_OPCODE 0xc33e /* trapa #0x3e */ #define BUGFLAG_UNWINDER (1 << 1) #ifdef CONFIG_GENERIC_BUG #define HAVE_ARCH_BUG Loading Loading @@ -72,6 +73,36 @@ do { \ unlikely(__ret_warn_on); \ }) #define UNWINDER_BUG() \ do { \ __asm__ __volatile__ ( \ "1:\t.short %O0\n" \ _EMIT_BUG_ENTRY \ : \ : "n" (TRAPA_BUG_OPCODE), \ "i" (__FILE__), \ "i" (__LINE__), \ "i" (BUGFLAG_UNWINDER), \ "i" (sizeof(struct bug_entry))); \ } while (0) #define UNWINDER_BUG_ON(x) ({ \ int __ret_unwinder_on = !!(x); \ if (__builtin_constant_p(__ret_unwinder_on)) { \ if (__ret_unwinder_on) \ UNWINDER_BUG(); \ } else { \ if (unlikely(__ret_unwinder_on)) \ UNWINDER_BUG(); \ } \ unlikely(__ret_unwinder_on); \ }) #else #define UNWINDER_BUG BUG #define UNWINDER_BUG_ON BUG_ON #endif /* CONFIG_GENERIC_BUG */ #include <asm-generic/bug.h> Loading arch/sh/include/asm/dwarf.h +10 −18 Original line number Diff line number Diff line Loading @@ -265,10 +265,7 @@ struct dwarf_frame { unsigned long pc; struct dwarf_reg *regs; unsigned int num_regs; /* how many regs are allocated? */ unsigned int depth; /* what level are we in the callstack? */ struct list_head reg_list; unsigned long cfa; Loading @@ -292,20 +289,15 @@ struct dwarf_frame { * @flags: Describes how to calculate the value of this register */ struct dwarf_reg { struct list_head link; unsigned int number; unsigned long addr; unsigned long flags; #define DWARF_REG_OFFSET (1 << 0) }; /** * dwarf_stack - a DWARF stack contains a collection of DWARF frames * @depth: the number of frames in the stack * @level: an array of DWARF frames, indexed by stack level * */ struct dwarf_stack { unsigned int depth; struct dwarf_frame **level; #define DWARF_VAL_OFFSET (1 << 1) #define DWARF_UNDEFINED (1 << 2) }; /* Loading Loading @@ -370,17 +362,16 @@ static inline unsigned int DW_CFA_operand(unsigned long insn) #define DW_EXT_HI 0xffffffff #define DW_EXT_DWARF64 DW_EXT_HI extern void dwarf_unwinder_init(void); extern struct dwarf_frame *dwarf_unwind_stack(unsigned long, struct dwarf_frame *); #endif /* __ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */ #define CFI_STARTPROC .cfi_startproc #define CFI_ENDPROC .cfi_endproc #define CFI_DEF_CFA .cfi_def_cfa #define CFI_REGISTER .cfi_register #define CFI_REL_OFFSET .cfi_rel_offset #define CFI_UNDEFINED .cfi_undefined #else Loading @@ -394,6 +385,7 @@ extern struct dwarf_frame *dwarf_unwind_stack(unsigned long, #define CFI_DEF_CFA CFI_IGNORE #define CFI_REGISTER CFI_IGNORE #define CFI_REL_OFFSET CFI_IGNORE #define CFI_UNDEFINED CFI_IGNORE #ifndef __ASSEMBLY__ static inline void dwarf_unwinder_init(void) Loading arch/sh/include/asm/system.h +5 −0 Original line number Diff line number Diff line Loading @@ -181,6 +181,11 @@ BUILD_TRAP_HANDLER(breakpoint); BUILD_TRAP_HANDLER(singlestep); BUILD_TRAP_HANDLER(fpu_error); BUILD_TRAP_HANDLER(fpu_state_restore); BUILD_TRAP_HANDLER(unwinder); #ifdef CONFIG_BUG extern void handle_BUG(struct pt_regs *); #endif #define arch_align_stack(x) (x) Loading arch/sh/include/asm/unwinder.h +6 −0 Original line number Diff line number Diff line Loading @@ -22,4 +22,10 @@ extern void stack_reader_dump(struct task_struct *, struct pt_regs *, unsigned long *, const struct stacktrace_ops *, void *); /* * Used by fault handling code to signal to the unwinder code that it * should switch to a different unwinder. */ extern int unwinder_faulted; #endif /* _LINUX_UNWINDER_H */ arch/sh/kernel/cpu/sh3/entry.S +2 −0 Original line number Diff line number Diff line Loading @@ -508,6 +508,8 @@ ENTRY(handle_interrupt) bsr save_regs ! needs original pr value in k3 mov #-1, k2 ! default vector kept in k2 setup_frame_reg stc sr, r0 ! get status register shlr2 r0 and #0x3c, r0 Loading Loading
arch/sh/include/asm/bug.h +31 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ #define __ASM_SH_BUG_H #define TRAPA_BUG_OPCODE 0xc33e /* trapa #0x3e */ #define BUGFLAG_UNWINDER (1 << 1) #ifdef CONFIG_GENERIC_BUG #define HAVE_ARCH_BUG Loading Loading @@ -72,6 +73,36 @@ do { \ unlikely(__ret_warn_on); \ }) #define UNWINDER_BUG() \ do { \ __asm__ __volatile__ ( \ "1:\t.short %O0\n" \ _EMIT_BUG_ENTRY \ : \ : "n" (TRAPA_BUG_OPCODE), \ "i" (__FILE__), \ "i" (__LINE__), \ "i" (BUGFLAG_UNWINDER), \ "i" (sizeof(struct bug_entry))); \ } while (0) #define UNWINDER_BUG_ON(x) ({ \ int __ret_unwinder_on = !!(x); \ if (__builtin_constant_p(__ret_unwinder_on)) { \ if (__ret_unwinder_on) \ UNWINDER_BUG(); \ } else { \ if (unlikely(__ret_unwinder_on)) \ UNWINDER_BUG(); \ } \ unlikely(__ret_unwinder_on); \ }) #else #define UNWINDER_BUG BUG #define UNWINDER_BUG_ON BUG_ON #endif /* CONFIG_GENERIC_BUG */ #include <asm-generic/bug.h> Loading
arch/sh/include/asm/dwarf.h +10 −18 Original line number Diff line number Diff line Loading @@ -265,10 +265,7 @@ struct dwarf_frame { unsigned long pc; struct dwarf_reg *regs; unsigned int num_regs; /* how many regs are allocated? */ unsigned int depth; /* what level are we in the callstack? */ struct list_head reg_list; unsigned long cfa; Loading @@ -292,20 +289,15 @@ struct dwarf_frame { * @flags: Describes how to calculate the value of this register */ struct dwarf_reg { struct list_head link; unsigned int number; unsigned long addr; unsigned long flags; #define DWARF_REG_OFFSET (1 << 0) }; /** * dwarf_stack - a DWARF stack contains a collection of DWARF frames * @depth: the number of frames in the stack * @level: an array of DWARF frames, indexed by stack level * */ struct dwarf_stack { unsigned int depth; struct dwarf_frame **level; #define DWARF_VAL_OFFSET (1 << 1) #define DWARF_UNDEFINED (1 << 2) }; /* Loading Loading @@ -370,17 +362,16 @@ static inline unsigned int DW_CFA_operand(unsigned long insn) #define DW_EXT_HI 0xffffffff #define DW_EXT_DWARF64 DW_EXT_HI extern void dwarf_unwinder_init(void); extern struct dwarf_frame *dwarf_unwind_stack(unsigned long, struct dwarf_frame *); #endif /* __ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */ #define CFI_STARTPROC .cfi_startproc #define CFI_ENDPROC .cfi_endproc #define CFI_DEF_CFA .cfi_def_cfa #define CFI_REGISTER .cfi_register #define CFI_REL_OFFSET .cfi_rel_offset #define CFI_UNDEFINED .cfi_undefined #else Loading @@ -394,6 +385,7 @@ extern struct dwarf_frame *dwarf_unwind_stack(unsigned long, #define CFI_DEF_CFA CFI_IGNORE #define CFI_REGISTER CFI_IGNORE #define CFI_REL_OFFSET CFI_IGNORE #define CFI_UNDEFINED CFI_IGNORE #ifndef __ASSEMBLY__ static inline void dwarf_unwinder_init(void) Loading
arch/sh/include/asm/system.h +5 −0 Original line number Diff line number Diff line Loading @@ -181,6 +181,11 @@ BUILD_TRAP_HANDLER(breakpoint); BUILD_TRAP_HANDLER(singlestep); BUILD_TRAP_HANDLER(fpu_error); BUILD_TRAP_HANDLER(fpu_state_restore); BUILD_TRAP_HANDLER(unwinder); #ifdef CONFIG_BUG extern void handle_BUG(struct pt_regs *); #endif #define arch_align_stack(x) (x) Loading
arch/sh/include/asm/unwinder.h +6 −0 Original line number Diff line number Diff line Loading @@ -22,4 +22,10 @@ extern void stack_reader_dump(struct task_struct *, struct pt_regs *, unsigned long *, const struct stacktrace_ops *, void *); /* * Used by fault handling code to signal to the unwinder code that it * should switch to a different unwinder. */ extern int unwinder_faulted; #endif /* _LINUX_UNWINDER_H */
arch/sh/kernel/cpu/sh3/entry.S +2 −0 Original line number Diff line number Diff line Loading @@ -508,6 +508,8 @@ ENTRY(handle_interrupt) bsr save_regs ! needs original pr value in k3 mov #-1, k2 ! default vector kept in k2 setup_frame_reg stc sr, r0 ! get status register shlr2 r0 and #0x3c, r0 Loading