From patchwork Fri Mar 28 14:22:33 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Capper X-Patchwork-Id: 3906571 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 7F344BF540 for ; Fri, 28 Mar 2014 18:40:24 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6E028202EC for ; Fri, 28 Mar 2014 18:40:23 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5BE49202A7 for ; Fri, 28 Mar 2014 18:40:22 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WTYdI-0004hx-Vl; Fri, 28 Mar 2014 15:23:50 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1WTYcQ-0000x2-Uf; Fri, 28 Mar 2014 15:22:54 +0000 Received: from mail-wi0-f179.google.com ([209.85.212.179]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WTYXK-0000Me-Ei for linux-arm-kernel@lists.infradead.org; Fri, 28 Mar 2014 15:17:47 +0000 Received: by mail-wi0-f179.google.com with SMTP id f8so875789wiw.6 for ; Fri, 28 Mar 2014 08:17:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=i7sBfWx8+QZ8dywj4gpHk5ITnWMXf3Mlu3x8Iwzh+yA=; b=bOchv2u8TfvDwEPaJ2ZS3mrvx9thQPcIyTadzrEdAvF8MTMpq4pU5v1Iy8XwgRnCr7 2F/wOXO6ta9oI6gketcd8XEBPAIoHgcuPhGnlSIqDP9ecpHjuwucgjuCMqbgXt39/tuF FXwI8GmC4wVVbloQIucC64YM4n0rggs8/r0rdGZUqEn1c+vBO6N7yHymVUeiEf7AQyBO rChjpGI+798wUtMJw+f+o4zS21vpzHQ/ThmReFbpXaaAjNlKCFOUFN9XCwf7bCC0N7vT T178cxx2Dq5oO9n6cnEXOgXD3NxL3/QYA5R6hslysd3epDiDALMzRw/9z0GBCUd79nRQ /xAA== X-Gm-Message-State: ALoCoQmPMjcLY2U94eS0v+G+QncBb6hks5n1GF91tBmLcZ21G3xttY3+M8Qoxxx5UIWoQHm0cQhY X-Received: by 10.180.106.134 with SMTP id gu6mr47495884wib.61.1396016563364; Fri, 28 Mar 2014 07:22:43 -0700 (PDT) Received: from marmot.wormnet.eu (marmot.wormnet.eu. [188.246.204.87]) by mx.google.com with ESMTPSA id i9sm7667346wiy.17.2014.03.28.07.22.42 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 28 Mar 2014 07:22:42 -0700 (PDT) From: Steve Capper To: linux-arm-kernel@lists.infradead.org, linux@arm.linux.org.uk Subject: [PATCH V3 1/2] arm: mm: Introduce pte_isset and pte_isclear Date: Fri, 28 Mar 2014 14:22:33 +0000 Message-Id: <1396016554-5843-2-git-send-email-steve.capper@linaro.org> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1396016554-5843-1-git-send-email-steve.capper@linaro.org> References: <1396016554-5843-1-git-send-email-steve.capper@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140328_111738_845103_E8B5EAED X-CRM114-Status: UNSURE ( 9.11 ) X-CRM114-Notice: Please train this message. X-Spam-Score: -2.6 (--) Cc: catalin.marinas@arm.com, lauraa@codeaurora.org, keescook@chromium.org, Steve Capper X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Long descriptors on ARM are 64 bits, and some pte functions such as pte_dirty return a bitwise-and of a flag with the pte value. If the flag to be tested resides in the upper 32 bits of the pte, then we run into the danger of the result being dropped if downcast. For example: gather_stats(page, md, pte_dirty(*pte), 1); where pte_dirty(*pte) is downcast to an int. This patch introduces a new macro pte_isset which performs the bitwise and, then performs a double logical invert (where needed) to ensure predictable downcasting. Signed-off-by: Steve Capper --- Changes in V3: back to pte_isset macro. Added (u32)(val) == (val) as recommended by Russell to simplify cases where we do not need to perform a double logical invert. Also added pte_isclear as recommended, as this makes the pte accessors look a lot cleaner. I have experimented with multiple implementations of pte_isclear in an attempt to simplify things for LPAE where (u32)val == val, but have been unable to come up with any convincing schemes. --- arch/arm/include/asm/pgtable.h | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index 7d59b52..8790444 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h @@ -214,15 +214,19 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd) #define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0) +#define pte_isset(pte, val) ((u32)(val) == (val) ? pte_val(pte) & (val) \ + : !!(pte_val(pte) & (val))) +#define pte_isclear(pte, val) (!(pte_val(pte) & (val))) + #define pte_none(pte) (!pte_val(pte)) -#define pte_present(pte) (pte_val(pte) & L_PTE_PRESENT) -#define pte_write(pte) (!(pte_val(pte) & L_PTE_RDONLY)) -#define pte_dirty(pte) (pte_val(pte) & L_PTE_DIRTY) -#define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG) -#define pte_exec(pte) (!(pte_val(pte) & L_PTE_XN)) +#define pte_present(pte) (pte_isset((pte), L_PTE_PRESENT)) +#define pte_write(pte) (pte_isclear((pte), L_PTE_RDONLY)) +#define pte_dirty(pte) (pte_isset((pte), L_PTE_DIRTY)) +#define pte_young(pte) (pte_isset((pte), L_PTE_YOUNG)) +#define pte_exec(pte) (pte_isclear((pte), L_PTE_XN)) #define pte_special(pte) (0) -#define pte_present_user(pte) (pte_present(pte) && (pte_val(pte) & L_PTE_USER)) +#define pte_present_user(pte) (pte_present(pte) && pte_isset((pte), L_PTE_USER)) #if __LINUX_ARM_ARCH__ < 6 static inline void __sync_icache_dcache(pte_t pteval)