hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/arm/kernel/ftrace.c
....@@ -22,6 +22,7 @@
2222 #include <asm/ftrace.h>
2323 #include <asm/insn.h>
2424 #include <asm/set_memory.h>
25
+#include <asm/patch.h>
2526
2627 #ifdef CONFIG_THUMB2_KERNEL
2728 #define NOP 0xf85deb04 /* pop.w {lr} */
....@@ -35,9 +36,7 @@
3536 {
3637 int *command = data;
3738
38
- set_kernel_text_rw();
3939 ftrace_modify_all_code(*command);
40
- set_kernel_text_ro();
4140
4241 return 0;
4342 }
....@@ -47,30 +46,6 @@
4746 stop_machine(__ftrace_modify_code, &command, NULL);
4847 }
4948
50
-#ifdef CONFIG_OLD_MCOUNT
51
-#define OLD_MCOUNT_ADDR ((unsigned long) mcount)
52
-#define OLD_FTRACE_ADDR ((unsigned long) ftrace_caller_old)
53
-
54
-#define OLD_NOP 0xe1a00000 /* mov r0, r0 */
55
-
56
-static unsigned long ftrace_nop_replace(struct dyn_ftrace *rec)
57
-{
58
- return rec->arch.old_mcount ? OLD_NOP : NOP;
59
-}
60
-
61
-static unsigned long adjust_address(struct dyn_ftrace *rec, unsigned long addr)
62
-{
63
- if (!rec->arch.old_mcount)
64
- return addr;
65
-
66
- if (addr == MCOUNT_ADDR)
67
- addr = OLD_MCOUNT_ADDR;
68
- else if (addr == FTRACE_ADDR)
69
- addr = OLD_FTRACE_ADDR;
70
-
71
- return addr;
72
-}
73
-#else
7449 static unsigned long ftrace_nop_replace(struct dyn_ftrace *rec)
7550 {
7651 return NOP;
....@@ -80,17 +55,14 @@
8055 {
8156 return addr;
8257 }
83
-#endif
8458
8559 int ftrace_arch_code_modify_prepare(void)
8660 {
87
- set_all_modules_text_rw();
8861 return 0;
8962 }
9063
9164 int ftrace_arch_code_modify_post_process(void)
9265 {
93
- set_all_modules_text_ro();
9466 /* Make sure any TLB misses during machine stop are cleared. */
9567 flush_tlb_all();
9668 return 0;
....@@ -107,26 +79,21 @@
10779 {
10880 unsigned long replaced;
10981
110
- if (IS_ENABLED(CONFIG_THUMB2_KERNEL)) {
82
+ if (IS_ENABLED(CONFIG_THUMB2_KERNEL))
11183 old = __opcode_to_mem_thumb32(old);
112
- new = __opcode_to_mem_thumb32(new);
113
- } else {
84
+ else
11485 old = __opcode_to_mem_arm(old);
115
- new = __opcode_to_mem_arm(new);
116
- }
11786
11887 if (validate) {
119
- if (probe_kernel_read(&replaced, (void *)pc, MCOUNT_INSN_SIZE))
88
+ if (copy_from_kernel_nofault(&replaced, (void *)pc,
89
+ MCOUNT_INSN_SIZE))
12090 return -EFAULT;
12191
12292 if (replaced != old)
12393 return -EINVAL;
12494 }
12595
126
- if (probe_kernel_write((void *)pc, &new, MCOUNT_INSN_SIZE))
127
- return -EPERM;
128
-
129
- flush_icache_range(pc, pc + MCOUNT_INSN_SIZE);
96
+ __patch_text((void *)pc, new);
13097
13198 return 0;
13299 }
....@@ -145,15 +112,6 @@
145112 #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
146113 if (!ret) {
147114 pc = (unsigned long)&ftrace_regs_call;
148
- new = ftrace_call_replace(pc, (unsigned long)func, true);
149
-
150
- ret = ftrace_modify_code(pc, 0, new, false);
151
- }
152
-#endif
153
-
154
-#ifdef CONFIG_OLD_MCOUNT
155
- if (!ret) {
156
- pc = (unsigned long)&ftrace_call_old;
157115 new = ftrace_call_replace(pc, (unsigned long)func, true);
158116
159117 ret = ftrace_modify_code(pc, 0, new, false);
....@@ -233,16 +191,6 @@
233191 new = ftrace_nop_replace(rec);
234192 ret = ftrace_modify_code(ip, old, new, true);
235193
236
-#ifdef CONFIG_OLD_MCOUNT
237
- if (ret == -EINVAL && addr == MCOUNT_ADDR) {
238
- rec->arch.old_mcount = true;
239
-
240
- old = ftrace_call_replace(ip, adjust_address(rec, addr), true);
241
- new = ftrace_nop_replace(rec);
242
- ret = ftrace_modify_code(ip, old, new, true);
243
- }
244
-#endif
245
-
246194 return ret;
247195 }
248196
....@@ -304,13 +252,6 @@
304252 enable);
305253 #endif
306254
307
-
308
-#ifdef CONFIG_OLD_MCOUNT
309
- if (!ret)
310
- ret = __ftrace_modify_caller(&ftrace_graph_call_old,
311
- ftrace_graph_caller_old,
312
- enable);
313
-#endif
314255
315256 return ret;
316257 }