27 Oct, 2020

1 commit

  • Setting both CONFIG_KPROBES=y and CONFIG_FORTIFY_SOURCE=y on ARM leads
    to a panic in memcpy() when injecting a kprobe despite the fixes found
    in commit e46daee53bb5 ("ARM: 8806/1: kprobes: Fix false positive with
    FORTIFY_SOURCE") and commit 0ac569bf6a79 ("ARM: 8834/1: Fix: kprobes:
    optimized kprobes illegal instruction").

    arch/arm/include/asm/kprobes.h effectively declares
    the target type of the optprobe_template_entry assembly label as a u32
    which leads memcpy()'s __builtin_object_size() call to determine that
    the pointed-to object is of size four. However, the symbol is used as a handle
    for the optimised probe assembly template that is at least 96 bytes in size.
    The symbol's use despite its type blows up the memcpy() in ARM's
    arch_prepare_optimized_kprobe() with a false-positive fortify_panic() when it
    should instead copy the optimised probe template into place:

    ```
    $ sudo perf probe -a aspeed_g6_pinctrl_probe
    [ 158.457252] detected buffer overflow in memcpy
    [ 158.458069] ------------[ cut here ]------------
    [ 158.458283] kernel BUG at lib/string.c:1153!
    [ 158.458436] Internal error: Oops - BUG: 0 [#1] SMP ARM
    [ 158.458768] Modules linked in:
    [ 158.459043] CPU: 1 PID: 99 Comm: perf Not tainted 5.9.0-rc7-00038-gc53ebf8167e9 #158
    [ 158.459296] Hardware name: Generic DT based system
    [ 158.459529] PC is at fortify_panic+0x18/0x20
    [ 158.459658] LR is at __irq_work_queue_local+0x3c/0x74
    [ 158.459831] pc : [] lr : [] psr: 60000013
    [ 158.460032] sp : be2d1d50 ip : be2d1c58 fp : be2d1d5c
    [ 158.460174] r10: 00000006 r9 : 00000000 r8 : 00000060
    [ 158.460348] r7 : 8011e434 r6 : b9e0b800 r5 : 7f000000 r4 : b9fe4f0c
    [ 158.460557] r3 : 80c04cc8 r2 : 00000000 r1 : be7c03cc r0 : 00000022
    [ 158.460801] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
    [ 158.461037] Control: 10c5387d Table: b9cd806a DAC: 00000051
    [ 158.461251] Process perf (pid: 99, stack limit = 0x81c71a69)
    [ 158.461472] Stack: (0xbe2d1d50 to 0xbe2d2000)
    [ 158.461757] 1d40: be2d1d84 be2d1d60 8011e724 80474510
    [ 158.462104] 1d60: b9e0b800 b9fe4f0c 00000000 b9fe4f14 80c8ec80 be235000 be2d1d9c be2d1d88
    [ 158.462436] 1d80: 801cee44 8011e57c b9fe4f0c 00000000 be2d1dc4 be2d1da0 801d0ad0 801cedec
    [ 158.462742] 1da0: 00000000 00000000 b9fe4f00 ffffffea 00000000 be235000 be2d1de4 be2d1dc8
    [ 158.463087] 1dc0: 80204604 801d0738 00000000 00000000 b9fe4004 ffffffea be2d1e94 be2d1de8
    [ 158.463428] 1de0: 80205434 80204570 00385c00 00000000 00000000 00000000 be2d1e14 be2d1e08
    [ 158.463880] 1e00: 802ba014 b9fe4f00 b9e718c0 b9fe4f84 b9e71ec8 be2d1e24 00000000 00385c00
    [ 158.464365] 1e20: 00000000 626f7270 00000065 802b905c be2d1e94 0000002e 00000000 802b9914
    [ 158.464829] 1e40: be2d1e84 be2d1e50 802b9914 8028ff78 804629d0 b9e71ec0 0000002e b9e71ec0
    [ 158.465141] 1e60: be2d1ea8 80c04cc8 00000cc0 b9e713c4 00000002 80205834 80205834 0000002e
    [ 158.465488] 1e80: be235000 be235000 be2d1ea4 be2d1e98 80205854 80204e94 be2d1ecc be2d1ea8
    [ 158.465806] 1ea0: 801ee4a0 80205840 00000002 80c04cc8 00000000 0000002e 0000002e 00000000
    [ 158.466110] 1ec0: be2d1f0c be2d1ed0 801ee5c8 801ee428 00000000 be2d0000 006b1fd0 00000051
    [ 158.466398] 1ee0: 00000000 b9eedf00 0000002e 80204410 006b1fd0 be2d1f60 00000000 00000004
    [ 158.466763] 1f00: be2d1f24 be2d1f10 8020442c 801ee4c4 80205834 802c613c be2d1f5c be2d1f28
    [ 158.467102] 1f20: 802c60ac 8020441c be2d1fac be2d1f38 8010c764 802e9888 be2d1f5c b9eedf00
    [ 158.467447] 1f40: b9eedf00 006b1fd0 0000002e 00000000 be2d1f94 be2d1f60 802c634c 802c5fec
    [ 158.467812] 1f60: 00000000 00000000 00000000 80c04cc8 006b1fd0 00000003 76f7a610 00000004
    [ 158.468155] 1f80: 80100284 be2d0000 be2d1fa4 be2d1f98 802c63ec 802c62e8 00000000 be2d1fa8
    [ 158.468508] 1fa0: 80100080 802c63e0 006b1fd0 00000003 00000003 006b1fd0 0000002e 00000000
    [ 158.468858] 1fc0: 006b1fd0 00000003 76f7a610 00000004 006b1fb0 0026d348 00000017 7ef2738c
    [ 158.469202] 1fe0: 76f3431c 7ef272d8 0014ec50 76f34338 60000010 00000003 00000000 00000000
    [ 158.469461] Backtrace:
    [ 158.469683] [] (fortify_panic) from [] (arch_prepare_optimized_kprobe+0x1b4/0x1f8)
    [ 158.470021] [] (arch_prepare_optimized_kprobe) from [] (alloc_aggr_kprobe+0x64/0x70)
    [ 158.470287] r9:be235000 r8:80c8ec80 r7:b9fe4f14 r6:00000000 r5:b9fe4f0c r4:b9e0b800
    [ 158.470478] [] (alloc_aggr_kprobe) from [] (register_kprobe+0x3a4/0x5a0)
    [ 158.470685] r5:00000000 r4:b9fe4f0c
    [ 158.470790] [] (register_kprobe) from [] (__register_trace_kprobe+0xa0/0xa4)
    [ 158.471001] r9:be235000 r8:00000000 r7:ffffffea r6:b9fe4f00 r5:00000000 r4:00000000
    [ 158.471188] [] (__register_trace_kprobe) from [] (trace_kprobe_create+0x5ac/0x9ac)
    [ 158.471408] r7:ffffffea r6:b9fe4004 r5:00000000 r4:00000000
    [ 158.471553] [] (trace_kprobe_create) from [] (create_or_delete_trace_kprobe+0x20/0x3c)
    [ 158.471766] r10:be235000 r9:be235000 r8:0000002e r7:80205834 r6:80205834 r5:00000002
    [ 158.471949] r4:b9e713c4
    [ 158.472027] [] (create_or_delete_trace_kprobe) from [] (trace_run_command+0x84/0x9c)
    [ 158.472255] [] (trace_run_command) from [] (trace_parse_run_command+0x110/0x1f8)
    [ 158.472471] r6:00000000 r5:0000002e r4:0000002e
    [ 158.472594] [] (trace_parse_run_command) from [] (probes_write+0x1c/0x28)
    [ 158.472800] r10:00000004 r9:00000000 r8:be2d1f60 r7:006b1fd0 r6:80204410 r5:0000002e
    [ 158.472968] r4:b9eedf00
    [ 158.473046] [] (probes_write) from [] (vfs_write+0xcc/0x1e8)
    [ 158.473226] [] (vfs_write) from [] (ksys_write+0x70/0xf8)
    [ 158.473400] r8:00000000 r7:0000002e r6:006b1fd0 r5:b9eedf00 r4:b9eedf00
    [ 158.473567] [] (ksys_write) from [] (sys_write+0x18/0x1c)
    [ 158.473745] r9:be2d0000 r8:80100284 r7:00000004 r6:76f7a610 r5:00000003 r4:006b1fd0
    [ 158.473932] [] (sys_write) from [] (ret_fast_syscall+0x0/0x54)
    [ 158.474126] Exception stack(0xbe2d1fa8 to 0xbe2d1ff0)
    [ 158.474305] 1fa0: 006b1fd0 00000003 00000003 006b1fd0 0000002e 00000000
    [ 158.474573] 1fc0: 006b1fd0 00000003 76f7a610 00000004 006b1fb0 0026d348 00000017 7ef2738c
    [ 158.474811] 1fe0: 76f3431c 7ef272d8 0014ec50 76f34338
    [ 158.475171] Code: e24cb004 e1a01000 e59f0004 ebf40dd3 (e7f001f2)
    [ 158.475847] ---[ end trace 55a5b31c08a29f00 ]---
    [ 158.476088] Kernel panic - not syncing: Fatal exception
    [ 158.476375] CPU0: stopping
    [ 158.476709] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G D 5.9.0-rc7-00038-gc53ebf8167e9 #158
    [ 158.477176] Hardware name: Generic DT based system
    [ 158.477411] Backtrace:
    [ 158.477604] [] (dump_backtrace) from [] (show_stack+0x20/0x24)
    [ 158.477990] r7:00000000 r6:60000193 r5:00000000 r4:80c2f634
    [ 158.478323] [] (show_stack) from [] (dump_stack+0xcc/0xe8)
    [ 158.478686] [] (dump_stack) from [] (handle_IPI+0x334/0x3a0)
    [ 158.479063] r7:00000000 r6:00000004 r5:80b65cc8 r4:80c78278
    [ 158.479352] [] (handle_IPI) from [] (gic_handle_irq+0x88/0x94)
    [ 158.479757] r10:10c5387d r9:80c01ed8 r8:00000000 r7:c0802000 r6:80c0537c r5:000003ff
    [ 158.480146] r4:c080200c r3:fffffff4
    [ 158.480364] [] (gic_handle_irq) from [] (__irq_svc+0x6c/0x90)
    [ 158.480748] Exception stack(0x80c01ed8 to 0x80c01f20)
    [ 158.481031] 1ec0: 000128bc 00000000
    [ 158.481499] 1ee0: be7b8174 8011d3a0 80c00000 00000000 80c04cec 80c04d28 80c5d7c2 80a026d4
    [ 158.482091] 1f00: 10c5387d 80c01f34 80c01f38 80c01f28 80109554 80109558 60000013 ffffffff
    [ 158.482621] r9:80c00000 r8:80c5d7c2 r7:80c01f0c r6:ffffffff r5:60000013 r4:80109558
    [ 158.482983] [] (arch_cpu_idle) from [] (default_idle_call+0x38/0x120)
    [ 158.483360] [] (default_idle_call) from [] (do_idle+0xd4/0x158)
    [ 158.483945] r5:00000000 r4:80c00000
    [ 158.484237] [] (do_idle) from [] (cpu_startup_entry+0x28/0x2c)
    [ 158.484784] r9:80c78000 r8:00000000 r7:80c78000 r6:80c78040 r5:80c04cc0 r4:000000d6
    [ 158.485328] [] (cpu_startup_entry) from [] (rest_init+0x9c/0xbc)
    [ 158.485930] [] (rest_init) from [] (arch_call_rest_init+0x18/0x1c)
    [ 158.486503] r5:80c04cc0 r4:00000001
    [ 158.486857] [] (arch_call_rest_init) from [] (start_kernel+0x46c/0x548)
    [ 158.487589] [] (start_kernel) from [] (0x0)
    ```

    Fixes: e46daee53bb5 ("ARM: 8806/1: kprobes: Fix false positive with FORTIFY_SOURCE")
    Fixes: 0ac569bf6a79 ("ARM: 8834/1: Fix: kprobes: optimized kprobes illegal instruction")
    Suggested-by: Kees Cook
    Signed-off-by: Andrew Jeffery
    Tested-by: Luka Oreskovic
    Tested-by: Joel Stanley
    Reviewed-by: Joel Stanley
    Acked-by: Masami Hiramatsu
    Cc: Luka Oreskovic
    Cc: Juraj Vijtiuk
    Signed-off-by: Russell King

    Andrew Jeffery
     

08 Sep, 2020

1 commit


24 Aug, 2020

1 commit

  • Replace the existing /* fall through */ comments and its variants with
    the new pseudo-keyword macro fallthrough[1]. Also, remove unnecessary
    fall-through markings when it is the case.

    [1] https://www.kernel.org/doc/html/v5.7/process/deprecated.html?highlight=fallthrough#implicit-switch-case-fall-through

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     

19 Jun, 2019

1 commit

  • Based on 2 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 as
    published by the free software foundation

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 as
    published by the free software foundation #

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 4122 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Enrico Weigelt
    Reviewed-by: Kate Stewart
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190604081206.933168790@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

31 May, 2019

3 commits

  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 as
    published by the free software foundation this program is
    distributed in the hope that it will be useful but without any
    warranty without even the implied warranty of merchantability or
    fitness for a particular purpose see the gnu general public license
    for more details

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 655 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Kate Stewart
    Reviewed-by: Richard Fontana
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190527070034.575739538@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • Based on 1 normalized pattern(s):

    the code contained herein is licensed under the gnu general public
    license you may obtain a copy of the gnu general public license
    version 2 or later at the following locations http www opensource
    org licenses gpl license html http www gnu org copyleft gpl html

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-or-later

    has been chosen to replace the boilerplate/reference in 161 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Richard Fontana
    Reviewed-by: Allison Randal
    Reviewed-by: Kate Stewart
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190527070033.383790741@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license as published by
    the free software foundation either version 2 of the license or at
    your option any later version this program is distributed in the
    hope that it will be useful but without any warranty without even
    the implied warranty of merchantability or fitness for a particular
    purpose see the gnu general public license for more details you
    should have received a copy of the gnu general public license along
    with this program if not write to the free software foundation inc
    59 temple place suite 330 boston ma 02111 1307 usa

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-or-later

    has been chosen to replace the boilerplate/reference in 1334 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Richard Fontana
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190527070033.113240726@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

21 May, 2019

1 commit


12 Feb, 2019

1 commit

  • commit e46daee53bb5 ("ARM: 8806/1: kprobes: Fix false positive with
    FORTIFY_SOURCE") introduced a regression in optimized kprobes. It
    triggers "invalid instruction" oopses when using kprobes instrumentation
    through lttng and perf. This commit was introduced in kernel v4.20, and
    has been backported to stable kernels 4.19 and 4.14.

    This crash was also reported by Hongzhi Song on the redhat bugzilla
    where the patch was originally introduced.

    Link: https://bugzilla.redhat.com/show_bug.cgi?id=1639397
    Link: https://bugs.lttng.org/issues/1174
    Link: https://lore.kernel.org/lkml/342740659.2887.1549307721609.JavaMail.zimbra@efficios.com

    Fixes: e46daee53bb5 ("ARM: 8806/1: kprobes: Fix false positive with FORTIFY_SOURCE")
    Signed-off-by: Mathieu Desnoyers
    Reported-by: Robert Berger
    Tested-by: Robert Berger
    Acked-by: Kees Cook
    Cc: Robert Berger
    Cc: Masami Hiramatsu
    Cc: William Cohen
    Cc: Laura Abbott
    Cc: Kees Cook
    Cc: # v4.14+
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: patches@armlinux.org.uk
    Signed-off-by: Russell King

    Mathieu Desnoyers
     

08 Nov, 2018

1 commit

  • The arm compiler internally interprets an inline assembly label
    as an unsigned long value, not a pointer. As a result, under
    CONFIG_FORTIFY_SOURCE, the address of a label has a size of 4 bytes,
    which was tripping the runtime checks. Instead, we can just cast the label
    (as done with the size calculations earlier).

    Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1639397

    Reported-by: William Cohen
    Fixes: 6974f0c4555e ("include/linux/string.h: add the option of fortified string.h functions")
    Cc: stable@vger.kernel.org
    Acked-by: Laura Abbott
    Acked-by: Masami Hiramatsu
    Tested-by: William Cohen
    Signed-off-by: Kees Cook
    Signed-off-by: Russell King

    Kees Cook
     

21 Aug, 2018

1 commit

  • Pull tracing updates from Steven Rostedt:

    - Restructure of lockdep and latency tracers

    This is the biggest change. Joel Fernandes restructured the hooks
    from irqs and preemption disabling and enabling. He got rid of a lot
    of the preprocessor #ifdef mess that they caused.

    He turned both lockdep and the latency tracers to use trace events
    inserted in the preempt/irqs disabling paths. But unfortunately,
    these started to cause issues in corner cases. Thus, parts of the
    code was reverted back to where lockdep and the latency tracers just
    get called directly (without using the trace events). But because the
    original change cleaned up the code very nicely we kept that, as well
    as the trace events for preempt and irqs disabling, but they are
    limited to not being called in NMIs.

    - Have trace events use SRCU for "rcu idle" calls. This was required
    for the preempt/irqs off trace events. But it also had to not allow
    them to be called in NMI context. Waiting till Paul makes an NMI safe
    SRCU API.

    - New notrace SRCU API to allow trace events to use SRCU.

    - Addition of mcount-nop option support

    - SPDX headers replacing GPL templates.

    - Various other fixes and clean ups.

    - Some fixes are marked for stable, but were not fully tested before
    the merge window opened.

    * tag 'trace-v4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (44 commits)
    tracing: Fix SPDX format headers to use C++ style comments
    tracing: Add SPDX License format tags to tracing files
    tracing: Add SPDX License format to bpf_trace.c
    blktrace: Add SPDX License format header
    s390/ftrace: Add -mfentry and -mnop-mcount support
    tracing: Add -mcount-nop option support
    tracing: Avoid calling cc-option -mrecord-mcount for every Makefile
    tracing: Handle CC_FLAGS_FTRACE more accurately
    Uprobe: Additional argument arch_uprobe to uprobe_write_opcode()
    Uprobes: Simplify uprobe_register() body
    tracepoints: Free early tracepoints after RCU is initialized
    uprobes: Use synchronize_rcu() not synchronize_sched()
    tracing: Fix synchronizing to event changes with tracepoint_synchronize_unregister()
    ftrace: Remove unused pointer ftrace_swapper_pid
    tracing: More reverting of "tracing: Centralize preemptirq tracepoints and unify their usage"
    tracing/irqsoff: Handle preempt_count for different configs
    tracing: Partial revert of "tracing: Centralize preemptirq tracepoints and unify their usage"
    tracing: irqsoff: Account for additional preempt_disable
    trace: Use rcu_dereference_raw for hooks from trace-event subsystem
    tracing/kprobes: Fix within_notrace_func() to check only notrace functions
    ...

    Linus Torvalds
     

14 Aug, 2018

1 commit


21 Jun, 2018

4 commits

  • Fix %p uses in error messages by removing it and
    using general dumper.

    Signed-off-by: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: Arnd Bergmann
    Cc: David Howells
    Cc: David S . Miller
    Cc: Heiko Carstens
    Cc: Jon Medhurst
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: Thomas Richter
    Cc: Tobin C . Harding
    Cc: Will Deacon
    Cc: acme@kernel.org
    Cc: akpm@linux-foundation.org
    Cc: brueckner@linux.vnet.ibm.com
    Cc: linux-arch@vger.kernel.org
    Cc: rostedt@goodmis.org
    Cc: schwidefsky@de.ibm.com
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/lkml/152491905361.9916.15300852365956231645.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Clear current_kprobe and enable preemption in kprobe
    even if pre_handler returns !0.

    This simplifies function override using kprobes.

    Jprobe used to require to keep the preemption disabled and
    keep current_kprobe until it returned to original function
    entry. For this reason kprobe_int3_handler() and similar
    arch dependent kprobe handers checks pre_handler result
    and exit without enabling preemption if the result is !0.

    After removing the jprobe, Kprobes does not need to
    keep preempt disabled even if user handler returns !0
    anymore.

    But since the function override handler in error-inject
    and bpf is also returns !0 if it overrides a function,
    to balancing the preempt count, it enables preemption
    and reset current kprobe by itself.

    That is a bad design that is very buggy. This fixes
    such unbalanced preempt-count and current_kprobes setting
    in kprobes, bpf and error-inject.

    Note: for powerpc and x86, this removes all preempt_disable
    from kprobe_ftrace_handler because ftrace callbacks are
    called under preempt disabled.

    Signed-off-by: Masami Hiramatsu
    Acked-by: Thomas Gleixner
    Acked-by: Naveen N. Rao
    Cc: Alexei Starovoitov
    Cc: Ananth N Mavinakayanahalli
    Cc: Andrew Morton
    Cc: Benjamin Herrenschmidt
    Cc: Catalin Marinas
    Cc: David S. Miller
    Cc: Fenghua Yu
    Cc: Heiko Carstens
    Cc: James Hogan
    Cc: Josef Bacik
    Cc: Linus Torvalds
    Cc: Martin Schwidefsky
    Cc: Michael Ellerman
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Ralf Baechle
    Cc: Rich Felker
    Cc: Russell King
    Cc: Steven Rostedt
    Cc: Tony Luck
    Cc: Vineet Gupta
    Cc: Will Deacon
    Cc: Yoshinori Sato
    Cc: linux-arch@vger.kernel.org
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: linux-ia64@vger.kernel.org
    Cc: linux-mips@linux-mips.org
    Cc: linux-s390@vger.kernel.org
    Cc: linux-sh@vger.kernel.org
    Cc: linux-snps-arc@lists.infradead.org
    Cc: linuxppc-dev@lists.ozlabs.org
    Cc: sparclinux@vger.kernel.org
    Link: https://lore.kernel.org/lkml/152942494574.15209.12323837825873032258.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Don't call the ->break_handler() from the arm kprobes code,
    because it was only used by jprobes which got removed.

    Signed-off-by: Masami Hiramatsu
    Acked-by: Thomas Gleixner
    Cc: Ananth N Mavinakayanahalli
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Russell King
    Cc: Steven Rostedt
    Cc: linux-arch@vger.kernel.org
    Cc: linux-arm-kernel@lists.infradead.org
    Link: https://lore.kernel.org/lkml/152942471328.15209.10625693210204476080.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Remove arch dependent setjump/longjump functions
    and unused fields in kprobe_ctlblk for jprobes
    from arch/arm.

    Signed-off-by: Masami Hiramatsu
    Acked-by: Thomas Gleixner
    Cc: Ananth N Mavinakayanahalli
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Russell King
    Cc: Steven Rostedt
    Cc: linux-arch@vger.kernel.org
    Cc: linux-arm-kernel@lists.infradead.org
    Link: https://lore.kernel.org/lkml/152942439350.15209.11127640848082283736.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     

13 Jun, 2018

1 commit

  • The kmalloc() function has a 2-factor argument form, kmalloc_array(). This
    patch replaces cases of:

    kmalloc(a * b, gfp)

    with:
    kmalloc_array(a * b, gfp)

    as well as handling cases of:

    kmalloc(a * b * c, gfp)

    with:

    kmalloc(array3_size(a, b, c), gfp)

    as it's slightly less ugly than:

    kmalloc_array(array_size(a, b), c, gfp)

    This does, however, attempt to ignore constant size factors like:

    kmalloc(4 * 1024, gfp)

    though any constants defined via macros get caught up in the conversion.

    Any factors with a sizeof() of "unsigned char", "char", and "u8" were
    dropped, since they're redundant.

    The tools/ directory was manually excluded, since it has its own
    implementation of kmalloc().

    The Coccinelle script used for this was:

    // Fix redundant parens around sizeof().
    @@
    type TYPE;
    expression THING, E;
    @@

    (
    kmalloc(
    - (sizeof(TYPE)) * E
    + sizeof(TYPE) * E
    , ...)
    |
    kmalloc(
    - (sizeof(THING)) * E
    + sizeof(THING) * E
    , ...)
    )

    // Drop single-byte sizes and redundant parens.
    @@
    expression COUNT;
    typedef u8;
    typedef __u8;
    @@

    (
    kmalloc(
    - sizeof(u8) * (COUNT)
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(__u8) * (COUNT)
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(char) * (COUNT)
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(unsigned char) * (COUNT)
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(u8) * COUNT
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(__u8) * COUNT
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(char) * COUNT
    + COUNT
    , ...)
    |
    kmalloc(
    - sizeof(unsigned char) * COUNT
    + COUNT
    , ...)
    )

    // 2-factor product with sizeof(type/expression) and identifier or constant.
    @@
    type TYPE;
    expression THING;
    identifier COUNT_ID;
    constant COUNT_CONST;
    @@

    (
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * (COUNT_ID)
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * COUNT_ID
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * (COUNT_CONST)
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * COUNT_CONST
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * (COUNT_ID)
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * COUNT_ID
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * (COUNT_CONST)
    + COUNT_CONST, sizeof(THING)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * COUNT_CONST
    + COUNT_CONST, sizeof(THING)
    , ...)
    )

    // 2-factor product, only identifiers.
    @@
    identifier SIZE, COUNT;
    @@

    - kmalloc
    + kmalloc_array
    (
    - SIZE * COUNT
    + COUNT, SIZE
    , ...)

    // 3-factor product with 1 sizeof(type) or sizeof(expression), with
    // redundant parens removed.
    @@
    expression THING;
    identifier STRIDE, COUNT;
    type TYPE;
    @@

    (
    kmalloc(
    - sizeof(TYPE) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kmalloc(
    - sizeof(THING) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kmalloc(
    - sizeof(THING) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kmalloc(
    - sizeof(THING) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kmalloc(
    - sizeof(THING) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    )

    // 3-factor product with 2 sizeof(variable), with redundant parens removed.
    @@
    expression THING1, THING2;
    identifier COUNT;
    type TYPE1, TYPE2;
    @@

    (
    kmalloc(
    - sizeof(TYPE1) * sizeof(TYPE2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    kmalloc(
    - sizeof(THING1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    kmalloc(
    - sizeof(THING1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    |
    kmalloc(
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    )

    // 3-factor product, only identifiers, with redundant parens removed.
    @@
    identifier STRIDE, SIZE, COUNT;
    @@

    (
    kmalloc(
    - (COUNT) * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - COUNT * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - COUNT * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - (COUNT) * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - COUNT * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - (COUNT) * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - (COUNT) * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kmalloc(
    - COUNT * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    )

    // Any remaining multi-factor products, first at least 3-factor products,
    // when they're not all constants...
    @@
    expression E1, E2, E3;
    constant C1, C2, C3;
    @@

    (
    kmalloc(C1 * C2 * C3, ...)
    |
    kmalloc(
    - (E1) * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    kmalloc(
    - (E1) * (E2) * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    kmalloc(
    - (E1) * (E2) * (E3)
    + array3_size(E1, E2, E3)
    , ...)
    |
    kmalloc(
    - E1 * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    )

    // And then all remaining 2 factors products when they're not all constants,
    // keeping sizeof() as the second factor argument.
    @@
    expression THING, E1, E2;
    type TYPE;
    constant C1, C2, C3;
    @@

    (
    kmalloc(sizeof(THING) * C2, ...)
    |
    kmalloc(sizeof(TYPE) * C2, ...)
    |
    kmalloc(C1 * C2 * C3, ...)
    |
    kmalloc(C1 * C2, ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * (E2)
    + E2, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(TYPE) * E2
    + E2, sizeof(TYPE)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * (E2)
    + E2, sizeof(THING)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - sizeof(THING) * E2
    + E2, sizeof(THING)
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - (E1) * E2
    + E1, E2
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - (E1) * (E2)
    + E1, E2
    , ...)
    |
    - kmalloc
    + kmalloc_array
    (
    - E1 * E2
    + E1, E2
    , ...)
    )

    Signed-off-by: Kees Cook

    Kees Cook
     

19 May, 2018

2 commits

  • Prohibit probing on optimized_callback() because
    it is called from kprobes itself. If we put a kprobes
    on it, that will cause a recursive call loop.
    Mark it NOKPROBE_SYMBOL.

    Fixes: 0dc016dbd820 ("ARM: kprobes: enable OPTPROBES for ARM 32")
    Signed-off-by: Masami Hiramatsu
    Cc: stable@vger.kernel.org
    Signed-off-by: Russell King

    Masami Hiramatsu
     
  • Since get_kprobe_ctlblk() uses smp_processor_id() to access
    per-cpu variable, it hits smp_processor_id sanity check as below.

    [ 7.006928] BUG: using smp_processor_id() in preemptible [00000000] code: swapper/0/1
    [ 7.007859] caller is debug_smp_processor_id+0x20/0x24
    [ 7.008438] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.16.0-rc1-00192-g4eb17253e4b5 #1
    [ 7.008890] Hardware name: Generic DT based system
    [ 7.009917] [] (unwind_backtrace) from [] (show_stack+0x20/0x24)
    [ 7.010473] [] (show_stack) from [] (dump_stack+0x84/0x98)
    [ 7.010990] [] (dump_stack) from [] (check_preemption_disabled+0x138/0x13c)
    [ 7.011592] [] (check_preemption_disabled) from [] (debug_smp_processor_id+0x20/0x24)
    [ 7.012214] [] (debug_smp_processor_id) from [] (optimized_callback+0x2c/0xe4)
    [ 7.013077] [] (optimized_callback) from [] (0xbf0021b0)

    To fix this issue, call get_kprobe_ctlblk() right after
    irq-disabled since that disables preemption.

    Fixes: 0dc016dbd820 ("ARM: kprobes: enable OPTPROBES for ARM 32")
    Signed-off-by: Masami Hiramatsu
    Cc: stable@vger.kernel.org
    Signed-off-by: Russell King

    Masami Hiramatsu
     

18 Dec, 2017

1 commit

  • Avoid adding kprobes to any of the kernel entry/exit or startup
    assembly code, or code in the identity-mapped region. This code does
    not conform to the standard C conventions, which means that the
    expectations of the kprobes code is not forfilled.

    Placing kprobes at some of these locations results in the kernel trying
    to return to userspace addresses while retaining the CPU in kernel mode.

    Tested-by: Naresh Kamboju
    Signed-off-by: Russell King

    Russell King
     

07 Nov, 2017

2 commits

  • Remove the jprobes test case because jprobes is a deprecated feature.

    Signed-off-by: Masami Hiramatsu
    Cc: Arnd Bergmann
    Cc: Jon Medhurst
    Cc: Linus Torvalds
    Cc: Mark Brown
    Cc: Peter Zijlstra
    Cc: Russell King
    Cc: Stephen Rothwell
    Cc: Thomas Gleixner
    Cc: Wang Nan
    Cc: linux-arm-kernel@lists.infradead.org
    Link: http://lkml.kernel.org/r/150976988105.2012.13618117383683725047.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • test_kretprobe() uses jprobe_func_called at the
    last test, but it must check kretprobe_handler_called.

    Signed-off-by: Masami Hiramatsu
    Cc: Arnd Bergmann
    Cc: Jon Medhurst
    Cc: Linus Torvalds
    Cc: Mark Brown
    Cc: Peter Zijlstra
    Cc: Russell King
    Cc: Stephen Rothwell
    Cc: Thomas Gleixner
    Cc: Wang Nan
    Cc: linux-arm-kernel@lists.infradead.org
    Link: http://lkml.kernel.org/r/150976985182.2012.15495311380682779381.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

26 May, 2017

1 commit

  • The text patching functions which are invoked from jump_label and kprobes
    code are protected against cpu hotplug at the call sites.

    Use stop_machine_cpuslocked() to avoid recursion on the cpu hotplug
    rwsem. stop_machine_cpuslocked() contains a lockdep assertion to catch any
    unprotected callers.

    Signed-off-by: Thomas Gleixner
    Acked-by: Ingo Molnar
    Cc: Paul E. McKenney
    Cc: Peter Zijlstra
    Cc: Sebastian Siewior
    Cc: Steven Rostedt
    Cc: Russell King
    Cc: linux-arm-kernel@lists.infradead.org
    Link: http://lkml.kernel.org/r/20170524081549.275871311@linutronix.de

    Thomas Gleixner
     

22 Mar, 2017

4 commits

  • kprobes test cases need to have a stack that is aligned to an 8-byte
    boundary because they call other functions (and the ARM ABI mandates
    that alignment) and because test cases include 64-bit accesses to the
    stack. Unfortunately, GCC doesn't ensure this alignment for inline
    assembler and for the code in question seems to always misalign it by
    pushing just the LR register onto the stack. We therefore need to
    explicitly perform stack alignment at the start of each test case.

    Without this fix, some test cases will generate alignment faults on
    systems where alignment is enforced. Even if the kernel is configured to
    handle these faults in software, triggering them is ugly. It also
    exposes limitations in the fault handling code which doesn't cope with
    writes to the stack. E.g. when handling this instruction

    strd r6, [sp, #-64]!

    the fault handling code will write to a stack location below the SP
    value at the point the fault occurred, which coincides with where the
    exception handler has pushed the saved register context. This results in
    corruption of those registers.

    Signed-off-by: Jon Medhurst

    Jon Medhurst
     
  • This is arm port of commit 737480a0d525 ("kprobes/x86:
    Fix the return address of multiple kretprobes").

    Fix the return address of subsequent kretprobes when multiple
    kretprobes are set on the same function.

    For example:

    # cd /sys/kernel/debug/tracing
    # echo "r:event1 sys_symlink" > kprobe_events
    # echo "r:event2 sys_symlink" >> kprobe_events
    # echo 1 > events/kprobes/enable
    # ln -s /tmp/foo /tmp/bar

    (without this patch)

    # cat trace | grep -v ^#
    ln-82 [000] dn.2 68.446525: event1: (kretprobe_trampoline+0x0/0x18
    Cc: KUMANO Syuhei
    Signed-off-by: Jon Medhurst

    Masami Hiramatsu
     
  • Kprobes/arm skips single-stepping (moreover handling the event)
    if the conditional instruction must not be executed. This
    also apply the rule when we hit the recursing kprobe, so
    that kprobe does not count nmissed up in that case.

    Signed-off-by: Masami Hiramatsu
    Signed-off-by: Jon Medhurst

    Masami Hiramatsu
     
  • This is arm port of commit 6a5022a56ac3 ("kprobes/x86: Allow to
    handle reentered kprobe on single-stepping")

    Since the FIQ handlers can interrupt in the single stepping
    (or preparing the single stepping, do_debug etc.), we should
    consider a kprobe is hit in the NMI handler. Even in that
    case, the kprobe is allowed to be reentered as same as the
    kprobes hit in kprobe handlers
    (KPROBE_HIT_ACTIVE or KPROBE_HIT_SSDONE).

    The real issue will happen when a kprobe hit while another
    reentered kprobe is processing (KPROBE_REENTER), because
    we already consumed a saved-area for the previous kprobe.

    Signed-off-by: Masami Hiramatsu
    Signed-off-by: Jon Medhurst

    Masami Hiramatsu
     

02 Mar, 2017

2 commits


28 Feb, 2017

1 commit

  • Often all is needed is these small helpers, instead of compiler.h or a
    full kprobes.h. This is important for asm helpers, in fact even some
    asm/kprobes.h make use of these helpers... instead just keep a generic
    asm file with helpers useful for asm code with the least amount of
    clutter as possible.

    Likewise we need now to also address what to do about this file for both
    when architectures have CONFIG_HAVE_KPROBES, and when they do not. Then
    for when architectures have CONFIG_HAVE_KPROBES but have disabled
    CONFIG_KPROBES.

    Right now most asm/kprobes.h do not have guards against CONFIG_KPROBES,
    this means most architecture code cannot include asm/kprobes.h safely.
    Correct this and add guards for architectures missing them.
    Additionally provide architectures that not have kprobes support with
    the default asm-generic solution. This lets us force asm/kprobes.h on
    the header include/linux/kprobes.h always, but most importantly we can
    now safely include just asm/kprobes.h on architecture code without
    bringing the full kitchen sink of header files.

    Two architectures already provided a guard against CONFIG_KPROBES on its
    kprobes.h: sh, arch. The rest of the architectures needed gaurds added.
    We avoid including any not-needed headers on asm/kprobes.h unless
    kprobes have been enabled.

    In a subsequent atomic change we can try now to remove compiler.h from
    include/linux/kprobes.h.

    During this sweep I've also identified a few architectures defining a
    common macro needed for both kprobes and ftrace, that of the definition
    of the breakput instruction up. Some refer to this as
    BREAKPOINT_INSTRUCTION. This must be kept outside of the #ifdef
    CONFIG_KPROBES guard.

    [mcgrof@kernel.org: fix arm64 build]
    Link: http://lkml.kernel.org/r/CAB=NE6X1WMByuARS4mZ1g9+W=LuVBnMDnh_5zyN0CLADaVh=Jw@mail.gmail.com
    [sfr@canb.auug.org.au: fixup for kprobes declarations moving]
    Link: http://lkml.kernel.org/r/20170214165933.13ebd4f4@canb.auug.org.au
    Link: http://lkml.kernel.org/r/20170203233139.32682-1-mcgrof@kernel.org
    Signed-off-by: Luis R. Rodriguez
    Signed-off-by: Stephen Rothwell
    Acked-by: Masami Hiramatsu
    Cc: Arnd Bergmann
    Cc: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: David S. Miller
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Cc: H. Peter Anvin
    Cc: Andy Lutomirski
    Cc: Steven Rostedt
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Luis R. Rodriguez
     

10 Feb, 2015

1 commit

  • There is a superfluous '*' in the definition of kprobe_decode_insn_t
    which on older versions of GCC (4.2.4) causes the compilation error:

    In file included from arch/arm/probes/kprobes/core.c:37:
    arch/arm/probes/kprobes/core.h:43: error: '[*]' not allowed in other than a declaration

    Fix this by removing the unneeded character.

    Reported-by: Janusz Użycki
    Signed-off-by: Jon Medhurst

    Jon Medhurst
     

20 Jan, 2015

1 commit


14 Jan, 2015

7 commits

  • This patch removes software emulation or simulation for most of probed
    instructions. If the instruction doesn't use PC relative addressing,
    it will be translated into following instructions in the restore code
    in code template:

    ldmia {r0 - r14} // restore all instruction except PC
    // direct execute the probed instruction
    b next_insn // branch to next instruction.

    Signed-off-by: Wang Nan
    Reviewed-by: Masami Hiramatsu
    Signed-off-by: Jon Medhurst

    Wang Nan
     
  • This patch utilizes the previously introduced checker to check
    register usage for probed ARM instruction and saves it in a mask.
    A further patch will use such information to avoid simulation or
    emulation.

    Signed-off-by: Wang Nan
    Reviewed-by: Jon Medhurst
    Signed-off-by: Jon Medhurst

    Wang Nan
     
  • For the instruction 'mrs Rn, cpsr' the resulting value of Rn can vary due to
    external factors we can't control. So get the test code to mask out these
    indeterminate bits.

    Signed-off-by: Jon Medhurst

    Jon Medhurst (Tixy)
     
  • This patch introduce kprobeopt for ARM 32.

    Limitations:
    - Currently only kernel compiled with ARM ISA is supported.

    - Offset between probe point and optinsn slot must not larger than
    32MiB. Masami Hiramatsu suggests replacing 2 words, it will make
    things complex. Futher patch can make such optimization.

    Kprobe opt on ARM is relatively simpler than kprobe opt on x86 because
    ARM instruction is always 4 bytes aligned and 4 bytes long. This patch
    replace probed instruction by a 'b', branch to trampoline code and then
    calls optimized_callback(). optimized_callback() calls opt_pre_handler()
    to execute kprobe handler. It also emulate/simulate replaced instruction.

    When unregistering kprobe, the deferred manner of unoptimizer may leave
    branch instruction before optimizer is called. Different from x86_64,
    which only copy the probed insn after optprobe_template_end and
    reexecute them, this patch call singlestep to emulate/simulate the insn
    directly. Futher patch can optimize this behavior.

    Signed-off-by: Wang Nan
    Acked-by: Masami Hiramatsu
    Cc: Will Deacon
    Reviewed-by: Jon Medhurst (Tixy)
    Signed-off-by: Jon Medhurst

    Wang Nan
     
  • These have extra 'checker' functions associated with them so lets make
    sure those get covered by testing. As they may create uninitialised
    space on the stack we also update the test code to ensure such space is
    consistent between test runs. This is done by disabling interrupts in
    setup_test_context().

    Signed-off-by: Jon Medhurst

    Jon Medhurst (Tixy)
     
  • This patch prohibits probing instructions for which the stack
    requirements are unable to be determined statically. Some test cases
    are found not work again after the modification, this patch also
    removes them.

    Signed-off-by: Wang Nan
    Reviewed-by: Jon Medhurst
    Signed-off-by: Jon Medhurst

    Wang Nan
     
  • This patch uses the previously introduced checker functionality on
    store instructions to record their stack consumption information to
    arch_probes_insn.

    Signed-off-by: Wang Nan
    Reviewed-by: Jon Medhurst
    Signed-off-by: Jon Medhurst

    Wang Nan