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 8455DC27C4F for ; Tue, 18 Jun 2024 15:12:50 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 142508D002E; Tue, 18 Jun 2024 11:12:50 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 091DF8D002C; Tue, 18 Jun 2024 11:12:50 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E758F8D002E; Tue, 18 Jun 2024 11:12:49 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id C338E8D002C for ; Tue, 18 Jun 2024 11:12:49 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id F4151A184C for ; Tue, 18 Jun 2024 14:59:44 +0000 (UTC) X-FDA: 82244318688.24.33FA9E2 Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf27.hostedemail.com (Postfix) with ESMTP id 6ECE440021 for ; Tue, 18 Jun 2024 14:59:42 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Aeg1qpJz; spf=pass (imf27.hostedemail.com: domain of ardb@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=ardb@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1718722780; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=pmYCW+qERM0osEqv+DitOV5LGYqzUayq5Gm0RtS49YI=; b=nZdeuKrjbtK9aVsjBgvRW5Nt1WhVvDvmsxCwX4GHpy+lU+DcLWINKf8QKzbeyPC6mkqoeD ga8OQ5hJL38vz0oe5olsK6ZgCRWcB/4Qi2G2epQUPpkLIM2jKZQs4yu2OLBttj1R9+wote aVkUlJYebG3K8xoswA3KQHWz+JoyrXw= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Aeg1qpJz; spf=pass (imf27.hostedemail.com: domain of ardb@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=ardb@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1718722780; a=rsa-sha256; cv=none; b=SdXJrDgSoSJgQFlfvRMgiCrRRg/KB/xzMIlvPJIJ0UDTqpB3PD1VRPTLUSBgbqx3r24Wvm b41pplhEIUipO1/BCnQlDcmAUU+o6CryImT+AAIHtjbJ0Xf0j1WHWoia0kN+wrKU4teRZe cRxTv6X+EU7Do+qD1k1rqNNdOrUrUxk= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 51409CE1B9D for ; Tue, 18 Jun 2024 14:59:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AC93AC4AF53 for ; Tue, 18 Jun 2024 14:59:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1718722776; bh=9VFvLJ5D2bcVwMlb/aO0woCroDo49q//nKnY5oo0Vus=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=Aeg1qpJzbdiwhk0HyabcDzTXwO9AQCbIcPBHS7QUTNJkXRqIfCgR1bVmJoAwJqIqW aA/mfHHKLn6NsqkPepHxDC+fxhid4DKHAx7TUdE+3ULPCiG1Dnpj0ZazWAGetk+T06 Fpqb//mvvp6ioyECDSMv5z7hfiSYl75o2wb5jFEWqnnveBNbsHyvSshFRZp3Faw1RS I1nQT5+/0ON4TQ6ZRIi6vEVB78OXNSL8/Al7ICpwsSi6AGC4axkLIATerU0pHF4KEy rePk7ffEiv9dxbrVEHw+Brt4hhINevCU3yqR8++MMgH6r7KixVGf+RFAoK0wZFiJ9J g+yyDQpcEPjaw== Received: by mail-lj1-f170.google.com with SMTP id 38308e7fff4ca-2ebdfe26217so52406021fa.2 for ; Tue, 18 Jun 2024 07:59:36 -0700 (PDT) X-Gm-Message-State: AOJu0YyPeeTrMkAQRY4llVxGA0IveYmMX22OEBavrQpfGNdTB5CyBcZF 7bZnqSPz0hBp4E1AzQPxS/epghNWSGT0kslgEFbOX1Jo8z9ZidhqEZrEYsYYKWR70THJr3pPss0 4FU1kP7fKGZNWn3sbhmQX6RFJyTI= X-Google-Smtp-Source: AGHT+IFmKDr0UJF/vB46P5FDkAXrOS2m32z+9GBnyCDYe1Bfh6hX7g0qK5mLLgIhmZTL1cK7ajhZR9bGd8nlSWfuLOw= X-Received: by 2002:a2e:9b93:0:b0:2eb:f5ec:5acc with SMTP id 38308e7fff4ca-2ec3cec5416mr669361fa.25.1718722774799; Tue, 18 Jun 2024 07:59:34 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Ard Biesheuvel Date: Tue, 18 Jun 2024 16:59:22 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v4 2/5] arm64: non leaf ptdump support To: Maxwell Bland Cc: linux-mm@kvack.org, Catalin Marinas , Will Deacon , Jonathan Corbet , Andrew Morton , Mark Rutland , Christophe Leroy , Alexandre Ghiti , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 6ECE440021 X-Stat-Signature: 9sp8buig7nx9be5iwn5ewaumdwzsgyk5 X-HE-Tag: 1718722782-894584 X-HE-Meta: U2FsdGVkX18FUc5pNHU9CoEih6qJa1TqvQeyOp0dTllmPU3rkhyMbjlwa1amZldFdSbUEDsxtoAn0UW9qtN6wa6iQzFMj8BOzuP1bbwjj39lZ5D/9aMM5YD9Q/lEhWayP2Iz0H11cGKcfa6cEwsrFs/omBsU2qN2ERXgJYGCpbMAF4vhuC/UvlHLb4FxraU1cdCeCFtrD3y5mV46FJjO6blXQBmJtn9jL5CJV/wvka6j4yID1w5uUuiYHFQFsI4LwXBsnBcjnXZAskxt+A8UbCiD3Ak3s+p0Fgg0m3faoJ1m+Vh0dvFZtGqx1ttQHs2qxV5GjMPpzX+3l3/yPNWPHuQt+evjr/Z58Rl47QZzKExRig99EqGww1yte41uz8YlufPICnndSmN+ERyK4Y08r/rs/J2WUVJXl/+yMYPlKirno5bQdHWbJISZBQyqMXf4JjoXPKV8okrPhKwUdaI0gMpJBYrVnEEFg/zBAa8rvZLvQeX44dNiXY0eFuxlB/BHRItdU6m+hDgGUE7If+dBKnsdy4QQuqoxdEvq7RPauYsq61Xr2IYbwZa03RLPmudGqAvj91aR6vOCwFgBGEugUYJOQJhggVbanVZu7cCrdnu8U/OHDGSjeTzpad3QgNyzfGj5uXBggAuzVMQQ2TD+XjaFZ2xHGYXElbQ+HpUCXRsnA2UWvXTNhA8IrdalmidjZWNEb5YxhUrd3JzP9ia/dIjEl+J0CCtgVYy53TJCoylpcPGo2D1EBPnvRLOyR11PjMvX5c1VgnluMH7vEA7iEJbGxJbFERoCAE2k7Y4bTnqt2WYMe228KzrEU+1j8nzYKGoqg3y4yGbFCjXp6y89bZ8Sm8KG0bwbQYVz/r/q77W6UXJT4kyo5fekYuR+ra8mqu+46v8/UosjHbr8/b+xr5bp+KR3/MpCLWg44rDTfSk4nzYodYhiiUtN/ydlp5cIYa0y/9ZcMfEtU2OpCvS osYR+gH6 Kma01XKlv8KRLb0Hk5YGmHdpFRYENsvF49ykeAjV84KUEljxv0X+KjZZLqQrLeRSlJaG4hfyOuD+HhQiOGYZh0KmT0FsxEUW4jyee6SsTE2pAn40XCb03UB9fPgAtCPfkje3jD9HOnAIXchpjDOKjgpieejqcMVxPISuHaSan04QQ8ZtWHpsyyqfT1h2SHv2qVWmreN0rAIfjEBBI/7aczHY0PMoov3eII4oTY0z+8IKxu+a1i3DTZufkGUWD2yqjv/HalDf2dj7zNts1ytRtesAfVpC3DvB13SrjBFIfG6OLUx39JfvNlRtLCQ== 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: List-Subscribe: List-Unsubscribe: On Tue, 18 Jun 2024 at 16:40, Maxwell Bland wrote: > > Separate the pte_bits used in ptdump from pxd_bits used by pmd, p4d, > pud, and pgd descriptors, thereby adding support for printing key > intermediate directory protection bits, such as PXNTable, and enable the > associated support Kconfig option. > > Signed-off-by: Maxwell Bland > --- > arch/arm64/Kconfig | 1 + > arch/arm64/mm/ptdump.c | 140 ++++++++++++++++++++++++++++++++++++----- > 2 files changed, 125 insertions(+), 16 deletions(-) > > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig > index 5d91259ee7b5..f4c3290160db 100644 > --- a/arch/arm64/Kconfig > +++ b/arch/arm64/Kconfig > @@ -98,6 +98,7 @@ config ARM64 > select ARCH_SUPPORTS_NUMA_BALANCING > select ARCH_SUPPORTS_PAGE_TABLE_CHECK > select ARCH_SUPPORTS_PER_VMA_LOCK > + select ARCH_SUPPORTS_NON_LEAF_PTDUMP > select ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH > select ARCH_WANT_COMPAT_IPC_PARSE_VERSION if COMPAT > select ARCH_WANT_DEFAULT_BPF_JIT > diff --git a/arch/arm64/mm/ptdump.c b/arch/arm64/mm/ptdump.c > index 6986827e0d64..8f0b459c13ed 100644 > --- a/arch/arm64/mm/ptdump.c > +++ b/arch/arm64/mm/ptdump.c > @@ -24,6 +24,7 @@ > #include > #include > #include > +#include > > > #define pt_dump_seq_printf(m, fmt, args...) \ > @@ -105,11 +106,6 @@ static const struct prot_bits pte_bits[] = { > .val = PTE_CONT, > .set = "CON", > .clear = " ", > - }, { > - .mask = PTE_TABLE_BIT, > - .val = PTE_TABLE_BIT, > - .set = " ", > - .clear = "BLK", > }, { > .mask = PTE_UXN, > .val = PTE_UXN, > @@ -143,34 +139,129 @@ static const struct prot_bits pte_bits[] = { > } > }; > > +static const struct prot_bits pxd_bits[] = { This table will need to distinguish between table and block entries. In your sample output, I see 2M PMD TBL RW x UXNTbl MEM/NORMAL for a table entry, which includes a memory type and access permissions based on descriptor fields that are not used for table descriptors. Some other attributes listed below are equally inapplicable to table entries, but happen to be 0x0 so they don't appear in the output, but they would if the IGNORED bit in the descriptor happened to be set. So I suspect that the distinction pte_bits <-> pxd_bits is not so useful here. It would be better to have tbl_bits[], with pointers to it in the pg_level array, where the PTE level one is set to NULL. > + { > + .mask = PMD_SECT_VALID, > + .val = PMD_SECT_VALID, > + .set = " ", > + .clear = "F", > + }, { > + .mask = PMD_TABLE_BIT, > + .val = PMD_TABLE_BIT, > + .set = "TBL", > + .clear = "BLK", > + }, { > + .mask = PMD_SECT_USER, > + .val = PMD_SECT_USER, > + .set = "USR", > + .clear = " ", > + }, { > + .mask = PMD_SECT_RDONLY, > + .val = PMD_SECT_RDONLY, > + .set = "ro", > + .clear = "RW", > + }, { > + .mask = PMD_SECT_S, > + .val = PMD_SECT_S, > + .set = "SHD", > + .clear = " ", > + }, { > + .mask = PMD_SECT_AF, > + .val = PMD_SECT_AF, > + .set = "AF", > + .clear = " ", > + }, { > + .mask = PMD_SECT_NG, > + .val = PMD_SECT_NG, > + .set = "NG", > + .clear = " ", > + }, { > + .mask = PMD_SECT_CONT, > + .val = PMD_SECT_CONT, > + .set = "CON", > + .clear = " ", > + }, { > + .mask = PMD_SECT_PXN, > + .val = PMD_SECT_PXN, > + .set = "NX", > + .clear = "x ", > + }, { > + .mask = PMD_SECT_UXN, > + .val = PMD_SECT_UXN, > + .set = "UXN", > + .clear = " ", > + }, { > + .mask = PMD_TABLE_PXN, > + .val = PMD_TABLE_PXN, > + .set = "NXTbl", > + .clear = " ", > + }, { > + .mask = PMD_TABLE_UXN, > + .val = PMD_TABLE_UXN, > + .set = "UXNTbl", > + .clear = " ", > + }, { > + .mask = PTE_GP, > + .val = PTE_GP, > + .set = "GP", > + .clear = " ", > + }, { > + .mask = PMD_ATTRINDX_MASK, > + .val = PMD_ATTRINDX(MT_DEVICE_nGnRnE), > + .set = "DEVICE/nGnRnE", > + }, { > + .mask = PMD_ATTRINDX_MASK, > + .val = PMD_ATTRINDX(MT_DEVICE_nGnRE), > + .set = "DEVICE/nGnRE", > + }, { > + .mask = PMD_ATTRINDX_MASK, > + .val = PMD_ATTRINDX(MT_NORMAL_NC), > + .set = "MEM/NORMAL-NC", > + }, { > + .mask = PMD_ATTRINDX_MASK, > + .val = PMD_ATTRINDX(MT_NORMAL), > + .set = "MEM/NORMAL", > + }, { > + .mask = PMD_ATTRINDX_MASK, > + .val = PMD_ATTRINDX(MT_NORMAL_TAGGED), > + .set = "MEM/NORMAL-TAGGED", > + } > +}; > + > struct pg_level { > const struct prot_bits *bits; > char name[4]; > int num; > u64 mask; > + unsigned long size; > }; > > static struct pg_level pg_level[] __ro_after_init = { > { /* pgd */ > .name = "PGD", > - .bits = pte_bits, > - .num = ARRAY_SIZE(pte_bits), > + .bits = pxd_bits, > + .num = ARRAY_SIZE(pxd_bits), > + .size = PGDIR_SIZE, > }, { /* p4d */ > .name = "P4D", > - .bits = pte_bits, > - .num = ARRAY_SIZE(pte_bits), > + .bits = pxd_bits, > + .num = ARRAY_SIZE(pxd_bits), > + .size = P4D_SIZE, > }, { /* pud */ > .name = "PUD", > - .bits = pte_bits, > - .num = ARRAY_SIZE(pte_bits), > + .bits = pxd_bits, > + .num = ARRAY_SIZE(pxd_bits), > + .size = PUD_SIZE, > }, { /* pmd */ > .name = "PMD", > - .bits = pte_bits, > - .num = ARRAY_SIZE(pte_bits), > + .bits = pxd_bits, > + .num = ARRAY_SIZE(pxd_bits), > + .size = PMD_SIZE, > }, { /* pte */ > .name = "PTE", > .bits = pte_bits, > .num = ARRAY_SIZE(pte_bits), > + .size = PAGE_SIZE > }, > }; > > @@ -251,10 +342,27 @@ static void note_page(struct ptdump_state *pt_st, unsigned long addr, int level, > note_prot_wx(st, addr); > } > > - pt_dump_seq_printf(st->seq, "0x%016lx-0x%016lx ", > - st->start_address, addr); > + /* > + * Non-leaf entries use a fixed size for their range > + * specification, whereas leaf entries are grouped by > + * attributes and may not have a range larger than the type > + * specifier. > + */ > + if (st->start_address == addr) { > + if (check_add_overflow(addr, pg_level[st->level].size, > + &delta)) > + delta = ULONG_MAX - addr + 1; > + else > + delta = pg_level[st->level].size; > + pt_dump_seq_printf(st->seq, "0x%016lx-0x%016lx ", > + addr, addr + delta); > + } else { > + delta = (addr - st->start_address); > + pt_dump_seq_printf(st->seq, "0x%016lx-0x%016lx ", > + st->start_address, addr); > + } > > - delta = (addr - st->start_address) >> 10; > + delta >>= 10; > while (!(delta & 1023) && unit[1]) { > delta >>= 10; > unit++; > -- > 2.39.2 > >