An error occurred fetching the project authors.
  1. 31 Aug, 2009 1 commit
  2. 22 Aug, 2009 1 commit
  3. 21 Aug, 2009 5 commits
    • Matt Fleming's avatar
      sh: Handle the DWARF op, DW_CFA_undefined · 5580e904
      Matt Fleming authored
      Allow a DWARF register to have an undefined value. When applied to the
      DWARF return address register this lets lets us label a function as
      having no direct caller, e.g. kernel_thread_helper().
      Signed-off-by: default avatarMatt Fleming <matt@console-pimps.org>
      5580e904
    • Matt Fleming's avatar
      sh: Fix bug calculating the end of the FDE instructions · 5480675d
      Matt Fleming authored
      The 'end' member of struct dwarf_fde denotes one byte past the end of
      the CFA instruction stream for an FDE. The value of 'end' was being
      calcualted incorrectly, it was being set too high. This resulted in
      dwarf_cfa_execute_insns() interpreting data past the end of valid
      instructions, thus causing all sorts of weird crashes.
      Signed-off-by: default avatarMatt Fleming <matt@console-pimps.org>
      5480675d
    • Matt Fleming's avatar
      sh: unwinder: Introduce UNWINDER_BUG() and UNWINDER_BUG_ON() · b344e24a
      Matt Fleming authored
      We can't assume that if we execute the unwinder code and the unwinder
      was already running that it has faulted. Clearly two kernel threads can
      invoke the unwinder at the same time and may be running simultaneously.
      
      The previous approach used BUG() and BUG_ON() in the unwinder code to
      detect whether the unwinder was incapable of unwinding the stack, and
      that the next available unwinder should be used instead. A better
      approach is to explicitly invoke a trap handler to switch unwinders when
      the current unwinder cannot continue.
      Signed-off-by: default avatarMatt Fleming <matt@console-pimps.org>
      b344e24a
    • Matt Fleming's avatar
      sh: unwinder: Set the flags for DW_CFA_val_offset ops as DWARF_VAL_OFFSET · 97efbbd5
      Matt Fleming authored
      The handling of DW_CFA_val_offset ops was incorrectly using the
      DWARF_REG_OFFSET flag but the register's value cannot be calculated
      using the DWARF_REG_OFFSET method. Create a new flag to indicate that a
      different method must be used to calculate the register's value even
      though there is no implementation for DWARF_VAL_OFFSET yet; it's mainly
      just a place holder.
      Signed-off-by: default avatarMatt Fleming <matt@console-pimps.org>
      97efbbd5
    • Matt Fleming's avatar
      sh: unwinder: Fix memory leak and create our own kmem cache · fb3f3e7f
      Matt Fleming authored
      Plug a memory leak in dwarf_unwinder_dump() where we didn't free the
      memory that we had previously allocated for the DWARF frames and DWARF
      registers.
      
      Now is also a opportune time to implement our own mempool and kmem
      cache. It's a good idea to have a certain number of frame and register
      objects in reserve at all times, so that we are guaranteed to have our
      allocation satisfied even when memory is scarce. Since we have pools to
      allocate from we can implement the registers for each frame as a linked
      list as opposed to a sparsely populated array. Whilst it's true that the
      lookup time for a linked list is larger than for arrays, there's only
      usually a maximum of 8 registers per frame. So the overhead isn't that
      much of a concern.
      Signed-off-by: default avatarMatt Fleming <matt@console-pimps.org>
      fb3f3e7f
  4. 16 Aug, 2009 3 commits
    • Paul Mundt's avatar
      sh: unwinder: Move initialization to early_initcall() and tidy up locking. · 97f361e2
      Paul Mundt authored
      This moves the initialization over to an early_initcall(). This fixes up
      some lockdep interaction issues. At the same time, kill off some
      superfluous locking in the init path.
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      97f361e2
    • Matt Fleming's avatar
      sh: Add support for DWARF GNU extensions · cd7246f0
      Matt Fleming authored
      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: default avatarMatt Fleming <matt@console-pimps.org>
      cd7246f0
    • Matt Fleming's avatar
      sh: Try again at getting the initial return address for an unwind · b955873b
      Matt Fleming authored
      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: default avatarMatt Fleming <matt@console-pimps.org>
      b955873b
  5. 14 Aug, 2009 2 commits
  6. 13 Aug, 2009 4 commits
    • Matt Fleming's avatar
      sh: Delete DWARF_ARCH_UNWIND_OFFSET · f8264667
      Matt Fleming authored
      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: default avatarMatt Fleming <matt@console-pimps.org>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      f8264667
    • Paul Mundt's avatar
      sh: unwinder: Restore put_unaligned() for an unaligned destination. · bf43a160
      Paul Mundt authored
      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: default avatarPaul Mundt <lethal@linux-sh.org>
      bf43a160
    • Paul Mundt's avatar
      sh: unwinder: Fix up usage of unaligned accessors. · 3497447f
      Paul Mundt authored
      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: default avatarPaul Mundt <lethal@linux-sh.org>
      3497447f
    • Matt Fleming's avatar
      sh: dwarf unwinder support. · bd353861
      Matt Fleming authored
      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: default avatarMatt Fleming <matt@console-pimps.org>
      Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
      bd353861