|
@@ -28,12 +28,6 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr,
|
|
|
{
|
|
|
int err;
|
|
|
|
|
|
- /* Make sure we aren't patching a freed init section */
|
|
|
- if (init_mem_is_free && init_section_contains(exec_addr, 4)) {
|
|
|
- pr_debug("Skipping init section patching addr: 0x%px\n", exec_addr);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
__put_user_size(instr, patch_addr, 4, err);
|
|
|
if (err)
|
|
|
return err;
|
|
@@ -148,7 +142,7 @@ static inline int unmap_patch_area(unsigned long addr)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int patch_instruction(unsigned int *addr, unsigned int instr)
|
|
|
+static int do_patch_instruction(unsigned int *addr, unsigned int instr)
|
|
|
{
|
|
|
int err;
|
|
|
unsigned int *patch_addr = NULL;
|
|
@@ -188,12 +182,22 @@ out:
|
|
|
}
|
|
|
#else /* !CONFIG_STRICT_KERNEL_RWX */
|
|
|
|
|
|
-int patch_instruction(unsigned int *addr, unsigned int instr)
|
|
|
+static int do_patch_instruction(unsigned int *addr, unsigned int instr)
|
|
|
{
|
|
|
return raw_patch_instruction(addr, instr);
|
|
|
}
|
|
|
|
|
|
#endif /* CONFIG_STRICT_KERNEL_RWX */
|
|
|
+
|
|
|
+int patch_instruction(unsigned int *addr, unsigned int instr)
|
|
|
+{
|
|
|
+ /* Make sure we aren't patching a freed init section */
|
|
|
+ if (init_mem_is_free && init_section_contains(addr, 4)) {
|
|
|
+ pr_debug("Skipping init section patching addr: 0x%px\n", addr);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return do_patch_instruction(addr, instr);
|
|
|
+}
|
|
|
NOKPROBE_SYMBOL(patch_instruction);
|
|
|
|
|
|
int patch_branch(unsigned int *addr, unsigned long target, int flags)
|