root/arch/x86/kernel/unwind_guess.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. unwind_get_return_address
  2. unwind_get_return_address_ptr
  3. unwind_next_frame
  4. __unwind_start

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 #include <linux/sched.h>
   3 #include <linux/ftrace.h>
   4 #include <asm/ptrace.h>
   5 #include <asm/bitops.h>
   6 #include <asm/stacktrace.h>
   7 #include <asm/unwind.h>
   8 
   9 unsigned long unwind_get_return_address(struct unwind_state *state)
  10 {
  11         unsigned long addr;
  12 
  13         if (unwind_done(state))
  14                 return 0;
  15 
  16         addr = READ_ONCE_NOCHECK(*state->sp);
  17 
  18         return ftrace_graph_ret_addr(state->task, &state->graph_idx,
  19                                      addr, state->sp);
  20 }
  21 EXPORT_SYMBOL_GPL(unwind_get_return_address);
  22 
  23 unsigned long *unwind_get_return_address_ptr(struct unwind_state *state)
  24 {
  25         return NULL;
  26 }
  27 
  28 bool unwind_next_frame(struct unwind_state *state)
  29 {
  30         struct stack_info *info = &state->stack_info;
  31 
  32         if (unwind_done(state))
  33                 return false;
  34 
  35         do {
  36                 for (state->sp++; state->sp < info->end; state->sp++) {
  37                         unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
  38 
  39                         if (__kernel_text_address(addr))
  40                                 return true;
  41                 }
  42 
  43                 state->sp = PTR_ALIGN(info->next_sp, sizeof(long));
  44 
  45         } while (!get_stack_info(state->sp, state->task, info,
  46                                  &state->stack_mask));
  47 
  48         return false;
  49 }
  50 EXPORT_SYMBOL_GPL(unwind_next_frame);
  51 
  52 void __unwind_start(struct unwind_state *state, struct task_struct *task,
  53                     struct pt_regs *regs, unsigned long *first_frame)
  54 {
  55         memset(state, 0, sizeof(*state));
  56 
  57         state->task = task;
  58         state->sp   = PTR_ALIGN(first_frame, sizeof(long));
  59 
  60         get_stack_info(first_frame, state->task, &state->stack_info,
  61                        &state->stack_mask);
  62 
  63         /*
  64          * The caller can provide the address of the first frame directly
  65          * (first_frame) or indirectly (regs->sp) to indicate which stack frame
  66          * to start unwinding at.  Skip ahead until we reach it.
  67          */
  68         if (!unwind_done(state) &&
  69             (!on_stack(&state->stack_info, first_frame, sizeof(long)) ||
  70             !__kernel_text_address(*first_frame)))
  71                 unwind_next_frame(state);
  72 }
  73 EXPORT_SYMBOL_GPL(__unwind_start);

/* [<][>][^][v][top][bottom][index][help] */