01 Oct, 2020

3 commits

  • Currently using forward search doesn't handle multi-line strings correctly.
    The search routine replaces line breaks with \0 during the search and, for
    regular searches ("help | grep Common\n"), there is code after the line
    has been discarded or printed to replace the break character.

    However during a pager search ("help\n" followed by "/Common\n") when the
    string is matched we will immediately return to normal output and the code
    that should restore the \n becomes unreachable. Fix this by restoring the
    replaced character when we disable the search mode and update the comment
    accordingly.

    Fixes: fb6daa7520f9d ("kdb: Provide forward search at more prompt")
    Link: https://lore.kernel.org/r/20200909141708.338273-1-daniel.thompson@linaro.org
    Reviewed-by: Douglas Anderson
    Signed-off-by: Daniel Thompson

    Daniel Thompson
     
  • During debug trap execution we expect dbg_deactivate_sw_breakpoints()
    to be paired with an dbg_activate_sw_breakpoint(). Currently although
    the calls are paired correctly they are needlessly smeared across three
    different functions. Worse this also results in code to drive polled I/O
    being called with breakpoints activated which, in turn, needlessly
    increases the set of functions that will recursively trap if breakpointed.

    Fix this by moving the activation of breakpoints into the debug core.

    Reviewed-by: Douglas Anderson
    Link: https://lore.kernel.org/r/20200927211531.1380577-4-daniel.thompson@linaro.org
    Signed-off-by: Daniel Thompson

    Daniel Thompson
     
  • Currently kgdb honours the kprobe blocklist but doesn't place its own
    trap handling code on the list. Add labels to discourage attempting to
    use kgdb to debug itself.

    Not every functions that executes from the trap handler needs to be
    marked up: relatively early in the trap handler execution (just after
    we bring the other CPUs to a halt) all breakpoints are replaced with
    the original opcodes. This patch marks up code in the debug_core that
    executes between trap entry and the breakpoints being deactivated
    and, also, code that executes between breakpoint activation and trap
    exit.

    To be clear these changes are not sufficient to make recursive trapping
    impossible since they do not include library calls made during kgdb's
    entry/exit logic. However going much further whilst we are sharing the
    kprobe blocklist risks reducing the capabilities of kprobe and this
    would be a bad trade off (especially so given kgdb's users are currently
    conditioned to avoid recursive traps).

    Reviewed-by: Douglas Anderson
    Link: https://lore.kernel.org/r/20200927211531.1380577-3-daniel.thompson@linaro.org
    Signed-off-by: Daniel Thompson

    Daniel Thompson
     

28 Sep, 2020

1 commit

  • Currently kgdb has absolutely no safety rails in place to discourage or
    prevent a user from placing a breakpoint in dangerous places such as
    the debugger's own trap entry/exit and other places where it is not safe
    to take synchronous traps.

    Introduce a new config symbol KGDB_HONOUR_BLOCKLIST and modify the
    default implementation of kgdb_validate_break_address() so that we use
    the kprobe blocklist to prohibit instrumentation of critical functions
    if the config symbol is set. The config symbol dependencies are set to
    ensure that the blocklist will be enabled by default if we enable KGDB
    and are compiling for an architecture where we HAVE_KPROBES.

    Suggested-by: Peter Zijlstra
    Reviewed-by: Douglas Anderson
    Reviewed-by: Masami Hiramatsu
    Link: https://lore.kernel.org/r/20200927211531.1380577-2-daniel.thompson@linaro.org
    Signed-off-by: Daniel Thompson

    Daniel Thompson
     

11 Sep, 2020

1 commit


08 Sep, 2020

3 commits

  • This kills using the do_each_thread/while_each_thread combo to
    iterate all threads and uses for_each_process_thread() instead,
    maintaining semantics. while_each_thread() is ultimately racy
    and deprecated; although in this particular case there is no
    concurrency so it doesn't matter. Still lets trivially get rid
    of two more users.

    Acked-by: Oleg Nesterov
    Signed-off-by: Davidlohr Bueso
    Link: https://lore.kernel.org/r/20200907203206.21293-1-dave@stgolabs.net
    Signed-off-by: Daniel Thompson

    Davidlohr Bueso
     
  • On my system the kernel processes the "kgdb_earlycon" parameter before
    the "kgdbcon" parameter. When we setup "kgdb_earlycon" we'll end up
    in kgdb_register_callbacks() and "kgdb_use_con" won't have been set
    yet so we'll never get around to starting "kgdbcon". Let's remedy
    this by detecting that the IO module was already registered when
    setting "kgdb_use_con" and registering the console then.

    As part of this, to avoid pre-declaring things, move the handling of
    the "kgdbcon" further down in the file.

    Signed-off-by: Douglas Anderson
    Link: https://lore.kernel.org/r/20200630151422.1.I4aa062751ff5e281f5116655c976dff545c09a46@changeid
    Signed-off-by: Daniel Thompson

    Douglas Anderson
     
  • `kdb_msg_write` operates on a global `struct kgdb_io *` called
    `dbg_io_ops`.

    It's initialized in `debug_core.c` and checked throughout the debug
    flow.

    There's a null check in `kdb_msg_write` which triggers static analyzers
    and gives the (almost entirely wrong) impression that it can be null.

    Coverity scanner caught this as CID 1465042.

    I have removed the unnecessary null check and eliminated false-positive
    forward null dereference warning.

    Signed-off-by: Cengiz Can
    Link: https://lore.kernel.org/r/20200630082922.28672-1-cengiz@kernel.wtf
    Reviewed-by: Sumit Garg
    Reviewed-by: Douglas Anderson
    Tested-by: Douglas Anderson
    Signed-off-by: Daniel Thompson

    Cengiz Can
     

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
     

05 Aug, 2020

1 commit

  • Pull uninitialized_var() macro removal from Kees Cook:
    "This is long overdue, and has hidden too many bugs over the years. The
    series has several "by hand" fixes, and then a trivial treewide
    replacement.

    - Clean up non-trivial uses of uninitialized_var()

    - Update documentation and checkpatch for uninitialized_var() removal

    - Treewide removal of uninitialized_var()"

    * tag 'uninit-macro-v5.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
    compiler: Remove uninitialized_var() macro
    treewide: Remove uninitialized_var() usage
    checkpatch: Remove awareness of uninitialized_var() macro
    mm/debug_vm_pgtable: Remove uninitialized_var() usage
    f2fs: Eliminate usage of uninitialized_var() macro
    media: sur40: Remove uninitialized_var() usage
    KVM: PPC: Book3S PR: Remove uninitialized_var() usage
    clk: spear: Remove uninitialized_var() usage
    clk: st: Remove uninitialized_var() usage
    spi: davinci: Remove uninitialized_var() usage
    ide: Remove uninitialized_var() usage
    rtlwifi: rtl8192cu: Remove uninitialized_var() usage
    b43: Remove uninitialized_var() usage
    drbd: Remove uninitialized_var() usage
    x86/mm/numa: Remove uninitialized_var() usage
    docs: deprecated.rst: Add uninitialized_var()

    Linus Torvalds
     

31 Jul, 2020

1 commit

  • This converts all the existing DECLARE_TASKLET() (and ...DISABLED)
    macros with DECLARE_TASKLET_OLD() in preparation for refactoring the
    tasklet callback type. All existing DECLARE_TASKLET() users had a "0"
    data argument, it has been removed here as well.

    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Thomas Gleixner
    Signed-off-by: Kees Cook

    Kees Cook
     

17 Jul, 2020

1 commit

  • Using uninitialized_var() is dangerous as it papers over real bugs[1]
    (or can in the future), and suppresses unrelated compiler warnings
    (e.g. "unused variable"). If the compiler thinks it is uninitialized,
    either simply initialize the variable or make compiler changes.

    In preparation for removing[2] the[3] macro[4], remove all remaining
    needless uses with the following script:

    git grep '\buninitialized_var\b' | cut -d: -f1 | sort -u | \
    xargs perl -pi -e \
    's/\buninitialized_var\(([^\)]+)\)/\1/g;
    s:\s*/\* (GCC be quiet|to make compiler happy) \*/$::g;'

    drivers/video/fbdev/riva/riva_hw.c was manually tweaked to avoid
    pathological white-space.

    No outstanding warnings were found building allmodconfig with GCC 9.3.0
    for x86_64, i386, arm64, arm, powerpc, powerpc64le, s390x, mips, sparc64,
    alpha, and m68k.

    [1] https://lore.kernel.org/lkml/20200603174714.192027-1-glider@google.com/
    [2] https://lore.kernel.org/lkml/CA+55aFw+Vbj0i=1TGqCR5vQkCzWJ0QxK6CernOU6eedsudAixw@mail.gmail.com/
    [3] https://lore.kernel.org/lkml/CA+55aFwgbgqhbp1fkxvRKEpzyR5J8n1vKT1VZdz9knmPuXhOeg@mail.gmail.com/
    [4] https://lore.kernel.org/lkml/CA+55aFz2500WfbKXAx8s67wrm9=yVJu65TpLgN_ybYNv0VEOKA@mail.gmail.com/

    Reviewed-by: Leon Romanovsky # drivers/infiniband and mlx4/mlx5
    Acked-by: Jason Gunthorpe # IB
    Acked-by: Kalle Valo # wireless drivers
    Reviewed-by: Chao Yu # erofs
    Signed-off-by: Kees Cook

    Kees Cook
     

10 Jul, 2020

1 commit

  • The XML packet could be supported by required architecture if the
    architecture defines CONFIG_HAVE_ARCH_KGDB_QXFER_PKT and implement its own
    kgdb_arch_handle_qxfer_pkt(). Except for the kgdb_arch_handle_qxfer_pkt(),
    the architecture also needs to record the feature supported by gdb stub
    into the kgdb_arch_gdb_stub_feature, and these features will be reported
    to host gdb when gdb stub receives the qSupported packet.

    Signed-off-by: Vincent Chen
    Acked-by: Daniel Thompson
    Signed-off-by: Palmer Dabbelt

    Vincent Chen
     

26 Jun, 2020

2 commits

  • At times when I'm using kgdb I see a splat on my console about
    suspicious RCU usage. I managed to come up with a case that could
    reproduce this that looked like this:

    WARNING: suspicious RCU usage
    5.7.0-rc4+ #609 Not tainted
    -----------------------------
    kernel/pid.c:395 find_task_by_pid_ns() needs rcu_read_lock() protection!

    other info that might help us debug this:

    rcu_scheduler_active = 2, debug_locks = 1
    3 locks held by swapper/0/1:
    #0: ffffff81b6b8e988 (&dev->mutex){....}-{3:3}, at: __device_attach+0x40/0x13c
    #1: ffffffd01109e9e8 (dbg_master_lock){....}-{2:2}, at: kgdb_cpu_enter+0x20c/0x7ac
    #2: ffffffd01109ea90 (dbg_slave_lock){....}-{2:2}, at: kgdb_cpu_enter+0x3ec/0x7ac

    stack backtrace:
    CPU: 7 PID: 1 Comm: swapper/0 Not tainted 5.7.0-rc4+ #609
    Hardware name: Google Cheza (rev3+) (DT)
    Call trace:
    dump_backtrace+0x0/0x1b8
    show_stack+0x1c/0x24
    dump_stack+0xd4/0x134
    lockdep_rcu_suspicious+0xf0/0x100
    find_task_by_pid_ns+0x5c/0x80
    getthread+0x8c/0xb0
    gdb_serial_stub+0x9d4/0xd04
    kgdb_cpu_enter+0x284/0x7ac
    kgdb_handle_exception+0x174/0x20c
    kgdb_brk_fn+0x24/0x30
    call_break_hook+0x6c/0x7c
    brk_handler+0x20/0x5c
    do_debug_exception+0x1c8/0x22c
    el1_sync_handler+0x3c/0xe4
    el1_sync+0x7c/0x100
    rpmh_rsc_probe+0x38/0x420
    platform_drv_probe+0x94/0xb4
    really_probe+0x134/0x300
    driver_probe_device+0x68/0x100
    __device_attach_driver+0x90/0xa8
    bus_for_each_drv+0x84/0xcc
    __device_attach+0xb4/0x13c
    device_initial_probe+0x18/0x20
    bus_probe_device+0x38/0x98
    device_add+0x38c/0x420

    If I understand properly we should just be able to blanket kgdb under
    one big RCU read lock and the problem should go away. We'll add it to
    the beast-of-a-function known as kgdb_cpu_enter().

    With this I no longer get any splats and things seem to work fine.

    Signed-off-by: Douglas Anderson
    Link: https://lore.kernel.org/r/20200602154729.v2.1.I70e0d4fd46d5ed2aaf0c98a355e8e1b7a5bb7e4e@changeid
    Signed-off-by: Daniel Thompson

    Douglas Anderson
     
  • In kgdb context, calling console handlers aren't safe due to locks used
    in those handlers which could in turn lead to a deadlock. Although, using
    oops_in_progress increases the chance to bypass locks in most console
    handlers but it might not be sufficient enough in case a console uses
    more locks (VT/TTY is good example).

    Currently when a driver provides both polling I/O and a console then kdb
    will output using the console. We can increase robustness by using the
    currently active polling I/O driver (which should be lockless) instead
    of the corresponding console. For several common cases (e.g. an
    embedded system with a single serial port that is used both for console
    output and debugger I/O) this will result in no console handler being
    used.

    In order to achieve this we need to reverse the order of preference to
    use dbg_io_ops (uses polling I/O mode) over console APIs. So we just
    store "struct console" that represents debugger I/O in dbg_io_ops and
    while emitting kdb messages, skip console that matches dbg_io_ops
    console in order to avoid duplicate messages. After this change,
    "is_console" param becomes redundant and hence removed.

    Suggested-by: Daniel Thompson
    Signed-off-by: Sumit Garg
    Link: https://lore.kernel.org/r/1591264879-25920-5-git-send-email-sumit.garg@linaro.org
    Reviewed-by: Douglas Anderson
    Reviewed-by: Petr Mladek
    Acked-by: Greg Kroah-Hartman
    Signed-off-by: Daniel Thompson

    Sumit Garg
     

25 Jun, 2020

3 commits

  • While rounding up CPUs via NMIs, its possible that a rounded up CPU
    maybe holding a console port lock leading to kgdb master CPU stuck in
    a deadlock during invocation of console write operations. A similar
    deadlock could also be possible while using synchronous breakpoints.

    So in order to avoid such a deadlock, set oops_in_progress to encourage
    the console drivers to disregard their internal spin locks: in the
    current calling context the risk of deadlock is a bigger problem than
    risks due to re-entering the console driver. We operate directly on
    oops_in_progress rather than using bust_spinlocks() because the calls
    bust_spinlocks() makes on exit are not appropriate for this calling
    context.

    Suggested-by: Sergey Senozhatsky
    Signed-off-by: Sumit Garg
    Reviewed-by: Douglas Anderson
    Reviewed-by: Petr Mladek
    Link: https://lore.kernel.org/r/1591264879-25920-4-git-send-email-sumit.garg@linaro.org
    Signed-off-by: Daniel Thompson

    Sumit Garg
     
  • Check if a console is enabled prior to invoking corresponding write
    handler.

    Suggested-by: Sergey Senozhatsky
    Signed-off-by: Sumit Garg
    Reviewed-by: Daniel Thompson
    Reviewed-by: Douglas Anderson
    Reviewed-by: Petr Mladek
    Link: https://lore.kernel.org/r/1591264879-25920-3-git-send-email-sumit.garg@linaro.org
    Signed-off-by: Daniel Thompson

    Sumit Garg
     
  • Re-factor kdb_printf() message write code in order to avoid duplication
    of code and thereby increase readability.

    Signed-off-by: Sumit Garg
    Reviewed-by: Douglas Anderson
    Reviewed-by: Petr Mladek
    Link: https://lore.kernel.org/r/1591264879-25920-2-git-send-email-sumit.garg@linaro.org
    Signed-off-by: Daniel Thompson

    Sumit Garg
     

18 Jun, 2020

1 commit


10 Jun, 2020

2 commits

  • Now the last users of show_stack() got converted to use an explicit log
    level, show_stack_loglvl() can drop it's redundant suffix and become once
    again well known show_stack().

    Signed-off-by: Dmitry Safonov
    Signed-off-by: Andrew Morton
    Link: http://lkml.kernel.org/r/20200418201944.482088-51-dima@arista.com
    Signed-off-by: Linus Torvalds

    Dmitry Safonov
     
  • Print the stack trace with KERN_EMERG - it should be always visible.

    Playing with console_loglevel is a bad idea as there may be more messages
    printed than wanted. Also the stack trace might be not printed at all if
    printk() was deferred and console_loglevel was raised back before the
    trace got flushed.

    Unfortunately, after rebasing on commit 2277b492582d ("kdb: Fix stack
    crawling on 'running' CPUs that aren't the master"), kdb_show_stack() uses
    now kdb_dump_stack_on_cpu(), which for now won't be converted as it uses
    dump_stack() instead of show_stack().

    Convert for now the branch that uses show_stack() and remove
    console_loglevel exercise from that case.

    Signed-off-by: Dmitry Safonov
    Signed-off-by: Andrew Morton
    Reviewed-by: Douglas Anderson
    Acked-by: Daniel Thompson
    Cc: Jason Wessel
    Link: http://lkml.kernel.org/r/20200418201944.482088-48-dima@arista.com
    Signed-off-by: Linus Torvalds

    Dmitry Safonov
     

08 Jun, 2020

1 commit

  • Pull tty/serial driver updates from Greg KH:
    "Here is the tty and serial driver updates for 5.8-rc1

    Nothing huge at all, just a lot of little serial driver fixes, updates
    for new devices and features, and other small things. Full details are
    in the shortlog.

    All of these have been in linux-next with no issues for a while"

    * tag 'tty-5.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (67 commits)
    tty: serial: qcom_geni_serial: Add 51.2MHz frequency support
    tty: serial: imx: clear Ageing Timer Interrupt in handler
    serial: 8250_fintek: Add F81966 Support
    sc16is7xx: Add flag to activate IrDA mode
    dt-bindings: sc16is7xx: Add flag to activate IrDA mode
    serial: 8250: Support rs485 bus termination GPIO
    serial: 8520_port: Fix function param documentation
    dt-bindings: serial: Add binding for rs485 bus termination GPIO
    vt: keyboard: avoid signed integer overflow in k_ascii
    serial: 8250: Enable 16550A variants by default on non-x86
    tty: hvc_console, fix crashes on parallel open/close
    serial: imx: Initialize lock for non-registered console
    sc16is7xx: Read the LSR register for basic device presence check
    sc16is7xx: Allow sharing the IRQ line
    sc16is7xx: Use threaded IRQ
    sc16is7xx: Always use falling edge IRQ
    tty: n_gsm: Fix bogus i++ in gsm_data_kick
    tty: n_gsm: Remove unnecessary test in gsm_print_packet()
    serial: stm32: add no_console_suspend support
    tty: serial: fsl_lpuart: Use __maybe_unused instead of #if CONFIG_PM_SLEEP
    ...

    Linus Torvalds
     

05 Jun, 2020

1 commit

  • Pull RISC-V updates from Palmer Dabbelt:

    - The remainder of the code necessary to support the Kendryte K210:

    * Support for building device trees into the kernel, as the K210
    doesn't have a bootloader that provides one

    * A K210 device tree and the associated defconfig update

    * Support for skipping PMP initialization on systems that trap on
    PMP accesses rather than treating them as WARL

    - Support for KGDB

    - Improvements to text patching

    - Some cleanups to the SiFive L2 cache driver

    * tag 'riscv-for-linus-5.8-mw0' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux:
    soc: sifive: l2 cache: Mark l2_get_priv_group as static
    soc: sifive: l2 cache: Eliminate an unsigned zero compare warning
    riscv: Add support to determine no. of L2 cache way enabled
    riscv: cacheinfo: Implement cache_get_priv_group with a generic ops structure
    riscv: Use text_mutex instead of patch_lock
    riscv: Use NOKPROBE_SYMBOL() instead of __krpobes annotation
    riscv: Remove the 'riscv_' prefix of function name
    riscv: Add SW single-step support for KDB
    riscv: Use the XML target descriptions to report 3 system registers
    riscv: Add KGDB support
    kgdb: Add kgdb_has_hit_break function
    RISC-V: Skip setting up PMPs on traps
    riscv: K210: Update defconfig
    riscv: K210: Add a built-in device tree
    riscv: Allow device trees to be built into the kernel

    Linus Torvalds
     

02 Jun, 2020

3 commits

  • Currently, 'KDBFLAGS' is an internal variable of kdb, it is combined
    by 'KDBDEBUG' and state flags. It will be shown only when 'KDBDEBUG'
    is set, and the user can define an environment variable named 'KDBFLAGS'
    too. These are puzzling indeed.

    After communication with Daniel, it seems that 'KDBFLAGS' is a misfeature.
    So let's replace 'KDBFLAGS' with 'KDBDEBUG' to just show the value we
    wrote into. After this modification, we can use `md4c1 kdb_flags` instead,
    to observe the state flags.

    Suggested-by: Daniel Thompson
    Signed-off-by: Wei Li
    Link: https://lore.kernel.org/r/20200521072125.21103-1-liwei391@huawei.com
    [daniel.thompson@linaro.org: Make kdb_flags unsigned to avoid arithmetic
    right shift]
    Signed-off-by: Daniel Thompson

    Wei Li
     
  • From code inspection the math in handle_ctrl_cmd() looks super sketchy
    because it subjects -1 from cmdptr and then does a "%
    KDB_CMD_HISTORY_COUNT". It turns out that this code works because
    "cmdptr" is unsigned and KDB_CMD_HISTORY_COUNT is a nice power of 2.
    Let's make this a little less sketchy.

    This patch should be a no-op.

    Signed-off-by: Douglas Anderson
    Link: https://lore.kernel.org/r/20200507161125.1.I2cce9ac66e141230c3644b8174b6c15d4e769232@changeid
    Reviewed-by: Sumit Garg
    Signed-off-by: Daniel Thompson

    Douglas Anderson
     
  • When I combined kgdboc_earlycon with an inflight patch titled ("soc:
    qcom-geni-se: Add interconnect support to fix earlycon crash") [1]
    things went boom. Specifically I got a crash during the transition
    between kgdboc_earlycon and the main kgdboc that looked like this:

    Call trace:
    __schedule_bug+0x68/0x6c
    __schedule+0x75c/0x924
    schedule+0x8c/0xbc
    schedule_timeout+0x9c/0xfc
    do_wait_for_common+0xd0/0x160
    wait_for_completion_timeout+0x54/0x74
    rpmh_write_batch+0x1fc/0x23c
    qcom_icc_bcm_voter_commit+0x1b4/0x388
    qcom_icc_set+0x2c/0x3c
    apply_constraints+0x5c/0x98
    icc_set_bw+0x204/0x3bc
    icc_put+0x30/0xf8
    geni_remove_earlycon_icc_vote+0x6c/0x9c
    qcom_geni_serial_earlycon_exit+0x10/0x1c
    kgdboc_earlycon_deinit+0x38/0x58
    kgdb_register_io_module+0x11c/0x194
    configure_kgdboc+0x108/0x174
    kgdboc_probe+0x38/0x60
    platform_drv_probe+0x90/0xb0
    really_probe+0x130/0x2fc
    ...

    The problem was that we were holding the "kgdb_registration_lock"
    while calling into code that didn't expect to be called in spinlock
    context.

    Let's slightly defer when we call the deinit code so that it's not
    done under spinlock.

    NOTE: this does mean that the "deinit" call of the old kgdb IO module
    is now made _after_ the init of the new IO module, but presumably
    that's OK.

    [1] https://lkml.kernel.org/r/1588919619-21355-3-git-send-email-akashast@codeaurora.org

    Fixes: 220995622da5 ("kgdboc: Add kgdboc_earlycon to support early kgdb using boot consoles")
    Signed-off-by: Douglas Anderson
    Link: https://lore.kernel.org/r/20200526142001.1.I523dc33f96589cb9956f5679976d402c8cda36fa@changeid
    [daniel.thompson@linaro.org: Resolved merge issues by hand]
    Signed-off-by: Daniel Thompson

    Douglas Anderson
     

19 May, 2020

4 commits

  • The break instruction in RISC-V does not have an immediate value field, so
    the kernel cannot identify the purpose of each trap exception through the
    opcode. This makes the existing identification schemes in other
    architecture unsuitable for the RISC-V kernel. To solve this problem, this
    patch adds kgdb_has_hit_break(), which can help RISC-V kernel identify
    the KGDB trap exception.

    Signed-off-by: Vincent Chen
    Reviewed-by: Palmer Dabbelt
    Acked-by: Daniel Thompson
    Signed-off-by: Palmer Dabbelt

    Vincent Chen
     
  • We want to enable kgdb to debug the early parts of the kernel.
    Unfortunately kgdb normally is a client of the tty API in the kernel
    and serial drivers don't register to the tty layer until fairly late
    in the boot process.

    Serial drivers do, however, commonly register a boot console. Let's
    enable the kgdboc driver to work with boot consoles to provide early
    debugging.

    This change co-opts the existing read() function pointer that's part
    of "struct console". It's assumed that if a boot console (with the
    flag CON_BOOT) has implemented read() that both the read() and write()
    function are polling functions. That means they work without
    interrupts and read() will return immediately (with 0 bytes read) if
    there's nothing to read. This should be a safe assumption since it
    appears that no current boot consoles implement read() right now and
    there seems no reason to do so unless they wanted to support
    "kgdboc_earlycon".

    The normal/expected way to make all this work is to use
    "kgdboc_earlycon" and "kgdboc" together. You should point them both
    to the same physical serial connection. At boot time, as the system
    transitions from the boot console to the normal console (and registers
    a tty), kgdb will switch over.

    One awkward part of all this, though, is that there can be a window
    where the boot console goes away and we can't quite transtion over to
    the main kgdboc that uses the tty layer. There are two main problems:

    1. The act of registering the tty doesn't cause any call into kgdboc
    so there is a window of time when the tty is there but kgdboc's
    init code hasn't been called so we can't transition to it.

    2. On some serial drivers the normal console inits (and replaces the
    boot console) quite early in the system. Presumably these drivers
    were coded up before earlycon worked as well as it does today and
    probably they don't need to do this anymore, but it causes us
    problems nontheless.

    Problem #1 is not too big of a deal somewhat due to the luck of probe
    ordering. kgdboc is last in the tty/serial/Makefile so its probe gets
    right after all other tty devices. It's not fun to rely on this, but
    it does work for the most part.

    Problem #2 is a big deal, but only for some serial drivers. Other
    serial drivers end up registering the console (which gets rid of the
    boot console) and tty at nearly the same time.

    The way we'll deal with the window when the system has stopped using
    the boot console and the time when we're setup using the tty is to
    keep using the boot console. This may sound surprising, but it has
    been found to work well in practice. If it doesn't work, it shouldn't
    be too hard for a given serial driver to make it keep working.
    Specifically, it's expected that the read()/write() function provided
    in the boot console should be the same (or nearly the same) as the
    normal kgdb polling functions. That means continuing to use them
    should work just fine. To make things even more likely to work work
    we'll also trap the recently added exit() function in the boot console
    we're using and delay any calls to it until we're all done with the
    boot console.

    NOTE: there could be ways to use all this in weird / unexpected ways.
    If you do something like this, it's a bit of a buyer beware situation.
    Specifically:
    - If you specify only "kgdboc_earlycon" but not "kgdboc" then
    (depending on your serial driver) things will probably work OK, but
    you'll get a warning printed the first time you use kgdb after the
    boot console is gone. You'd only be able to do this, of course, if
    the serial driver you're running atop provided an early boot console.
    - If your "kgdboc_earlycon" and "kgdboc" devices are not the same
    device things should work OK, but it'll be your job to switch over
    which device you're monitoring (including figuring out how to switch
    over gdb in-flight if you're using it).

    When trying to enable "kgdboc_earlycon" it should be noted that the
    names that are registered through the boot console layer and the tty
    layer are not the same for the same port. For example when debugging
    on one board I'd need to pass "kgdboc_earlycon=qcom_geni
    kgdboc=ttyMSM0" to enable things properly. Since digging up the boot
    console name is a pain and there will rarely be more than one boot
    console enabled, you can provide the "kgdboc_earlycon" parameter
    without specifying the name of the boot console. In this case we'll
    just pick the first boot that implements read() that we find.

    This new "kgdboc_earlycon" parameter should be contrasted to the
    existing "ekgdboc" parameter. While both provide a way to debug very
    early, the usage and mechanisms are quite different. Specifically
    "kgdboc_earlycon" is meant to be used in tandem with "kgdboc" and
    there is a transition from one to the other. The "ekgdboc" parameter,
    on the other hand, replaces the "kgdboc" parameter. It runs the same
    logic as the "kgdboc" parameter but just relies on your TTY driver
    being present super early. The only known usage of the old "ekgdboc"
    parameter is documented as "ekgdboc=kbd earlyprintk=vga". It should
    be noted that "kbd" has special treatment allowing it to init early as
    a tty device.

    Signed-off-by: Douglas Anderson
    Reviewed-by: Greg Kroah-Hartman
    Tested-by: Sumit Garg
    Link: https://lore.kernel.org/r/20200507130644.v4.8.I8fba5961bf452ab92350654aa61957f23ecf0100@changeid
    Signed-off-by: Daniel Thompson

    Douglas Anderson
     
  • If we detect that we recursively entered the debugger we should hack
    our I/O ops to NULL so that the panic() in the next line won't
    actually cause another recursion into the debugger. The first line of
    kgdb_panic() will check this and return.

    Signed-off-by: Douglas Anderson
    Reviewed-by: Daniel Thompson
    Link: https://lore.kernel.org/r/20200507130644.v4.6.I89de39f68736c9de610e6f241e68d8dbc44bc266@changeid
    Signed-off-by: Daniel Thompson

    Douglas Anderson
     
  • Using kgdb requires at least some level of architecture-level
    initialization. If nothing else, it relies on the architecture to
    pass breakpoints / crashes onto kgdb.

    On some architectures this all works super early, specifically it
    starts working at some point in time before Linux parses
    early_params's. On other architectures it doesn't. A survey of a few
    platforms:

    a) x86: Presumably it all works early since "ekgdboc" is documented to
    work here.
    b) arm64: Catching crashes works; with a simple patch breakpoints can
    also be made to work.
    c) arm: Nothing in kgdb works until
    paging_init() -> devicemaps_init() -> early_trap_init()

    Let's be conservative and, by default, process "kgdbwait" (which tells
    the kernel to drop into the debugger ASAP at boot) a bit later at
    dbg_late_init() time. If an architecture has tested it and wants to
    re-enable super early debugging, they can select the
    ARCH_HAS_EARLY_DEBUG KConfig option. We'll do this for x86 to start.
    It should be noted that dbg_late_init() is still called quite early in
    the system.

    Note that this patch doesn't affect when kgdb runs its init. If kgdb
    is set to initialize early it will still initialize when parsing
    early_param's. This patch _only_ inhibits the initial breakpoint from
    "kgdbwait". This means:

    * Without any extra patches arm64 platforms will at least catch
    crashes after kgdb inits.
    * arm platforms will catch crashes (and could handle a hardcoded
    kgdb_breakpoint()) any time after early_trap_init() runs, even
    before dbg_late_init().

    Signed-off-by: Douglas Anderson
    Cc: Thomas Gleixner
    Cc: Ingo Molnar
    Cc: Borislav Petkov
    Reviewed-by: Greg Kroah-Hartman
    Link: https://lore.kernel.org/r/20200507130644.v4.4.I3113aea1b08d8ce36dc3720209392ae8b815201b@changeid
    Signed-off-by: Daniel Thompson

    Douglas Anderson
     

18 May, 2020

1 commit

  • In commit 81eaadcae81b ("kgdboc: disable the console lock when in
    kgdb") we avoided the WARN_CONSOLE_UNLOCKED() yell when we were in
    kgdboc. That still works fine, but it turns out that we get a similar
    yell when using other I/O drivers. One example is the "I/O driver"
    for the kgdb test suite (kgdbts). When I enabled that I again got the
    same yells.

    Even though "kgdbts" doesn't actually interact with the user over the
    console, using it still causes kgdb to print to the consoles. That
    trips the same warning:
    con_is_visible+0x60/0x68
    con_scroll+0x110/0x1b8
    lf+0x4c/0xc8
    vt_console_print+0x1b8/0x348
    vkdb_printf+0x320/0x89c
    kdb_printf+0x68/0x90
    kdb_main_loop+0x190/0x860
    kdb_stub+0x2cc/0x3ec
    kgdb_cpu_enter+0x268/0x744
    kgdb_handle_exception+0x1a4/0x200
    kgdb_compiled_brk_fn+0x34/0x44
    brk_handler+0x7c/0xb8
    do_debug_exception+0x1b4/0x228

    Let's increment/decrement the "ignore_console_lock_warning" variable
    all the time when we enter the debugger.

    This will allow us to later revert commit 81eaadcae81b ("kgdboc:
    disable the console lock when in kgdb").

    Signed-off-by: Douglas Anderson
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Daniel Thompson
    Link: https://lore.kernel.org/r/20200507130644.v4.1.Ied2b058357152ebcc8bf68edd6f20a11d98d7d4e@changeid
    Signed-off-by: Daniel Thompson

    Douglas Anderson
     

15 May, 2020

1 commit

  • With earlier commits, the API no longer discards the const-ness of the
    sysrq_key_op. As such we can add the notation.

    Cc: Greg Kroah-Hartman
    Cc: Jiri Slaby
    Cc: linux-kernel@vger.kernel.org
    Cc: Jason Wessel
    Cc: Daniel Thompson
    Cc: kgdb-bugreport@lists.sourceforge.net
    Acked-by: Daniel Thompson
    Signed-off-by: Emil Velikov
    Link: https://lore.kernel.org/r/20200513214351.2138580-9-emil.l.velikov@gmail.com
    Signed-off-by: Greg Kroah-Hartman

    Emil Velikov
     

07 May, 2020

1 commit

  • Kernel doc does not understand POD variables to be referred to.

    .../debug_core.c:73: warning: cannot understand function prototype:
    'int kgdb_connected; '

    Convert kernel doc to pure comment.

    Fixes: dc7d55270521 ("kgdb: core")
    Cc: Jason Wessel
    Signed-off-by: Andy Shevchenko
    Reviewed-by: Douglas Anderson
    Signed-off-by: Daniel Thompson

    Andy Shevchenko
     

04 Apr, 2020

1 commit

  • Pull SPDX updates from Greg KH:
    "Here are three SPDX patches for 5.7-rc1.

    One fixes up the SPDX tag for a single driver, while the other two go
    through the tree and add SPDX tags for all of the .gitignore files as
    needed.

    Nothing too complex, but you will get a merge conflict with your
    current tree, that should be trivial to handle (one file modified by
    two things, one file deleted.)

    All three of these have been in linux-next for a while, with no
    reported issues other than the merge conflict"

    * tag 'spdx-5.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/spdx:
    ASoC: MT6660: make spdxcheck.py happy
    .gitignore: add SPDX License Identifier
    .gitignore: remove too obvious comments

    Linus Torvalds
     

01 Apr, 2020

2 commits

  • Currently the PROMPT variable could be abused to provoke the printf()
    machinery to read outside the current stack frame. Normally this
    doesn't matter becaues md is already a much better tool for reading
    from memory.

    However the md command can be disabled by not setting KDB_ENABLE_MEM_READ.
    Let's also prevent PROMPT from being modified in these circumstances.

    Whilst adding a comment to help future code reviewers we also remove
    the #ifdef where PROMPT in consumed. There is no problem passing an
    unused (0) to snprintf when !CONFIG_SMP.
    argument

    Reported-by: Wang Xiayang
    Signed-off-by: Daniel Thompson
    Reviewed-by: Douglas Anderson

    Daniel Thompson
     
  • Currently the code to manage the kdb history buffer uses strncpy() to
    copy strings to/and from the history and exhibits the classic "but
    nobody ever told me that strncpy() doesn't always terminate strings"
    bug. Modern gcc compilers recognise this bug and issue a warning.

    In reality these calls will only abridge the copied string if kdb_read()
    has *already* overflowed the command buffer. Thus the use of counted
    copies here is only used to reduce the secondary effects of a bug
    elsewhere in the code.

    Therefore transitioning these calls into strscpy() (without checking
    the return code) is appropriate.

    Signed-off-by: Daniel Thompson
    Reviewed-by: Douglas Anderson

    Daniel Thompson
     

25 Mar, 2020

1 commit


06 Feb, 2020

1 commit


01 Feb, 2020

2 commits