aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/livepatch/patch.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/livepatch/patch.c')
-rw-r--r--kernel/livepatch/patch.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/kernel/livepatch/patch.c b/kernel/livepatch/patch.c
index 7702cb4064fc..825022d70912 100644
--- a/kernel/livepatch/patch.c
+++ b/kernel/livepatch/patch.c
@@ -34,7 +34,7 @@
34 34
35static LIST_HEAD(klp_ops); 35static LIST_HEAD(klp_ops);
36 36
37struct klp_ops *klp_find_ops(unsigned long old_addr) 37struct klp_ops *klp_find_ops(void *old_func)
38{ 38{
39 struct klp_ops *ops; 39 struct klp_ops *ops;
40 struct klp_func *func; 40 struct klp_func *func;
@@ -42,7 +42,7 @@ struct klp_ops *klp_find_ops(unsigned long old_addr)
42 list_for_each_entry(ops, &klp_ops, node) { 42 list_for_each_entry(ops, &klp_ops, node) {
43 func = list_first_entry(&ops->func_stack, struct klp_func, 43 func = list_first_entry(&ops->func_stack, struct klp_func,
44 stack_node); 44 stack_node);
45 if (func->old_addr == old_addr) 45 if (func->old_func == old_func)
46 return ops; 46 return ops;
47 } 47 }
48 48
@@ -142,17 +142,18 @@ static void klp_unpatch_func(struct klp_func *func)
142 142
143 if (WARN_ON(!func->patched)) 143 if (WARN_ON(!func->patched))
144 return; 144 return;
145 if (WARN_ON(!func->old_addr)) 145 if (WARN_ON(!func->old_func))
146 return; 146 return;
147 147
148 ops = klp_find_ops(func->old_addr); 148 ops = klp_find_ops(func->old_func);
149 if (WARN_ON(!ops)) 149 if (WARN_ON(!ops))
150 return; 150 return;
151 151
152 if (list_is_singular(&ops->func_stack)) { 152 if (list_is_singular(&ops->func_stack)) {
153 unsigned long ftrace_loc; 153 unsigned long ftrace_loc;
154 154
155 ftrace_loc = klp_get_ftrace_location(func->old_addr); 155 ftrace_loc =
156 klp_get_ftrace_location((unsigned long)func->old_func);
156 if (WARN_ON(!ftrace_loc)) 157 if (WARN_ON(!ftrace_loc))
157 return; 158 return;
158 159
@@ -174,17 +175,18 @@ static int klp_patch_func(struct klp_func *func)
174 struct klp_ops *ops; 175 struct klp_ops *ops;
175 int ret; 176 int ret;
176 177
177 if (WARN_ON(!func->old_addr)) 178 if (WARN_ON(!func->old_func))
178 return -EINVAL; 179 return -EINVAL;
179 180
180 if (WARN_ON(func->patched)) 181 if (WARN_ON(func->patched))
181 return -EINVAL; 182 return -EINVAL;
182 183
183 ops = klp_find_ops(func->old_addr); 184 ops = klp_find_ops(func->old_func);
184 if (!ops) { 185 if (!ops) {
185 unsigned long ftrace_loc; 186 unsigned long ftrace_loc;
186 187
187 ftrace_loc = klp_get_ftrace_location(func->old_addr); 188 ftrace_loc =
189 klp_get_ftrace_location((unsigned long)func->old_func);
188 if (!ftrace_loc) { 190 if (!ftrace_loc) {
189 pr_err("failed to find location for function '%s'\n", 191 pr_err("failed to find location for function '%s'\n",
190 func->old_name); 192 func->old_name);