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

TOMOYO Linux Cross Reference
Linux/arch/sparc/kernel/ftrace.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ 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 ] ~

Diff markup

Differences between /arch/sparc/kernel/ftrace.c (Version linux-6.11-rc3) and /arch/sparc64/kernel/ftrace.c (Version linux-5.9.16)


  1 // SPDX-License-Identifier: GPL-2.0                 1 
  2 #include <linux/spinlock.h>                       
  3 #include <linux/hardirq.h>                        
  4 #include <linux/ftrace.h>                         
  5 #include <linux/percpu.h>                         
  6 #include <linux/init.h>                           
  7 #include <linux/list.h>                           
  8 #include <trace/syscall.h>                        
  9                                                   
 10 #include <asm/ftrace.h>                           
 11                                                   
 12 #ifdef CONFIG_DYNAMIC_FTRACE                      
 13 static const u32 ftrace_nop = 0x01000000;         
 14                                                   
 15 static u32 ftrace_call_replace(unsigned long i    
 16 {                                                 
 17         u32 call;                                 
 18         s32 off;                                  
 19                                                   
 20         off = ((s32)addr - (s32)ip);              
 21         call = 0x40000000 | ((u32)off >> 2);      
 22                                                   
 23         return call;                              
 24 }                                                 
 25                                                   
 26 static int ftrace_modify_code(unsigned long ip    
 27 {                                                 
 28         u32 replaced;                             
 29         int faulted;                              
 30                                                   
 31         __asm__ __volatile__(                     
 32         "1:     cas     [%[ip]], %[old], %[new    
 33         "       flush   %[ip]\n"                  
 34         "       mov     0, %[faulted]\n"          
 35         "2:\n"                                    
 36         "       .section .fixup,#alloc,#execin    
 37         "       .align  4\n"                      
 38         "3:     sethi   %%hi(2b), %[faulted]\n    
 39         "       jmpl    %[faulted] + %%lo(2b),    
 40         "        mov    1, %[faulted]\n"          
 41         "       .previous\n"                      
 42         "       .section __ex_table,\"a\"\n"      
 43         "       .align  4\n"                      
 44         "       .word   1b, 3b\n"                 
 45         "       .previous\n"                      
 46         : "=r" (replaced), [faulted] "=r" (fau    
 47         : [new] "" (new), [old] "r" (old), [ip    
 48         : "memory");                              
 49                                                   
 50         if (replaced != old && replaced != new    
 51                 faulted = 2;                      
 52                                                   
 53         return faulted;                           
 54 }                                                 
 55                                                   
 56 int ftrace_make_nop(struct module *mod, struct    
 57 {                                                 
 58         unsigned long ip = rec->ip;               
 59         u32 old, new;                             
 60                                                   
 61         old = ftrace_call_replace(ip, addr);      
 62         new = ftrace_nop;                         
 63         return ftrace_modify_code(ip, old, new    
 64 }                                                 
 65                                                   
 66 int ftrace_make_call(struct dyn_ftrace *rec, u    
 67 {                                                 
 68         unsigned long ip = rec->ip;               
 69         u32 old, new;                             
 70                                                   
 71         old = ftrace_nop;                         
 72         new = ftrace_call_replace(ip, addr);      
 73         return ftrace_modify_code(ip, old, new    
 74 }                                                 
 75                                                   
 76 int ftrace_update_ftrace_func(ftrace_func_t fu    
 77 {                                                 
 78         unsigned long ip = (unsigned long)(&ft    
 79         u32 old, new;                             
 80                                                   
 81         old = *(u32 *) &ftrace_call;              
 82         new = ftrace_call_replace(ip, (unsigne    
 83         return ftrace_modify_code(ip, old, new    
 84 }                                                 
 85 #endif                                            
 86                                                   
 87 #ifdef CONFIG_FUNCTION_GRAPH_TRACER               
 88                                                   
 89 #ifdef CONFIG_DYNAMIC_FTRACE                      
 90 extern void ftrace_graph_call(void);              
 91                                                   
 92 int ftrace_enable_ftrace_graph_caller(void)       
 93 {                                                 
 94         unsigned long ip = (unsigned long)(&ft    
 95         u32 old, new;                             
 96                                                   
 97         old = *(u32 *) &ftrace_graph_call;        
 98         new = ftrace_call_replace(ip, (unsigne    
 99         return ftrace_modify_code(ip, old, new    
100 }                                                 
101                                                   
102 int ftrace_disable_ftrace_graph_caller(void)      
103 {                                                 
104         unsigned long ip = (unsigned long)(&ft    
105         u32 old, new;                             
106                                                   
107         old = *(u32 *) &ftrace_graph_call;        
108         new = ftrace_call_replace(ip, (unsigne    
109                                                   
110         return ftrace_modify_code(ip, old, new    
111 }                                                 
112                                                   
113 #endif /* !CONFIG_DYNAMIC_FTRACE */               
114                                                   
115 /*                                                
116  * Hook the return address and push it in the     
117  * in current thread info.                        
118  */                                               
119 unsigned long prepare_ftrace_return(unsigned l    
120                                     unsigned l    
121                                     unsigned l    
122 {                                                 
123         unsigned long return_hooker = (unsigne    
124                                                   
125         if (unlikely(atomic_read(&current->tra    
126                 return parent + 8UL;              
127                                                   
128         if (function_graph_enter(parent, self_    
129                 return parent + 8UL;              
130                                                   
131         return return_hooker;                     
132 }                                                 
133 #endif /* CONFIG_FUNCTION_GRAPH_TRACER */         
134                                                   

~ [ 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