From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id A2C38C04E69 for ; Tue, 1 Aug 2023 02:58:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CB04F2800D0; Mon, 31 Jul 2023 22:58:53 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C37B62800C8; Mon, 31 Jul 2023 22:58:53 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A3E032800D1; Mon, 31 Jul 2023 22:58:53 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 764DE2800C8 for ; Mon, 31 Jul 2023 22:58:53 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 3EFEE40164 for ; Tue, 1 Aug 2023 02:58:53 +0000 (UTC) X-FDA: 81074028546.25.8B0B43D Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) by imf22.hostedemail.com (Postfix) with ESMTP id C599CC000D for ; Tue, 1 Aug 2023 02:58:50 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=none; spf=pass (imf22.hostedemail.com: domain of lienze@kylinos.cn designates 124.126.103.232 as permitted sender) smtp.mailfrom=lienze@kylinos.cn; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1690858731; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HbmjEkCG/Gluq3NmseIYaINXkJ0ULNrvz36rHv07DD4=; b=FRetOfqPWBOmeB2azft0wfqQP8/lQcbs8LxEaP/xry31YDEB+RyACrVDpaayr3aq0viyC2 ED0bwe1Le3DM5ed5JsyYzLH4Qrh29Q9jUoSsepbMjTV02cPCkrEhKKvf8lhA01Y0jUga+p uxtV90CHpfhRvDr2g7TaBE/XhSEMqOQ= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690858731; a=rsa-sha256; cv=none; b=AlsWRostWrykt9qrmUVdUcBK+B5NsFdLjWxxF+KujstQfsyMRTBWipAT6N7xccYpYSmqxv 4b93e1viKI9gihuzoFElvRt77zTNJHZs5eDNuiIvwQpbTafT7IkM0V0LO93BuY6TgYg+FK qBkJN/MuV4MKPX+3OyvUiryYQ1VKZlQ= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=none; spf=pass (imf22.hostedemail.com: domain of lienze@kylinos.cn designates 124.126.103.232 as permitted sender) smtp.mailfrom=lienze@kylinos.cn; dmarc=none X-UUID: 41ffdf2160a04e229baabc2604a40ff5-20230801 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.28,REQID:0ce1f64f-6f9f-47bd-b73a-093f8ba3474a,IP:15, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:-15,FILE:0,BULK:0,RULE:Release_Ham,ACTI ON:release,TS:0 X-CID-INFO: VERSION:1.1.28,REQID:0ce1f64f-6f9f-47bd-b73a-093f8ba3474a,IP:15,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:-15,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:0 X-CID-META: VersionHash:176cd25,CLOUDID:2dbeab42-d291-4e62-b539-43d7d78362ba,B ulkID:230801105842XBL3QNGZ,BulkQuantity:0,Recheck:0,SF:17|19|44|38|24|102, TC:nil,Content:0,EDM:-3,IP:-2,URL:0,File:nil,Bulk:nil,QS:nil,BEC:nil,COL:0 ,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0 X-CID-BVR: 0 X-CID-BAS: 0,_,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR,TF_CID_SPAM_FAS,TF_CID_SPAM_FSD,TF_CID_SPAM_FSI X-UUID: 41ffdf2160a04e229baabc2604a40ff5-20230801 X-User: lienze@kylinos.cn Received: from ubuntu.. [(39.156.73.12)] by mailgw (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 138458878; Tue, 01 Aug 2023 10:58:42 +0800 From: Enze Li To: chenhuacai@kernel.org, kernel@xen0n.name, loongarch@lists.linux.dev, glider@google.com, elver@google.com, akpm@linux-foundation.org, kasan-dev@googlegroups.com, linux-mm@kvack.org Cc: zhangqing@loongson.cn, yangtiezhu@loongson.cn, dvyukov@google.com, Enze Li , Jinyang He Subject: [PATCH 3/4 v3] LoongArch: Get stack without NMI when providing regs parameter Date: Tue, 1 Aug 2023 10:58:14 +0800 Message-Id: <20230801025815.2436293-4-lienze@kylinos.cn> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230801025815.2436293-1-lienze@kylinos.cn> References: <20230801025815.2436293-1-lienze@kylinos.cn> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: gjnh1a3tk7ztq4n3joxaed3c1t8tnkc9 X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: C599CC000D X-Rspam-User: X-HE-Tag: 1690858730-876488 X-HE-Meta: U2FsdGVkX1/S8Xh2OEzwRfzHNosSHeeVytmz1mvZjmrxY5wQ6Pv9uiHwu/h+zWDX/5aStO6CChCZqTwXMPuz4GPqKIFXEtnNKHHxtUa2tZ88RhU+FtPI7Xo2ftUcHh0kT8xr2E+JK7BL3n3vTGEbTaL1GN159jlMO7FKgbQyheFEluNLj/lqSSpdciFhkT1GaMlUTIItpy7D16yXw/YGTrz3IPIvBpCKoDOvxQDrKWLrz7zW00XoNQWFi8QU+g7f1t/RGnbhYVEhfx9b2ebO4Qkq6OfPXJFNaaT89yxnnXtiZaO90eOLsM/DnVWM5rXYdwmXgGa6M2u0mQZlN5/FfA35qTBS8gBlM/hj+AkW6kdj7Y8PxLZIX3ND7J/hEbt5Rl243UDXoWn6oLFcOuj+ZXy+ZjdbqxOO+cI7L7+fMNXcqT6yWmbaWDmI7Bk836l1KJzZZGZIPBZMuK+N9780qT26NaCIXrMQcRdvu9B0B4ySihAawGWZTGwd5KWPQmcJH1Dr5NVAcycS9Tmd9+WDr2WFssryojUvXMIUGRWwiTpMYKXba4bUmwAl7nbQIEWQbTQlGIFOELsl0JR3IW6sm0ldy53rpt8nNUIZJas1UppYX0fijXSRkxLwxDCs/I9ptQBWl0KlcRTn8dZw4OSZtL8Y/q6YMUIpMKoh0snumABOEjDYxsH6mJnRIFMMV9TVqZFfJAbrB6NIitbiNBDs75vCGqTkf3KDsTYr9hLtKpMyDYKLzBCQUPjx1WxIh0BZz7qlR1WcTmMwoc8dVDmfsaIdWqE+PxOOO1FqRQcxVtlEUTVApK2dz4fFisz33CdkX83rLw5bEKqXJ9wZ6K0pw9iMc6cHuwl0RXK7Umbl8ciYH2q1AhEIavgHHZafFsqlCs6PP+UuDQmiF92fYRJRy/W6zMlvnmupWGnQm+PO54hm+LOnWMNVH//DA9WL0ivQ0lZs/RJL15GuF4DliQk khYAs7R7 9tavrPsVbo6GAvZ7iBVw5SzaFnmb9xV5QKu8k X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Currently, arch_stack_walk() can only get the full stack information including NMI. This is because the implementation of arch_stack_walk() is forced to ignore the information passed by the regs parameter and use the current stack information instead. For some detection systems like KFENCE, only partial stack information is needed. In particular, the stack frame where the interrupt occurred. To support KFENCE, this patch modifies the implementation of the arch_stack_walk() function so that if this function is called with the regs argument passed, it retains all the stack information in regs and uses it to provide accurate information. Before the patch applied, I get, [ 1.531195 ] ================================================================== [ 1.531442 ] BUG: KFENCE: out-of-bounds read in stack_trace_save_regs+0x48/0x6c [ 1.531442 ] [ 1.531900 ] Out-of-bounds read at 0xffff800012267fff (1B left of kfence-#12): [ 1.532046 ] stack_trace_save_regs+0x48/0x6c [ 1.532169 ] kfence_report_error+0xa4/0x528 [ 1.532276 ] kfence_handle_page_fault+0x124/0x270 [ 1.532388 ] no_context+0x50/0x94 [ 1.532453 ] do_page_fault+0x1a8/0x36c [ 1.532524 ] tlb_do_page_fault_0+0x118/0x1b4 [ 1.532623 ] test_out_of_bounds_read+0xa0/0x1d8 [ 1.532745 ] kunit_generic_run_threadfn_adapter+0x1c/0x28 [ 1.532854 ] kthread+0x124/0x130 [ 1.532922 ] ret_from_kernel_thread+0xc/0xa4 With this patch applied, I get the correct stack information. [ 1.320220 ] ================================================================== [ 1.320401 ] BUG: KFENCE: out-of-bounds read in test_out_of_bounds_read+0xa8/0x1d8 [ 1.320401 ] [ 1.320898 ] Out-of-bounds read at 0xffff800012257fff (1B left of kfence-#10): [ 1.321134 ] test_out_of_bounds_read+0xa8/0x1d8 [ 1.321264 ] kunit_generic_run_threadfn_adapter+0x1c/0x28 [ 1.321392 ] kthread+0x124/0x130 [ 1.321459 ] ret_from_kernel_thread+0xc/0xa4 Co-authored-by: Jinyang He Signed-off-by: Enze Li --- arch/loongarch/kernel/stacktrace.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/arch/loongarch/kernel/stacktrace.c b/arch/loongarch/kernel/stacktrace.c index 2463d2fea21f..92270f14db94 100644 --- a/arch/loongarch/kernel/stacktrace.c +++ b/arch/loongarch/kernel/stacktrace.c @@ -18,17 +18,19 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, struct pt_regs dummyregs; struct unwind_state state; - regs = &dummyregs; + if (!regs) { + regs = &dummyregs; - if (task == current) { - regs->regs[3] = (unsigned long)__builtin_frame_address(0); - regs->csr_era = (unsigned long)__builtin_return_address(0); - } else { - regs->regs[3] = thread_saved_fp(task); - regs->csr_era = thread_saved_ra(task); + if (task == current) { + regs->regs[3] = (unsigned long)__builtin_frame_address(0); + regs->csr_era = (unsigned long)__builtin_return_address(0); + } else { + regs->regs[3] = thread_saved_fp(task); + regs->csr_era = thread_saved_ra(task); + } + regs->regs[1] = 0; } - regs->regs[1] = 0; for (unwind_start(&state, task, regs); !unwind_done(&state) && !unwind_error(&state); unwind_next_frame(&state)) { addr = unwind_get_return_address(&state); -- 2.34.1