From patchwork Sun Sep 27 21:15:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Thompson X-Patchwork-Id: 313602 Delivered-To: patches@linaro.org Received: by 2002:a92:5ad1:0:0:0:0:0 with SMTP id b78csp2819488ilg; Sun, 27 Sep 2020 14:16:17 -0700 (PDT) X-Received: by 2002:a1c:b608:: with SMTP id g8mr8765279wmf.106.1601241377099; Sun, 27 Sep 2020 14:16:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601241377; cv=none; d=google.com; s=arc-20160816; b=HAy9Xl6u65EzWMP+uxOpdvh3zq5DhbDRIh9cRZdi/oe6AMvGDSS6BaKuSFN/sEIoV4 9ExweQ1+4DFNeTPMkCAPSkpUDzHEsAclu67j9l2ORQMw0pt5v7a8/F0anpORk4ofhX3g vyMiMerjQB3LdlH/wVk4+mmrOHlyRA/GAmFc2jGgYwsPvAL/r1+C6HLxuJ6ZNdpDKxBB eOgoeX/8ZmB+/i5qkloC0Q1ZWvTniOyWPDzG8XjCVxP0MrpN0VQStZkdt+9DYMU1jG+3 22D2Z1+sKEBg5/FhpVPx6Qf3FAshQ6ExZQ/LJKiFpPrFOJZ+2lu151kNgF9JpHC1rp2D 2JYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=N+Ii1nMTxqQ3KB5diZSPJLBE7AzX1vOzJWQZljPq00k=; b=gUSeJ1VmvnNhotgA0FvXRFzkr0yJ78WswppE5x9CeeJNF+ag/nctKO27aQnvxKhqOD /UQa1McW7RZY4rBh3cJjY8UU92LFdtHSAm9h4f/9yFyDU21M/p52sIzVeyCliiuQLzA1 bpWtndaKwU25bPOrqEGLC4IzE8N0sYh7jz2YJ2oWyaTA4FoXYmvGM0tvv7XYRovoK5AH tGZ+MCmDVKWTf9CE2MYOlinHxIyobgqh/U+iKtcwwiNQU6TkM6EdxLu/BXXxXGa1rhhK kGNSNMAkzLhTPA9EiD2UNJ2HyIdrURs+JO5o8Cd236DzHqw1iM2qgkmcwSNre79jcAme Y0ug== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=IzRe0iLc; spf=pass (google.com: domain of daniel.thompson@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=daniel.thompson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id u26sor2567718wmj.1.2020.09.27.14.16.16 for (Google Transport Security); Sun, 27 Sep 2020 14:16:17 -0700 (PDT) Received-SPF: pass (google.com: domain of daniel.thompson@linaro.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=IzRe0iLc; spf=pass (google.com: domain of daniel.thompson@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=daniel.thompson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=N+Ii1nMTxqQ3KB5diZSPJLBE7AzX1vOzJWQZljPq00k=; b=IzRe0iLcxGVxSWG941aMsPrFaGDAlhFd/0DWKmNS7I3+k9Rs8UszLqf+776SaffdkQ iw8OT30UVGAn4LNed6pEQ18id6nyCzVVhe0MGBnPpbUFH5LyDb6nZi6qX0Zp+XTFBv3k pTlcZFBfouoLSmyfldSWnGJIXWszAxX3W9VxhfdjwHqAiPX/NOBwgOE0ZiOBaRfRK31v JSHtqJ0NsNUS4GOCiXkcOOLuDUGEe1DSRdbhjxsD6FqoqhOHqYaX94MepxMpRD32J8Hc sew+85FHUwqbGlAnZLy59HlBvg1ci53RzlzkZvuBhtyomo+bu9hOmtIblasPwvfuMnDG r3Cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=N+Ii1nMTxqQ3KB5diZSPJLBE7AzX1vOzJWQZljPq00k=; b=NzBm8xYG3XBuW2cGcOz8v7iuaK+A2X1r7c8B12HQXR8XZSO1TCWl0rjNS5+RqDCb1Z cBA6sEDKR71uCopEr0/EbNiCxTKcFa8Y9aPPxAAJkb0SYTPDdVSS1g3AcZq01w26apeG TVOdkoNbFU7wD5Z977YS0ug80bGdA5reYd4SnWnk361fn9vGdvhI8TOhM/E48r8qllD5 F3CN+qqCdNPaDJJQRtSqu9poKNtjpli2XBxQ3HN+7M4I3zkBK7U/7DGFknOdripwWGwr 3jmhZ6vlA6Q5ciQzoFGV/ZMyI3GpM3L+8FNLsIrd4Ch3RwsyqNi1WPMo4C91KTiMw5J3 Z+ZA== X-Gm-Message-State: AOAM532lwv02R5Qvl1OJPVej8lcyMP3SuY0hqnREQGH2+EOH1tojw9e9 sE4udQes23hT0qD6pxsnITHJO5mo X-Google-Smtp-Source: ABdhPJwi5Uve1dX5mSII74NP7BohO0vivBIUiywg2rM9zTvrjEX3Q5fG1U53TK3YqXK9dTZdIaQk+A== X-Received: by 2002:a7b:c4d1:: with SMTP id g17mr8161345wmk.167.1601241376739; Sun, 27 Sep 2020 14:16:16 -0700 (PDT) Return-Path: Received: from wychelm.lan (cpc141216-aztw34-2-0-cust174.18-1.cable.virginm.net. [80.7.220.175]) by smtp.gmail.com with ESMTPSA id s17sm11396676wrr.40.2020.09.27.14.16.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2020 14:16:16 -0700 (PDT) From: Daniel Thompson To: Jason Wessel , Douglas Anderson Cc: Daniel Thompson , Peter Zijlstra , sumit.garg@linaro.org, pmladek@suse.com, sergey.senozhatsky@gmail.com, will@kernel.org, Masami Hiramatsu , kgdb-bugreport@lists.sourceforge.net, linux-kernel@vger.kernel.org, patches@linaro.org Subject: [PATCH v3 2/3] kgdb: Add NOKPROBE labels on the trap handler functions Date: Sun, 27 Sep 2020 22:15:30 +0100 Message-Id: <20200927211531.1380577-3-daniel.thompson@linaro.org> X-Mailer: git-send-email 2.25.4 In-Reply-To: <20200927211531.1380577-1-daniel.thompson@linaro.org> References: <20200927211531.1380577-1-daniel.thompson@linaro.org> MIME-Version: 1.0 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 cover all the 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). Signed-off-by: Daniel Thompson --- kernel/debug/debug_core.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) -- 2.25.4 Reviewed-by: Douglas Anderson diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c index b1277728a835..faa1f99ce65a 100644 --- a/kernel/debug/debug_core.c +++ b/kernel/debug/debug_core.c @@ -177,12 +177,14 @@ int __weak kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt) arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE); return err; } +NOKPROBE_SYMBOL(kgdb_arch_set_breakpoint); int __weak kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt) { return copy_to_kernel_nofault((char *)bpt->bpt_addr, (char *)bpt->saved_instr, BREAK_INSTR_SIZE); } +NOKPROBE_SYMBOL(kgdb_arch_remove_breakpoint); int __weak kgdb_validate_break_address(unsigned long addr) { @@ -212,6 +214,7 @@ unsigned long __weak kgdb_arch_pc(int exception, struct pt_regs *regs) { return instruction_pointer(regs); } +NOKPROBE_SYMBOL(kgdb_arch_pc); int __weak kgdb_arch_init(void) { @@ -222,6 +225,7 @@ int __weak kgdb_skipexception(int exception, struct pt_regs *regs) { return 0; } +NOKPROBE_SYMBOL(kgdb_skipexception); #ifdef CONFIG_SMP @@ -243,6 +247,7 @@ void __weak kgdb_call_nmi_hook(void *ignored) */ kgdb_nmicallback(raw_smp_processor_id(), get_irq_regs()); } +NOKPROBE_SYMBOL(kgdb_call_nmi_hook); void __weak kgdb_roundup_cpus(void) { @@ -276,6 +281,7 @@ void __weak kgdb_roundup_cpus(void) kgdb_info[cpu].rounding_up = false; } } +NOKPROBE_SYMBOL(kgdb_roundup_cpus); #endif @@ -302,6 +308,7 @@ static void kgdb_flush_swbreak_addr(unsigned long addr) /* Force flush instruction cache if it was outside the mm */ flush_icache_range(addr, addr + BREAK_INSTR_SIZE); } +NOKPROBE_SYMBOL(kgdb_flush_swbreak_addr); /* * SW breakpoint management: @@ -329,6 +336,7 @@ int dbg_activate_sw_breakpoints(void) } return ret; } +NOKPROBE_SYMBOL(dbg_activate_sw_breakpoints); int dbg_set_sw_break(unsigned long addr) { @@ -392,6 +400,7 @@ int dbg_deactivate_sw_breakpoints(void) } return ret; } +NOKPROBE_SYMBOL(dbg_deactivate_sw_breakpoints); int dbg_remove_sw_break(unsigned long addr) { @@ -513,6 +522,7 @@ static int kgdb_io_ready(int print_wait) } return 1; } +NOKPROBE_SYMBOL(kgdb_io_ready); static int kgdb_reenter_check(struct kgdb_state *ks) { @@ -560,6 +570,7 @@ static int kgdb_reenter_check(struct kgdb_state *ks) return 1; } +NOKPROBE_SYMBOL(kgdb_reenter_check); static void dbg_touch_watchdogs(void) { @@ -567,6 +578,7 @@ static void dbg_touch_watchdogs(void) clocksource_touch_watchdog(); rcu_cpu_stall_reset(); } +NOKPROBE_SYMBOL(dbg_touch_watchdogs); static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs, int exception_state) @@ -798,6 +810,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs, return kgdb_info[cpu].ret_state; } +NOKPROBE_SYMBOL(kgdb_cpu_enter); /* * kgdb_handle_exception() - main entry point from a kernel exception @@ -842,6 +855,7 @@ kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs) arch_kgdb_ops.enable_nmi(1); return ret; } +NOKPROBE_SYMBOL(kgdb_handle_exception); /* * GDB places a breakpoint at this function to know dynamically loaded objects. @@ -876,6 +890,7 @@ int kgdb_nmicallback(int cpu, void *regs) #endif return 1; } +NOKPROBE_SYMBOL(kgdb_nmicallback); int kgdb_nmicallin(int cpu, int trapnr, void *regs, int err_code, atomic_t *send_ready) @@ -901,6 +916,7 @@ int kgdb_nmicallin(int cpu, int trapnr, void *regs, int err_code, #endif return 1; } +NOKPROBE_SYMBOL(kgdb_nmicallin); static void kgdb_console_write(struct console *co, const char *s, unsigned count)