From nobody Mon May 11 00:45:42 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B2884C433EF for ; Wed, 20 Apr 2022 07:01:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1359553AbiDTHEV (ORCPT ); Wed, 20 Apr 2022 03:04:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51032 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1359556AbiDTHEQ (ORCPT ); Wed, 20 Apr 2022 03:04:16 -0400 Received: from nksmu.kylinos.cn (mailgw.kylinos.cn [123.150.8.42]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EE6C039160 for ; Wed, 20 Apr 2022 00:01:26 -0700 (PDT) X-UUID: 69e668de44fb4f439643a0331dc566d8-20220420 X-CPASD-INFO: 63b831e30fb54d35af0f6d9a4ce594fa@f4OcWGBjk2NchqSBg6d-b4GXYJZnkFm wdp2FZWdkkoGVhH5xTWJsXVKBfG5QZWNdYVN_eGpQY19gZFB5i3-XblBgXoZgUZB3hXWcWGNflQ== X-CLOUD-ID: 63b831e30fb54d35af0f6d9a4ce594fa X-CPASD-SUMMARY: SIP:-1,APTIP:-2.0,KEY:0.0,FROMBLOCK:1,OB:0.0,URL:-5,TVAL:186. 0,ESV:0.0,ECOM:-5.0,ML:0.0,FD:1.0,CUTS:317.0,IP:-2.0,MAL:-5.0,PHF:-5.0,PHC:-5 .0,SPF:4.0,EDMS:-5,IPLABEL:4480.0,FROMTO:0,AD:0,FFOB:0.0,CFOB:0.0,SPC:0,SIG:- 5,AUF:1,DUF:37701,ACD:259,DCD:361,SL:0,EISP:0,AG:0,CFC:0.168,CFSR:0.106,UAT:0 ,RAF:0,IMG:-5.0,DFA:0,DTA:0,IBL:-2.0,ADI:-5,SBL:0,REDM:0,REIP:0,ESB:0,ATTNUM: 0,EAF:0,CID:-5.0,VERSION:2.3.17 X-CPASD-ID: 69e668de44fb4f439643a0331dc566d8-20220420 X-CPASD-BLOCK: 1001 X-CPASD-STAGE: 1 X-UUID: 69e668de44fb4f439643a0331dc566d8-20220420 X-User: sunliming@kylinos.cn Received: from localhost.localdomain [(116.128.244.169)] by nksmu.kylinos.cn (envelope-from ) (Generic MTA) with ESMTP id 1389788075; Wed, 20 Apr 2022 14:59:58 +0800 From: sunliming To: catalin.marinas@arm.com, will@kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, sunliming Subject: [PATCH] arm64,trace: Add page fault traceponits Date: Wed, 20 Apr 2022 15:01:09 +0800 Message-Id: <20220420070109.1010257-1-sunliming@kylinos.cn> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The arm64 architecture lacks some tracepoints support, this patch adds page fault tracepoints. The code and arch policy is mainly inherited from x86. Experimented on my centos8 virtual machine: dracut:/# echo 1 > /sys/kernel/tracing/events/exceptions/enable dracut:/# cat /sys/kernel/tracing/trace The results: sh-6098 [001] ..... 1186.024675: page_fault_user: addr=3D= 0xffffe153cc00 pc=3D0xffffa4117338 esr=3D0xffffe153cc00 cat-6126 [000] ..... 1186.024677: page_fault_kernel: addr= =3D0xffffa4323740 pc=3Dschedule_tail esr=3D0xffffa4323740 sh-6098 [001] ..... 1186.026085: page_fault_user: addr=3D= 0xaaaad23fae34 pc=3D0xaaaad231c0fc esr=3D0xaaaad23fae34 cat-6126 [000] ..... 1186.026106: page_fault_user: addr=3D= 0xffffa414565c pc=3D0xffffa414565c esr=3D0xffffa414565c cat-6126 [000] ..... 1186.026222: page_fault_user: addr=3D= 0xffffa4214e10 pc=3D0xffffa4145670 esr=3D0xffffa4214e10 cat-6126 [000] ..... 1186.026243: page_fault_user: addr=3D= 0xffffa420fd88 pc=3D0xffffa41456ac esr=3D0xffffa420fd88 cat-6126 [000] ..... 1186.026282: page_fault_user: addr=3D= 0xffffa4117338 pc=3D0xffffa4117338 esr=3D0xffffa4117338 cat-6126 [000] ..... 1186.026308: page_fault_user: addr=3D= 0xffffe153cc00 pc=3D0xffffa4117338 esr=3D0xffffe153cc00 cat-6126 [000] ..... 1186.026365: page_fault_user: addr=3D= 0xaaaad231bd84 pc=3D0xaaaad231bd84 esr=3D0xaaaad231bd84 sh-6098 [001] ..... 1186.026372: page_fault_user: addr=3D= 0xaaab04330098 pc=3D0xffffa411be68 esr=3D0xaaab04330098 cat-6126 [000] ..... 1186.026394: page_fault_user: addr=3D= 0xaaaad22ef420 pc=3D0xaaaad22ef420 esr=3D0xaaaad22ef420 cat-6126 [000] ..... 1186.026414: page_fault_user: addr=3D= 0xaaaad23ee9b0 pc=3D0xaaaad22ef424 esr=3D0xaaaad23ee9b0 cat-6126 [000] ..... 1186.026426: page_fault_user: addr=3D= 0xffffa40c3110 pc=3D0xffffa40c3110 esr=3D0xffffa40c3110 cat-6126 [000] ..... 1186.026450: page_fault_user: addr=3D= 0xaaaad22f23f8 pc=3D0xaaaad22f23f8 esr=3D0xaaaad22f23f8 cat-6126 [000] ..... 1186.026467: page_fault_user: addr=3D= 0xaaaad23f0030 pc=3D0xaaaad22f240c esr=3D0xaaaad23f0030 cat-6126 [000] ..... 1186.026481: page_fault_user: addr=3D= 0xaaaad23fae3c pc=3D0xaaaad231be40 esr=3D0xaaaad23fae3c cat-6126 [000] ..... 1186.026530: page_fault_user: addr=3D= 0xffffa40d63d8 pc=3D0xffffa40d63d8 esr=3D0xffffa40d63d8 cat-6126 [000] ..... 1186.026554: page_fault_user: addr=3D= 0xffffa431f650 pc=3D0xffffa40d63f8 esr=3D0xffffa431f650 sh-6098 [001] ..... 1186.026556: page_fault_user: addr=3D= 0xaaab04358d28 pc=3D0xffffa411be70 esr=3D0xaaab04358d28 cat-6126 [000] ..... 1186.026571: page_fault_user: addr=3D= 0xaaaad24015d0 pc=3D0xffffa40d640c esr=3D0xaaaad24015d0 cat-6126 [000] ..... 1186.026600: page_fault_user: addr=3D= 0xaaaad2332be8 pc=3D0xaaaad2332be8 esr=3D0xaaaad2332be8 cat-6126 [000] ..... 1186.026703: page_fault_user: addr=3D= 0xffffa416c438 pc=3D0xffffa416c438 esr=3D0xffffa416c438 sh-6098 [001] ..... 1186.026749: page_fault_user: addr=3D= 0xaaab04369d70 pc=3D0xffffa41193d8 esr=3D0xaaab04369d70 cat-6126 [000] ..... 1186.027610: page_fault_user: addr=3D= 0xaaaad2307754 pc=3D0xaaaad2307754 esr=3D0xaaaad2307754 cat-6126 [000] ..... 1186.027711: page_fault_user: addr=3D= 0xaaaad24014c4 pc=3D0xaaaad23310e4 esr=3D0xaaaad24014c4 cat-6126 [000] ..... 1186.027892: page_fault_user: addr=3D= 0xaaab04359a80 pc=3D0xaaaad23052f0 esr=3D0xaaab04359a80 cat-6126 [000] ..... 1186.027916: page_fault_user: addr=3D= 0xaaaad236cf80 pc=3D0xaaaad236cf80 esr=3D0xaaaad236cf80 Signed-off-by: sunliming --- arch/arm64/include/asm/trace/common.h | 12 +++++ arch/arm64/include/asm/trace/exceptions.h | 54 +++++++++++++++++++++++ arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/tracepoint.c | 24 ++++++++++ arch/arm64/mm/Makefile | 3 ++ arch/arm64/mm/fault.c | 19 ++++++++ 6 files changed, 113 insertions(+) create mode 100644 arch/arm64/include/asm/trace/common.h create mode 100644 arch/arm64/include/asm/trace/exceptions.h create mode 100644 arch/arm64/kernel/tracepoint.c diff --git a/arch/arm64/include/asm/trace/common.h b/arch/arm64/include/asm= /trace/common.h new file mode 100644 index 000000000000..f0f9bcdb74d9 --- /dev/null +++ b/arch/arm64/include/asm/trace/common.h @@ -0,0 +1,12 @@ +#ifndef _ASM_TRACE_COMMON_H +#define _ASM_TRACE_COMMON_H + +#ifdef CONFIG_TRACING +DECLARE_STATIC_KEY_FALSE(trace_pagefault_key); +#define trace_pagefault_enabled() \ + static_branch_unlikely(&trace_pagefault_key) +#else +static inline bool trace_pagefault_enabled(void) { return false; } +#endif + +#endif diff --git a/arch/arm64/include/asm/trace/exceptions.h b/arch/arm64/include= /asm/trace/exceptions.h new file mode 100644 index 000000000000..b0309aeca50b --- /dev/null +++ b/arch/arm64/include/asm/trace/exceptions.h @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM exceptions + +#if !defined(_TRACE_PAGE_FAULT_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_PAGE_FAULT_H + +#include +#include + +extern int trace_pagefault_reg(void); +extern void trace_pagefault_unreg(void); + +DECLARE_EVENT_CLASS(arm64_exceptions, + + TP_PROTO(unsigned long addr, struct pt_regs *regs, + unsigned int esr), + + TP_ARGS(addr, regs, esr), + + TP_STRUCT__entry( + __field(unsigned long, addr) + __field(unsigned long, pc) + __field(unsigned int, esr) + ), + + TP_fast_assign( + __entry->addr =3D addr; + __entry->pc =3D regs->pc; + __entry->esr =3D esr; + ), + + TP_printk("addr=3D%ps pc=3D%ps esr=3D0x%lx", + (void *)__entry->addr, (void *)__entry->pc, + __entry->addr)); + +#define DEFINE_PAGE_FAULT_EVENT(name) \ +DEFINE_EVENT_FN(arm64_exceptions, name, \ + TP_PROTO(unsigned long addr, struct pt_regs *regs, \ + unsigned int esr), \ + TP_ARGS(addr, regs, esr), \ + trace_pagefault_reg, trace_pagefault_unreg); + +DEFINE_PAGE_FAULT_EVENT(page_fault_user); +DEFINE_PAGE_FAULT_EVENT(page_fault_kernel); + +#undef TRACE_INCLUDE_PATH +#undef TRACE_INCLUDE_FILE +#define TRACE_INCLUDE_PATH . +#define TRACE_INCLUDE_FILE exceptions +#endif /* _TRACE_PAGE_FAULT_H */ + +/* This part must be outside protection */ +#include diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 986837d7ec82..538476d91894 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -74,6 +74,7 @@ obj-$(CONFIG_ARM64_PTR_AUTH) +=3D pointer_auth.o obj-$(CONFIG_ARM64_MTE) +=3D mte.o obj-y +=3D vdso-wrap.o obj-$(CONFIG_COMPAT_VDSO) +=3D vdso32-wrap.o +obj-$(CONFIG_TRACING) +=3D tracepoint.o =20 obj-y +=3D probes/ head-y :=3D head.o diff --git a/arch/arm64/kernel/tracepoint.c b/arch/arm64/kernel/tracepoint.c new file mode 100644 index 000000000000..ea36aa37a885 --- /dev/null +++ b/arch/arm64/kernel/tracepoint.c @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Code for supporting page fault tracepoints. + * + * + */ +#include +#include + +#include + +DEFINE_STATIC_KEY_FALSE(trace_pagefault_key); + +int trace_pagefault_reg(void) +{ + static_branch_inc(&trace_pagefault_key); + return 0; +} + +void trace_pagefault_unreg(void) +{ + static_branch_dec(&trace_pagefault_key); +} + diff --git a/arch/arm64/mm/Makefile b/arch/arm64/mm/Makefile index ff1e800ba7a1..62fef44062fa 100644 --- a/arch/arm64/mm/Makefile +++ b/arch/arm64/mm/Makefile @@ -1,4 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 + obj-y :=3D dma-mapping.o extable.o fault.o init.o \ cache.o copypage.o flush.o \ ioremap.o mmap.o pgd.o mmu.o \ @@ -12,5 +13,7 @@ obj-$(CONFIG_DEBUG_VIRTUAL) +=3D physaddr.o obj-$(CONFIG_ARM64_MTE) +=3D mteswap.o KASAN_SANITIZE_physaddr.o +=3D n =20 +CFLAGS_fault.o :=3D -I $(srctree)/$(src)/../include/asm/trace + obj-$(CONFIG_KASAN) +=3D kasan_init.o KASAN_SANITIZE_kasan_init.o :=3D n diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 77341b160aca..5898d18ee20c 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -42,6 +42,9 @@ #include #include =20 +#define CREATE_TRACE_POINTS +#include + struct fault_info { int (*fn)(unsigned long far, unsigned int esr, struct pt_regs *regs); @@ -515,6 +518,20 @@ static bool is_write_abort(unsigned int esr) return (esr & ESR_ELx_WNR) && !(esr & ESR_ELx_CM); } =20 +static __always_inline void +trace_page_fault_entries(struct pt_regs *regs, unsigned int esr, + unsigned long addr) +{ + if (!trace_pagefault_enabled()) + return; + + if (user_mode(regs)) + trace_page_fault_user(addr, regs, esr); + else + trace_page_fault_kernel(addr, regs, esr); +} + + static int __kprobes do_page_fault(unsigned long far, unsigned int esr, struct pt_regs *regs) { @@ -525,6 +542,8 @@ static int __kprobes do_page_fault(unsigned long far, u= nsigned int esr, unsigned int mm_flags =3D FAULT_FLAG_DEFAULT; unsigned long addr =3D untagged_addr(far); =20 + trace_page_fault_entries(regs, esr, addr); + if (kprobe_page_fault(regs, esr)) return 0; =20 --=20 2.25.1 No virus found Checked by Hillstone Network AntiVirus