Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 163439
b: refs/heads/master
c: b955873
h: refs/heads/master
i:
  163437: 24bf56e
  163435: 1889eb7
  163431: f2ba248
  163423: 5f2c9df
v: v3
  • Loading branch information
Matt Fleming committed Aug 16, 2009
1 parent ae1ce47 commit a6adf83
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 36 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 38f9ddf44150c1a213b41726384d055f7c35ec4f
refs/heads/master: b955873bf530ee4b80e6c8b734521ad07cbaed7e
41 changes: 6 additions & 35 deletions trunk/arch/sh/kernel/dwarf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit a6adf83

Please sign in to comment.