From a6adf83ea2cb4b7b7b73b1388be2e783e97a8136 Mon Sep 17 00:00:00 2001 From: Matt Fleming Date: Sat, 15 Aug 2009 23:10:57 +0100 Subject: [PATCH] --- yaml --- r: 163439 b: refs/heads/master c: b955873bf530ee4b80e6c8b734521ad07cbaed7e h: refs/heads/master i: 163437: 24bf56eda08533f6c3bc4a58516820495668cfa4 163435: 1889eb7a4eea7342f5936d3431f3fa7bfbe27b9b 163431: f2ba248dfa2c4df09ac5d37365dfb5f06631362e 163423: 5f2c9dfa33038971c6c557994f87a854be57aa5a v: v3 --- [refs] | 2 +- trunk/arch/sh/kernel/dwarf.c | 41 ++++++------------------------------ 2 files changed, 7 insertions(+), 36 deletions(-) diff --git a/[refs] b/[refs] index c80fe0728a3b..9b38da6635fc 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 38f9ddf44150c1a213b41726384d055f7c35ec4f +refs/heads/master: b955873bf530ee4b80e6c8b734521ad07cbaed7e diff --git a/trunk/arch/sh/kernel/dwarf.c b/trunk/arch/sh/kernel/dwarf.c index c6c5764a8ab1..44e674ed2871 100644 --- a/trunk/arch/sh/kernel/dwarf.c +++ b/trunk/arch/sh/kernel/dwarf.c @@ -330,7 +330,6 @@ struct dwarf_fde *dwarf_lookup_fde(unsigned long pc) * @fde: the FDE for this function * @frame: the instructions calculate the CFA for this frame * @pc: the program counter of the address we're interested in - * @define_ra: keep executing insns until the return addr reg is defined? * * Execute the Call Frame instruction sequence starting at * @insn_start and ending at @insn_end. The instructions describe @@ -342,36 +341,17 @@ static int dwarf_cfa_execute_insns(unsigned char *insn_start, struct dwarf_cie *cie, struct dwarf_fde *fde, struct dwarf_frame *frame, - unsigned long pc, - bool define_ra) + unsigned long pc) { unsigned char insn; unsigned char *current_insn; unsigned int count, delta, reg, expr_len, offset; - bool seen_ra_reg; current_insn = insn_start; - /* - * If we're executing instructions for the dwarf_unwind_stack() - * FDE we need to keep executing instructions until the value of - * DWARF_ARCH_RA_REG is defined. See the comment in - * dwarf_unwind_stack() for more details. - */ - if (define_ra) - seen_ra_reg = false; - else - seen_ra_reg = true; - - while (current_insn < insn_end && (frame->pc <= pc || !seen_ra_reg) ) { + while (current_insn < insn_end && frame->pc <= pc) { insn = __raw_readb(current_insn++); - if (!seen_ra_reg) { - if (frame->num_regs >= DWARF_ARCH_RA_REG && - frame->regs[DWARF_ARCH_RA_REG].flags) - seen_ra_reg = true; - } - /* * Firstly, handle the opcodes that embed their operands * in the instructions. @@ -511,26 +491,17 @@ struct dwarf_frame *dwarf_unwind_stack(unsigned long pc, struct dwarf_fde *fde; unsigned long addr; int i, offset; - bool define_ra = false; /* * If this is the first invocation of this recursive function we * need get the contents of a physical register to get the CFA * in order to begin the virtual unwinding of the stack. * - * Setting "define_ra" to true indictates that we want - * dwarf_cfa_execute_insns() to continue executing instructions - * until we know how to calculate the value of DWARF_ARCH_RA_REG - * (which we need in order to kick off the whole unwinding - * process). - * * NOTE: the return address is guaranteed to be setup by the * time this function makes its first function call. */ - if (!pc && !prev) { - pc = (unsigned long)&dwarf_unwind_stack; - define_ra = true; - } + if (!pc && !prev) + pc = (unsigned long)current_text_addr(); frame = kzalloc(sizeof(*frame), GFP_ATOMIC); if (!frame) @@ -566,11 +537,11 @@ struct dwarf_frame *dwarf_unwind_stack(unsigned long pc, /* CIE initial instructions */ dwarf_cfa_execute_insns(cie->initial_instructions, cie->instructions_end, cie, fde, - frame, pc, false); + frame, pc); /* FDE instructions */ dwarf_cfa_execute_insns(fde->instructions, fde->end, cie, - fde, frame, pc, define_ra); + fde, frame, pc); /* Calculate the CFA */ switch (frame->flags) {