~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm64/include/asm/stacktrace.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0-only */
  2 /*
  3  * Copyright (C) 2012 ARM Ltd.
  4  */
  5 #ifndef __ASM_STACKTRACE_H
  6 #define __ASM_STACKTRACE_H
  7 
  8 #include <linux/percpu.h>
  9 #include <linux/sched.h>
 10 #include <linux/sched/task_stack.h>
 11 #include <linux/llist.h>
 12 
 13 #include <asm/memory.h>
 14 #include <asm/pointer_auth.h>
 15 #include <asm/ptrace.h>
 16 #include <asm/sdei.h>
 17 
 18 #include <asm/stacktrace/common.h>
 19 
 20 extern void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk,
 21                            const char *loglvl);
 22 
 23 DECLARE_PER_CPU(unsigned long *, irq_stack_ptr);
 24 
 25 static inline struct stack_info stackinfo_get_irq(void)
 26 {
 27         unsigned long low = (unsigned long)raw_cpu_read(irq_stack_ptr);
 28         unsigned long high = low + IRQ_STACK_SIZE;
 29 
 30         return (struct stack_info) {
 31                 .low = low,
 32                 .high = high,
 33         };
 34 }
 35 
 36 static inline bool on_irq_stack(unsigned long sp, unsigned long size)
 37 {
 38         struct stack_info info = stackinfo_get_irq();
 39         return stackinfo_on_stack(&info, sp, size);
 40 }
 41 
 42 static inline struct stack_info stackinfo_get_task(const struct task_struct *tsk)
 43 {
 44         unsigned long low = (unsigned long)task_stack_page(tsk);
 45         unsigned long high = low + THREAD_SIZE;
 46 
 47         return (struct stack_info) {
 48                 .low = low,
 49                 .high = high,
 50         };
 51 }
 52 
 53 static inline bool on_task_stack(const struct task_struct *tsk,
 54                                  unsigned long sp, unsigned long size)
 55 {
 56         struct stack_info info = stackinfo_get_task(tsk);
 57         return stackinfo_on_stack(&info, sp, size);
 58 }
 59 
 60 #define on_thread_stack()       (on_task_stack(current, current_stack_pointer, 1))
 61 
 62 #ifdef CONFIG_VMAP_STACK
 63 DECLARE_PER_CPU(unsigned long [OVERFLOW_STACK_SIZE/sizeof(long)], overflow_stack);
 64 
 65 static inline struct stack_info stackinfo_get_overflow(void)
 66 {
 67         unsigned long low = (unsigned long)raw_cpu_ptr(overflow_stack);
 68         unsigned long high = low + OVERFLOW_STACK_SIZE;
 69 
 70         return (struct stack_info) {
 71                 .low = low,
 72                 .high = high,
 73         };
 74 }
 75 #else
 76 #define stackinfo_get_overflow()        stackinfo_get_unknown()
 77 #endif
 78 
 79 #if defined(CONFIG_ARM_SDE_INTERFACE) && defined(CONFIG_VMAP_STACK)
 80 DECLARE_PER_CPU(unsigned long *, sdei_stack_normal_ptr);
 81 DECLARE_PER_CPU(unsigned long *, sdei_stack_critical_ptr);
 82 
 83 static inline struct stack_info stackinfo_get_sdei_normal(void)
 84 {
 85         unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_normal_ptr);
 86         unsigned long high = low + SDEI_STACK_SIZE;
 87 
 88         return (struct stack_info) {
 89                 .low = low,
 90                 .high = high,
 91         };
 92 }
 93 
 94 static inline struct stack_info stackinfo_get_sdei_critical(void)
 95 {
 96         unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_critical_ptr);
 97         unsigned long high = low + SDEI_STACK_SIZE;
 98 
 99         return (struct stack_info) {
100                 .low = low,
101                 .high = high,
102         };
103 }
104 #else
105 #define stackinfo_get_sdei_normal()     stackinfo_get_unknown()
106 #define stackinfo_get_sdei_critical()   stackinfo_get_unknown()
107 #endif
108 
109 #ifdef CONFIG_EFI
110 extern u64 *efi_rt_stack_top;
111 
112 static inline struct stack_info stackinfo_get_efi(void)
113 {
114         unsigned long high = (u64)efi_rt_stack_top;
115         unsigned long low = high - THREAD_SIZE;
116 
117         return (struct stack_info) {
118                 .low = low,
119                 .high = high,
120         };
121 }
122 #endif
123 
124 #endif  /* __ASM_STACKTRACE_H */
125 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php