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 F3AD3EB64DD for ; Tue, 25 Jul 2023 06:15:24 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 62D066B007B; Tue, 25 Jul 2023 02:15:24 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5D7458E0002; Tue, 25 Jul 2023 02:15:24 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4299B6B007E; Tue, 25 Jul 2023 02:15:24 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 345B76B007B for ; Tue, 25 Jul 2023 02:15:24 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id F3E891C9C33 for ; Tue, 25 Jul 2023 06:15:23 +0000 (UTC) X-FDA: 81049122126.30.19415D4 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) by imf18.hostedemail.com (Postfix) with ESMTP id CCD8F1C000F for ; Tue, 25 Jul 2023 06:15:20 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=none; spf=pass (imf18.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=1690265722; 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=Zt1iNttuBXY1BSNtMsh+aChBU07iLpi+OG55pqc1lzQ=; b=fta5nXgS5V1tF5hLNnSvBVlnXSF/LuC1N/PunKUBR+TIQZCZGlhzGAY3npkt0zEueoCbCS nzNa3NAOetIPnMEQ7pjYQkeVptc2XsS3+e/aClg268o1Lw1Y5dbYslAAMcdRf9YYd6QeuD wPU2S5apWwpOKuzCZAEHmrunWN9ZwCE= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690265722; a=rsa-sha256; cv=none; b=TgG28o3nde+f4jEVwBtK+QJsng968BygWaGUxq1vaNGbKdB+Vs+mV3UloADc4tPpFA+Meg sOgM//flLr3yr0m9FCi27U4M6znwjephzsNdeDFTbKEePw2EgUpWyxQ9f+9xOcTQTxGSDz U4+/+xjJWaIQSdmoBQANgzJMDIZ+FWY= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=none; spf=pass (imf18.hostedemail.com: domain of lienze@kylinos.cn designates 124.126.103.232 as permitted sender) smtp.mailfrom=lienze@kylinos.cn; dmarc=none X-UUID: 900e072e26d147c683372e81b498ccb9-20230725 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.28,REQID:100611cf-fe0a-44aa-acb6-86579ba34183,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:100611cf-fe0a-44aa-acb6-86579ba34183,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:1d3b7fa0-0933-4333-8d4f-6c3c53ebd55b,B ulkID:230725141514IM3WVZYC,BulkQuantity:0,Recheck:0,SF:44|38|24|17|19|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: 900e072e26d147c683372e81b498ccb9-20230725 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 1616501915; Tue, 25 Jul 2023 14:15:11 +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 Subject: [PATCH 2/4 v2] LoongArch: Get stack without NMI when providing regs parameter Date: Tue, 25 Jul 2023 14:14:49 +0800 Message-Id: <20230725061451.1231480-3-lienze@kylinos.cn> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230725061451.1231480-1-lienze@kylinos.cn> References: <20230725061451.1231480-1-lienze@kylinos.cn> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: ioxhrfc9iw6eecaeztemjw4wyemt9154 X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: CCD8F1C000F X-Rspam-User: X-HE-Tag: 1690265720-750866 X-HE-Meta: U2FsdGVkX18mxe430Eo3f+/dYm3Bww9Xg3ylEu37DiBTKO+AJ71OWNv8HffAPmFRMy4UDGhAhXj/1R+ufyI+IB7O/PXA8szVpFpbIY6zbkl3+F8HqAJTxMnH0aRH4LaulLB+vBlOKhlf+SSRTxaNrw6NZFsAKjFxMyujk2lVaC01kzH+DFyw7qBHw42vT6pdjEV63R40yrCHNpD7U/8B3aNryeloR3NH+xUl5vrp2fhaTIhKfKCuLLTNA/ZFj+JHsnho75CKi0/D0vF4ejfcK4XjK28dhmBK9pUtn+HRip945Plf/hJ3wmEiNoa3KHwioby0T95dkAvyaNofj/REfLAVkSfxhrUx2kBjyqs3epKGG5DgRFayBJkwUtQ4tYeExdwP7ejiDc0R/KgPYlXleHCrXTg8ugxrhzXAtIuZsVWz46MUQuBFoOe3kKhD6s5If91H+AVveI+o3MF3UVpVEXSnKCAWsOZFmO/bcqwyUWmGyr77rUCMSSkZsmEISFqEsBRKIVWFc/H8pWqnD4npf7PgzwSb6ZnYynwoWhRNUBja0HiMRpMpD6uVIrq30Rckh6OLbcLO13y25lfiDVzkkJZOzzkIKf1/+1Hl3jutzHkG9Oh6s2Fssrq6IRGSQyvY3PcrZhgQ9lHP6xEq/0L2l4KDPF0vwpzeL5vPdURajlLcQg7SOmzKCVoSKeZsHMn/7xtiHIbD4vv74RMpg5ebxZDwUBYm0CYMLQzj5g9kZWG8Pcf+3OC7SnV24UvPHwtPTFurC5DoIH0BphOhpSTwrGI5z1zLOde4Y8mMQnmyvW6i6er/jYElERh65zT5Sj+l9Xtz/bNheJzrT2jEWNp5XIch48v18RG8Mt4Bg4WJNRFzTZVsYMsDaK0LsmTaveXj9nDMpwnALsX0/j+fxAspEa2Utjkxyx/LHVBpwdCEWzFcLkGwwA115Cf1wDAt7dSofDUPpC49fjyVLLSrKKg WTzu5Clo hz7da0RmKkDihlZgD0/u4ca5QMKqrPeTSlvpR 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 Signed-off-by: Enze Li --- arch/loongarch/kernel/stacktrace.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/arch/loongarch/kernel/stacktrace.c b/arch/loongarch/kernel/stacktrace.c index 2463d2fea21f..9dab30ae68ec 100644 --- a/arch/loongarch/kernel/stacktrace.c +++ b/arch/loongarch/kernel/stacktrace.c @@ -18,16 +18,24 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, struct pt_regs dummyregs; struct unwind_state state; - regs = &dummyregs; - if (task == current) { - regs->regs[3] = (unsigned long)__builtin_frame_address(0); - regs->csr_era = (unsigned long)__builtin_return_address(0); + if (regs) + memcpy(&dummyregs, regs, sizeof(*regs)); + else { + dummyregs.regs[3] = (unsigned long)__builtin_frame_address(0); + dummyregs.csr_era = (unsigned long)__builtin_return_address(0); + } } else { - regs->regs[3] = thread_saved_fp(task); - regs->csr_era = thread_saved_ra(task); + if (regs) + memcpy(&dummyregs, regs, sizeof(*regs)); + else { + dummyregs.regs[3] = thread_saved_fp(task); + dummyregs.csr_era = thread_saved_ra(task); + } } + regs = &dummyregs; + regs->regs[1] = 0; for (unwind_start(&state, task, regs); !unwind_done(&state) && !unwind_error(&state); unwind_next_frame(&state)) { -- 2.34.1