diff options
-rw-r--r-- | arch/arm64/Makefile | 2 | ||||
-rw-r--r-- | arch/arm64/kernel/crash_dump.c | 2 | ||||
-rw-r--r-- | arch/arm64/kernel/probes/kprobes.c | 27 |
3 files changed, 23 insertions, 8 deletions
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index b4e994cd3a42..6cb9fc7e9382 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile | |||
@@ -134,6 +134,7 @@ vdso_install: | |||
134 | archclean: | 134 | archclean: |
135 | $(Q)$(MAKE) $(clean)=$(boot) | 135 | $(Q)$(MAKE) $(clean)=$(boot) |
136 | 136 | ||
137 | ifeq ($(KBUILD_EXTMOD),) | ||
137 | # We need to generate vdso-offsets.h before compiling certain files in kernel/. | 138 | # We need to generate vdso-offsets.h before compiling certain files in kernel/. |
138 | # In order to do that, we should use the archprepare target, but we can't since | 139 | # In order to do that, we should use the archprepare target, but we can't since |
139 | # asm-offsets.h is included in some files used to generate vdso-offsets.h, and | 140 | # asm-offsets.h is included in some files used to generate vdso-offsets.h, and |
@@ -143,6 +144,7 @@ archclean: | |||
143 | prepare: vdso_prepare | 144 | prepare: vdso_prepare |
144 | vdso_prepare: prepare0 | 145 | vdso_prepare: prepare0 |
145 | $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso include/generated/vdso-offsets.h | 146 | $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso include/generated/vdso-offsets.h |
147 | endif | ||
146 | 148 | ||
147 | define archhelp | 149 | define archhelp |
148 | echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' | 150 | echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' |
diff --git a/arch/arm64/kernel/crash_dump.c b/arch/arm64/kernel/crash_dump.c index f46d57c31443..6b5037ed15b2 100644 --- a/arch/arm64/kernel/crash_dump.c +++ b/arch/arm64/kernel/crash_dump.c | |||
@@ -58,7 +58,7 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
58 | /** | 58 | /** |
59 | * elfcorehdr_read - read from ELF core header | 59 | * elfcorehdr_read - read from ELF core header |
60 | * @buf: buffer where the data is placed | 60 | * @buf: buffer where the data is placed |
61 | * @csize: number of bytes to read | 61 | * @count: number of bytes to read |
62 | * @ppos: address in the memory | 62 | * @ppos: address in the memory |
63 | * | 63 | * |
64 | * This function reads @count bytes from elf core header which exists | 64 | * This function reads @count bytes from elf core header which exists |
diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c index 9b65132e789a..2a5b338b2542 100644 --- a/arch/arm64/kernel/probes/kprobes.c +++ b/arch/arm64/kernel/probes/kprobes.c | |||
@@ -23,7 +23,9 @@ | |||
23 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
24 | #include <linux/stop_machine.h> | 24 | #include <linux/stop_machine.h> |
25 | #include <linux/sched/debug.h> | 25 | #include <linux/sched/debug.h> |
26 | #include <linux/set_memory.h> | ||
26 | #include <linux/stringify.h> | 27 | #include <linux/stringify.h> |
28 | #include <linux/vmalloc.h> | ||
27 | #include <asm/traps.h> | 29 | #include <asm/traps.h> |
28 | #include <asm/ptrace.h> | 30 | #include <asm/ptrace.h> |
29 | #include <asm/cacheflush.h> | 31 | #include <asm/cacheflush.h> |
@@ -42,10 +44,21 @@ DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); | |||
42 | static void __kprobes | 44 | static void __kprobes |
43 | post_kprobe_handler(struct kprobe_ctlblk *, struct pt_regs *); | 45 | post_kprobe_handler(struct kprobe_ctlblk *, struct pt_regs *); |
44 | 46 | ||
47 | static int __kprobes patch_text(kprobe_opcode_t *addr, u32 opcode) | ||
48 | { | ||
49 | void *addrs[1]; | ||
50 | u32 insns[1]; | ||
51 | |||
52 | addrs[0] = addr; | ||
53 | insns[0] = opcode; | ||
54 | |||
55 | return aarch64_insn_patch_text(addrs, insns, 1); | ||
56 | } | ||
57 | |||
45 | static void __kprobes arch_prepare_ss_slot(struct kprobe *p) | 58 | static void __kprobes arch_prepare_ss_slot(struct kprobe *p) |
46 | { | 59 | { |
47 | /* prepare insn slot */ | 60 | /* prepare insn slot */ |
48 | p->ainsn.api.insn[0] = cpu_to_le32(p->opcode); | 61 | patch_text(p->ainsn.api.insn, p->opcode); |
49 | 62 | ||
50 | flush_icache_range((uintptr_t) (p->ainsn.api.insn), | 63 | flush_icache_range((uintptr_t) (p->ainsn.api.insn), |
51 | (uintptr_t) (p->ainsn.api.insn) + | 64 | (uintptr_t) (p->ainsn.api.insn) + |
@@ -118,15 +131,15 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) | |||
118 | return 0; | 131 | return 0; |
119 | } | 132 | } |
120 | 133 | ||
121 | static int __kprobes patch_text(kprobe_opcode_t *addr, u32 opcode) | 134 | void *alloc_insn_page(void) |
122 | { | 135 | { |
123 | void *addrs[1]; | 136 | void *page; |
124 | u32 insns[1]; | ||
125 | 137 | ||
126 | addrs[0] = (void *)addr; | 138 | page = vmalloc_exec(PAGE_SIZE); |
127 | insns[0] = (u32)opcode; | 139 | if (page) |
140 | set_memory_ro((unsigned long)page, 1); | ||
128 | 141 | ||
129 | return aarch64_insn_patch_text(addrs, insns, 1); | 142 | return page; |
130 | } | 143 | } |
131 | 144 | ||
132 | /* arm kprobe: install breakpoint in text */ | 145 | /* arm kprobe: install breakpoint in text */ |