Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp2370651pxb; Fri, 17 Sep 2021 08:19:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzSRMGpy6jxELGZkp570hKxi1WgaS36xHKCWhMu3ckYgrHZMsOJwR69q7OeVnrNOoy3S83O X-Received: by 2002:a05:6638:3813:: with SMTP id i19mr9348401jav.16.1631891961236; Fri, 17 Sep 2021 08:19:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631891961; cv=none; d=google.com; s=arc-20160816; b=AbYBpcUMhQ2zwAip1tIzNKsYrVj5UlKbRhwBzXBWybc9s6PMfS3Twy20JIWIbdWXHU 7AEPKSU6b6FVnJdI8DwKwt4OTzcz0brz4DDdShmK7iB8Bk7jv6doXpuoFy4q8KcSytkv MCeLdZ28XAepQAfDdljq5OvDK2HZwmU5fqquydvNDXVsZGL66unojl2iROMvs1j2GUXW hjBdRqFBCeKFnavl3JcMCQgUHuojqdxWxvV5/dJRpy/GEXIu2hq7OajBJQ95RFl7JPFM mHo9D6Zj6a0GKPpnQNiZd5gqJYB3u+sls5F+jvr5CUkZf4E4vGL6fnyDALFKm9Pu1mkI RnmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=5Z51VaqxxxwyMU1S11QUU9E8ODNROVnIxIhj7wIbyP8=; b=BGEZY5zFizrm2ZV5Jt3lCo5nomt3dDAO82AxLrCczbDz8/X2s9tuQ5TW2pjxssEubm X9oVhwia8s6uKNrLh/8FMGjux8XKZn+r8JTn7SIp9k78FGavG5u7tLRzxSZ8hJCE98P7 RtPHon09ixz6XLLgfvNm1PqnaSP/TFF/4/bmb5svKdECopabxOe/wBtIYwhiVWTjl8au FAho5ICiofWIiO1WpyV6sphczHnfZ8lnOGvblo/awndHSAgiv3qYl3qxAboYI2hKMlOV YP49+iBH/ZN1ZZMEQ5jAN1j4gL+R/K1fxpKnHBiVM/tlAc16TgAoHqJF2DYiyLgznhDS alAw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r4si6645040ilb.106.2021.09.17.08.19.04; Fri, 17 Sep 2021 08:19:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240888AbhIQOAH (ORCPT + 99 others); Fri, 17 Sep 2021 10:00:07 -0400 Received: from pegase2.c-s.fr ([93.17.235.10]:55551 "EHLO pegase2.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245694AbhIQN7J (ORCPT ); Fri, 17 Sep 2021 09:59:09 -0400 Received: from localhost (mailhub3.si.c-s.fr [172.26.127.67]) by localhost (Postfix) with ESMTP id 4H9wWV63PWz9sTL; Fri, 17 Sep 2021 15:57:42 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from pegase2.c-s.fr ([172.26.127.65]) by localhost (pegase2.c-s.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2Vvp1TjPwSN4; Fri, 17 Sep 2021 15:57:42 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase2.c-s.fr (Postfix) with ESMTP id 4H9wWV5Bb0z9sT4; Fri, 17 Sep 2021 15:57:42 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 9E7908B799; Fri, 17 Sep 2021 15:57:42 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id gyuS0UJzf1no; Fri, 17 Sep 2021 15:57:42 +0200 (CEST) Received: from PO20335.IDSI0.si.c-s.fr (unknown [192.168.202.36]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 514108B768; Fri, 17 Sep 2021 15:57:42 +0200 (CEST) Received: from PO20335.IDSI0.si.c-s.fr (localhost [127.0.0.1]) by PO20335.IDSI0.si.c-s.fr (8.16.1/8.16.1) with ESMTPS id 18HDvWBM675083 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 17 Sep 2021 15:57:32 +0200 Received: (from chleroy@localhost) by PO20335.IDSI0.si.c-s.fr (8.16.1/8.16.1/Submit) id 18HDvWBk675082; Fri, 17 Sep 2021 15:57:32 +0200 X-Authentication-Warning: PO20335.IDSI0.si.c-s.fr: chleroy set sender to christophe.leroy@csgroup.eu using -f From: Christophe Leroy To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman Cc: Christophe Leroy , linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Subject: [PATCH v2] powerpc/32: Don't use a struct based type for pte_t Date: Fri, 17 Sep 2021 15:57:31 +0200 Message-Id: X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Long time ago we had a config item called STRICT_MM_TYPECHECKS to build the kernel with pte_t defined as a structure in order to perform additional build checks or build it with pte_t defined as a simple type in order to get simpler generated code. Commit 670eea924198 ("powerpc/mm: Always use STRICT_MM_TYPECHECKS") made the struct based definition the only one, considering that the generated code was similar in both cases. That's right on ppc64 because the ABI is such that the content of a struct having a single simple type element is passed as register, but on ppc32 such a structure is passed via the stack like any structure. Simple test function: pte_t test(pte_t pte) { return pte; } Before this patch we get c00108ec : c00108ec: 81 24 00 00 lwz r9,0(r4) c00108f0: 91 23 00 00 stw r9,0(r3) c00108f4: 4e 80 00 20 blr So, for PPC32, restore the simple type behaviour we got before commit 670eea924198, but instead of adding a config option to activate type check, do it when __CHECKER__ is set so that type checking is performed by 'sparse' and provides feedback like: arch/powerpc/mm/pgtable.c:466:16: warning: incorrect type in return expression (different base types) arch/powerpc/mm/pgtable.c:466:16: expected unsigned long arch/powerpc/mm/pgtable.c:466:16: got struct pte_t [usertype] x With this patch we now get c0010890 : c0010890: 4e 80 00 20 blr Signed-off-by: Christophe Leroy --- v2: Properly handle 8xx 16k pages --- arch/powerpc/include/asm/nohash/32/pgtable.h | 2 +- arch/powerpc/include/asm/pgtable-types.h | 14 +++++++++++++- arch/powerpc/mm/pgtable.c | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/include/asm/nohash/32/pgtable.h b/arch/powerpc/include/asm/nohash/32/pgtable.h index f06ae00f2a65..34ce50da1850 100644 --- a/arch/powerpc/include/asm/nohash/32/pgtable.h +++ b/arch/powerpc/include/asm/nohash/32/pgtable.h @@ -245,7 +245,7 @@ static int number_of_cells_per_pte(pmd_t *pmd, pte_basic_t val, int huge) static inline pte_basic_t pte_update(struct mm_struct *mm, unsigned long addr, pte_t *p, unsigned long clr, unsigned long set, int huge) { - pte_basic_t *entry = &p->pte; + pte_basic_t *entry = (pte_basic_t *)p; pte_basic_t old = pte_val(*p); pte_basic_t new = (old & ~(pte_basic_t)clr) | set; int num, i; diff --git a/arch/powerpc/include/asm/pgtable-types.h b/arch/powerpc/include/asm/pgtable-types.h index d11b4c61d686..c60199fc6fa6 100644 --- a/arch/powerpc/include/asm/pgtable-types.h +++ b/arch/powerpc/include/asm/pgtable-types.h @@ -5,14 +5,26 @@ /* PTE level */ #if defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES) typedef struct { pte_basic_t pte, pte1, pte2, pte3; } pte_t; -#else +#elif defined(__CHECKER__) || !defined(CONFIG_PPC32) typedef struct { pte_basic_t pte; } pte_t; +#else +typedef pte_basic_t pte_t; #endif + +#if defined(__CHECKER__) || !defined(CONFIG_PPC32) || \ + (defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES)) #define __pte(x) ((pte_t) { (x) }) static inline pte_basic_t pte_val(pte_t x) { return x.pte; } +#else +#define __pte(x) ((pte_t)(x)) +static inline pte_basic_t pte_val(pte_t x) +{ + return x; +} +#endif /* PMD level */ #ifdef CONFIG_PPC64 diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index cd16b407f47e..ce9482383144 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c @@ -271,7 +271,7 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_ { pmd_t *pmd = pmd_off(mm, addr); pte_basic_t val; - pte_basic_t *entry = &ptep->pte; + pte_basic_t *entry = (pte_basic_t *)ptep; int num, i; /* -- 2.31.1