1. 17 8月, 2009 1 次提交
  2. 16 8月, 2009 2 次提交
    • M
      sh: Add support for DWARF GNU extensions · cd7246f0
      Matt Fleming 提交于
      Also, remove the "fix" to DW_CFA_def_cfa_register where we reset the
      frame's cfa_offset to 0. This action is incorrect when handling
      DW_CFA_def_cfa_register as the DWARF spec specifically states that the
      previous contents of cfa_offset should be used with the new
      register. The reason that I thought cfa_offset should be reset to 0 was
      because it was being assigned a bogus value prior to executing the
      DW_CFA_def_cfa_register op. It turns out that the bogus cfa_offset value
      came from interpreting .cfi_escape pseudo-ops (those used by the GNU
      extensions) as CFA_DW_def_cfa ops.
      Signed-off-by: NMatt Fleming <matt@console-pimps.org>
      cd7246f0
    • M
      sh: Try again at getting the initial return address for an unwind · b955873b
      Matt Fleming 提交于
      The previous hack for calculating the return address for the first frame
      we unwind (dwarf_unwinder_dump) didn't always work. The problem was that
      it assumed once it read the rule for calculating the return address,
      there would be no new rules for calculating it. This isn't true because
      the way in which the CFA is calculated can change as you progress
      through a function and the return address is figured out using the
      CFA. Therefore, the way to calculate the return address can change.
      
      So, instead of using some offset from the beginning of
      dwarf_unwind_stack which is just a flakey approach, and instead of
      executing instructions from the FDE until the return address is setup,
      we now figure out the pc in dwarf_unwind_stack() just before we call
      dwarf_cfa_execute_insns().
      Signed-off-by: NMatt Fleming <matt@console-pimps.org>
      b955873b
  3. 15 8月, 2009 1 次提交
  4. 14 8月, 2009 5 次提交
    • P
      sh: unwinder: Convert frame allocations to GFP_ATOMIC. · 0fc11e36
      Paul Mundt 提交于
      save_stack_trace_tsk() and friends can be called from atomic context (as
      triggered by latencytop), and subsequently hit two problematic allocation
      points that were using GFP_KERNEL (these were dwarf_unwind_stack() and
      dwarf_frame_alloc_regs()). Convert these over to GFP_ATOMIC and get
      latencytop working with the DWARF unwinder.
      Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
      0fc11e36
    • M
      sh: Delete DWARF_ARCH_UNWIND_OFFSET · f8264667
      Matt Fleming 提交于
      Trying to figure out the best value for DWARF_ARCH_UNWIND_OFFSET is
      tricky at best. Various things can change the size (and offset from the
      beginning of the function) of the prologue. Notably, turning on ftrace
      adds calls to mcount at the beginning of functions, thereby pushing the
      prologue further into the function.
      
      So replace DWARF_ARCH_UNWIND_OFFSET with some code that continues to
      execute CFA instructions until the value of return address register is
      defined. This is safe to do because we know that the return address must
      have been pushed onto the frame before our first function call; we just
      can't figure out where at compile-time.
      Signed-off-by: NMatt Fleming <matt@console-pimps.org>
      Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
      f8264667
    • P
      sh: unwinder: Restore put_unaligned() for an unaligned destination. · bf43a160
      Paul Mundt 提交于
      The destination address might be unaligned, so set it with
      put_unaligned() for safety. This restores the previous behaviour, albeit
      through the proper API.
      Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
      bf43a160
    • P
      sh: unwinder: Fix up usage of unaligned accessors. · 3497447f
      Paul Mundt 提交于
      This was using internal symbols for unaligned accesses, bypassing the
      exposed interface for variable sized safe accesses. This converts all of
      the __get_unaligned_cpuXX() users over to get_unaligned() directly,
      relying on the cast to select the proper internal routine.
      
      Additionally, the __put_unaligned_cpuXX() case is superfluous given that
      the destination address is aligned in all of the current cases, so just
      drop that outright.
      
      Furthermore, this switches to the asm/unaligned.h header instead of the
      asm-generic version, which was silently bypassing the SH-4A optimized
      unaligned ops.
      Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
      3497447f
    • M
      sh: dwarf unwinder support. · bd353861
      Matt Fleming 提交于
      This is a first cut at a generic DWARF unwinder for the kernel. It's
      still lacking DWARF64 support and the DWARF expression support hasn't
      been tested very well but it is generating proper stacktraces on SH for
      WARN_ON() and NULL dereferences.
      Signed-off-by: NMatt Fleming <matt@console-pimps.org>
      Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
      bd353861