Skip to content

Commit

Permalink
Merge branch 'sh/dwarf-unwinder'
Browse files Browse the repository at this point in the history
Conflicts:
	arch/sh/kernel/cpu/sh3/entry.S
  • Loading branch information
Paul Mundt committed Aug 21, 2009
2 parents c01f0f1 + 74db247 commit fa9d3b4
Show file tree
Hide file tree
Showing 10 changed files with 265 additions and 130 deletions.
31 changes: 31 additions & 0 deletions arch/sh/include/asm/bug.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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>
Expand Down
28 changes: 10 additions & 18 deletions arch/sh/include/asm/dwarf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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)
};

/*
Expand Down Expand Up @@ -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

Expand All @@ -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)
Expand Down
5 changes: 5 additions & 0 deletions arch/sh/include/asm/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
6 changes: 6 additions & 0 deletions arch/sh/include/asm/unwinder.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
2 changes: 2 additions & 0 deletions arch/sh/kernel/cpu/sh3/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading

0 comments on commit fa9d3b4

Please sign in to comment.