linux/arch/x86/include/asm/stacktrace.h
<<
>>
Prefs
   1/*
   2 *  Copyright (C) 1991, 1992  Linus Torvalds
   3 *  Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs
   4 */
   5
   6#ifndef _ASM_X86_STACKTRACE_H
   7#define _ASM_X86_STACKTRACE_H
   8
   9#include <linux/uaccess.h>
  10#include <linux/ptrace.h>
  11#include <asm/switch_to.h>
  12
  13enum stack_type {
  14        STACK_TYPE_UNKNOWN,
  15        STACK_TYPE_TASK,
  16        STACK_TYPE_IRQ,
  17        STACK_TYPE_SOFTIRQ,
  18        STACK_TYPE_EXCEPTION,
  19        STACK_TYPE_EXCEPTION_LAST = STACK_TYPE_EXCEPTION + N_EXCEPTION_STACKS-1,
  20};
  21
  22struct stack_info {
  23        enum stack_type type;
  24        unsigned long *begin, *end, *next_sp;
  25};
  26
  27bool in_task_stack(unsigned long *stack, struct task_struct *task,
  28                   struct stack_info *info);
  29
  30int get_stack_info(unsigned long *stack, struct task_struct *task,
  31                   struct stack_info *info, unsigned long *visit_mask);
  32
  33const char *stack_type_name(enum stack_type type);
  34
  35static inline bool on_stack(struct stack_info *info, void *addr, size_t len)
  36{
  37        void *begin = info->begin;
  38        void *end   = info->end;
  39
  40        return (info->type != STACK_TYPE_UNKNOWN &&
  41                addr >= begin && addr < end &&
  42                addr + len > begin && addr + len <= end);
  43}
  44
  45#ifdef CONFIG_X86_32
  46#define STACKSLOTS_PER_LINE 8
  47#else
  48#define STACKSLOTS_PER_LINE 4
  49#endif
  50
  51#ifdef CONFIG_FRAME_POINTER
  52static inline unsigned long *
  53get_frame_pointer(struct task_struct *task, struct pt_regs *regs)
  54{
  55        if (regs)
  56                return (unsigned long *)regs->bp;
  57
  58        if (task == current)
  59                return __builtin_frame_address(0);
  60
  61        return &((struct inactive_task_frame *)task->thread.sp)->bp;
  62}
  63#else
  64static inline unsigned long *
  65get_frame_pointer(struct task_struct *task, struct pt_regs *regs)
  66{
  67        return NULL;
  68}
  69#endif /* CONFIG_FRAME_POINTER */
  70
  71static inline unsigned long *
  72get_stack_pointer(struct task_struct *task, struct pt_regs *regs)
  73{
  74        if (regs)
  75                return (unsigned long *)kernel_stack_pointer(regs);
  76
  77        if (task == current)
  78                return __builtin_frame_address(0);
  79
  80        return (unsigned long *)task->thread.sp;
  81}
  82
  83void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
  84                        unsigned long *stack, char *log_lvl);
  85
  86extern unsigned int code_bytes;
  87
  88/* The form of the top of the frame on the stack */
  89struct stack_frame {
  90        struct stack_frame *next_frame;
  91        unsigned long return_address;
  92};
  93
  94struct stack_frame_ia32 {
  95    u32 next_frame;
  96    u32 return_address;
  97};
  98
  99static inline unsigned long caller_frame_pointer(void)
 100{
 101        struct stack_frame *frame;
 102
 103        frame = __builtin_frame_address(0);
 104
 105#ifdef CONFIG_FRAME_POINTER
 106        frame = frame->next_frame;
 107#endif
 108
 109        return (unsigned long)frame;
 110}
 111
 112#endif /* _ASM_X86_STACKTRACE_H */
 113