LCOV - code coverage report
Current view: top level - arch/x86/include/asm - stacktrace.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 11 12 91.7 %
Date: 2022-03-28 13:20:08 Functions: 0 0 -
Branches: 25 36 69.4 %

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

Generated by: LCOV version 1.14