Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa9d3b4d authored by Paul Mundt's avatar Paul Mundt
Browse files

Merge branch 'sh/dwarf-unwinder'

Conflicts:
	arch/sh/kernel/cpu/sh3/entry.S
parents c01f0f1a 74db2479
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -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
@@ -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>
+10 −18
Original line number Diff line number Diff line
@@ -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;

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

/*
@@ -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

@@ -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)
+5 −0
Original line number Diff line number Diff line
@@ -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)

+6 −0
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
@@ -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