From patchwork Wed Jul 13 07:28:06 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 71902 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp861500qga; Wed, 13 Jul 2016 00:28:18 -0700 (PDT) X-Received: by 10.98.89.23 with SMTP id n23mr987800pfb.34.1468394897989; Wed, 13 Jul 2016 00:28:17 -0700 (PDT) Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id v1si4667338pfb.39.2016.07.13.00.28.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 13 Jul 2016 00:28:17 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id C6B271A1EEA; Wed, 13 Jul 2016 00:29:02 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received: from mail-wm0-x231.google.com (mail-wm0-x231.google.com [IPv6:2a00:1450:400c:c09::231]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 44DA81A1E8F for ; Wed, 13 Jul 2016 00:29:01 -0700 (PDT) Received: by mail-wm0-x231.google.com with SMTP id o80so54586287wme.1 for ; Wed, 13 Jul 2016 00:28:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=wWsVILbqQ4xGOpRWx2+UEfNMQ4/3yq9QjVYWZT1W9kk=; b=O8T+0RR30QMwF7oMdWjwBbIB3FqCTHKPZHkCbqSaxKt/vpVIT+0vn+OCYDOwc93DYc VdRhEpfJDHJ2hyPLdPUbttleXQtXowJKBJIcXmylpTceMTk7NlJgK0D7f4TFd3MUC+/T xTxtEMo2G6kY11+B7S6hoCtpsHujuRoluR2a8= 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; bh=wWsVILbqQ4xGOpRWx2+UEfNMQ4/3yq9QjVYWZT1W9kk=; b=ApUltShOSbLzyJng9DtB51utp2u25MsCT9hPRLoryLKBUvhUjsN4IIk8YxmqCdqs9R axxOlLmxwwwz3UTn6y1jwOOfihplU2CW8G75o+b95w7l6pKGs68PRHoE55Tb0OaVjiz6 ZzkaZcyxDqIgm+b7dNz1b2Iwus/z3Ov9WgGazBLfg6bSMIGsSPccaeZSFf0AyY6g7rSp 4YoO2y5pJOxS8bdAC8LX7mWZ7dXFf4nSyfsI0NRPlcxj33YGYVMPqy8ZS4aljsxFC96n s0nb0ptGhDAz4c+Gr6cgmI6z0Tol3Ec+Xcor7tR5dhO31GQYmc/nl0/9xSxxOXJmGLgr b7gQ== X-Gm-Message-State: ALyK8tLeg51fDMQ0p/4eYjmSCEfe2kzJsBYdhYdF4bsp7Kfu16NB5fSAYgy41LawiaEpz0si X-Received: by 10.28.228.132 with SMTP id b126mr15785911wmh.93.1468394893884; Wed, 13 Jul 2016 00:28:13 -0700 (PDT) Received: from localhost.localdomain ([188.203.148.129]) by smtp.gmail.com with ESMTPSA id i8sm5981572wmg.21.2016.07.13.00.28.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 13 Jul 2016 00:28:13 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org, mark.rutland@arm.com, Vishal Oliyil Kunnil Date: Wed, 13 Jul 2016 09:28:06 +0200 Message-Id: <1468394886-5178-1-git-send-email-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 1.9.1 Subject: [edk2] [PATCH] ArmPkg/ArmMmuLib: avoid type promotion in TCR_EL1 assignment X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" Commit fafb7e9c110e ("ArmPkg: correct TTBR1_EL1 settings in TCR_EL1") introduced a symbolic constant TCR_TG1_4KB which resolves to (2 << 30), and ORs it into the value to be written into TCR_EL1 (if executing at EL1). Since the constant is implicitly typed as signed int, and has the sign bit set, the promotion that occurs when casting to UINT64 results in a TCR value that has bits [63:32] all set, which includes mostly RES0 bits but also the TBIn, AS and IPS fields. So explicitly redefine all TCR related constants as 'unsigned long' types, using the UL suffix. To avoid confusion in the future, the inappropriately named VTCR_EL23_xxx constants have the leading V removed, and the actual VTCR_EL2 related constants are dropped, given that we never configure stage 2 translation in UEFI. Reported-by: Vishal Oliyil Kunnil Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel --- ArmPkg/Include/Chipset/AArch64Mmu.h | 140 +++++++++----------- 1 file changed, 62 insertions(+), 78 deletions(-) -- 1.9.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel Reviewed-by: Leif Lindholm Acked-by: Mark Rutland diff --git a/ArmPkg/Include/Chipset/AArch64Mmu.h b/ArmPkg/Include/Chipset/AArch64Mmu.h index f660e65aac33..ff77b16b25c0 100644 --- a/ArmPkg/Include/Chipset/AArch64Mmu.h +++ b/ArmPkg/Include/Chipset/AArch64Mmu.h @@ -98,17 +98,17 @@ // // Translation Control Register // -#define TCR_T0SZ_MASK 0x3F +#define TCR_T0SZ_MASK 0x3FUL -#define TCR_PS_4GB (0 << 16) -#define TCR_PS_64GB (1 << 16) -#define TCR_PS_1TB (2 << 16) -#define TCR_PS_4TB (3 << 16) -#define TCR_PS_16TB (4 << 16) -#define TCR_PS_256TB (5 << 16) +#define TCR_PS_4GB (0UL << 16) +#define TCR_PS_64GB (1UL << 16) +#define TCR_PS_1TB (2UL << 16) +#define TCR_PS_4TB (3UL << 16) +#define TCR_PS_16TB (4UL << 16) +#define TCR_PS_256TB (5UL << 16) -#define TCR_TG0_4KB (0 << 14) -#define TCR_TG1_4KB (2 << 30) +#define TCR_TG0_4KB (0UL << 14) +#define TCR_TG1_4KB (2UL << 30) #define TCR_IPS_4GB (0ULL << 32) #define TCR_IPS_64GB (1ULL << 32) @@ -117,7 +117,7 @@ #define TCR_IPS_16TB (4ULL << 32) #define TCR_IPS_256TB (5ULL << 32) -#define TCR_EPD1 (1 << 23) +#define TCR_EPD1 (1UL << 23) #define TTBR_ASID_FIELD (48) #define TTBR_ASID_MASK (0xFF << TTBR_ASID_FIELD) @@ -140,75 +140,59 @@ #define TCR_EL1_AS_FIELD (36) #define TCR_EL1_TBI0_FIELD (37) #define TCR_EL1_TBI1_FIELD (38) -#define TCR_EL1_T0SZ_MASK (0x1F << TCR_EL1_T0SZ_FIELD) -#define TCR_EL1_EPD0_MASK (0x1 << TCR_EL1_EPD0_FIELD) -#define TCR_EL1_IRGN0_MASK (0x3 << TCR_EL1_IRGN0_FIELD) -#define TCR_EL1_ORGN0_MASK (0x3 << TCR_EL1_ORGN0_FIELD) -#define TCR_EL1_SH0_MASK (0x3 << TCR_EL1_SH0_FIELD) -#define TCR_EL1_TG0_MASK (0x1 << TCR_EL1_TG0_FIELD) -#define TCR_EL1_T1SZ_MASK (0x1F << TCR_EL1_T1SZ_FIELD) -#define TCR_EL1_A1_MASK (0x1 << TCR_EL1_A1_FIELD) -#define TCR_EL1_EPD1_MASK (0x1 << TCR_EL1_EPD1_FIELD) -#define TCR_EL1_IRGN1_MASK (0x3 << TCR_EL1_IRGN1_FIELD) -#define TCR_EL1_ORGN1_MASK (0x3 << TCR_EL1_ORGN1_FIELD) -#define TCR_EL1_SH1_MASK (0x3 << TCR_EL1_SH1_FIELD) -#define TCR_EL1_TG1_MASK (0x1 << TCR_EL1_TG1_FIELD) -#define TCR_EL1_IPS_MASK (0x7 << TCR_EL1_IPS_FIELD) -#define TCR_EL1_AS_MASK (0x1 << TCR_EL1_AS_FIELD) -#define TCR_EL1_TBI0_MASK (0x1 << TCR_EL1_TBI0_FIELD) -#define TCR_EL1_TBI1_MASK (0x1 << TCR_EL1_TBI1_FIELD) - - -#define VTCR_EL23_T0SZ_FIELD (0) -#define VTCR_EL23_IRGN0_FIELD (8) -#define VTCR_EL23_ORGN0_FIELD (10) -#define VTCR_EL23_SH0_FIELD (12) +#define TCR_EL1_T0SZ_MASK (0x1FUL << TCR_EL1_T0SZ_FIELD) +#define TCR_EL1_EPD0_MASK (0x01UL << TCR_EL1_EPD0_FIELD) +#define TCR_EL1_IRGN0_MASK (0x03UL << TCR_EL1_IRGN0_FIELD) +#define TCR_EL1_ORGN0_MASK (0x03UL << TCR_EL1_ORGN0_FIELD) +#define TCR_EL1_SH0_MASK (0x03UL << TCR_EL1_SH0_FIELD) +#define TCR_EL1_TG0_MASK (0x01UL << TCR_EL1_TG0_FIELD) +#define TCR_EL1_T1SZ_MASK (0x1FUL << TCR_EL1_T1SZ_FIELD) +#define TCR_EL1_A1_MASK (0x01UL << TCR_EL1_A1_FIELD) +#define TCR_EL1_EPD1_MASK (0x01UL << TCR_EL1_EPD1_FIELD) +#define TCR_EL1_IRGN1_MASK (0x03UL << TCR_EL1_IRGN1_FIELD) +#define TCR_EL1_ORGN1_MASK (0x03UL << TCR_EL1_ORGN1_FIELD) +#define TCR_EL1_SH1_MASK (0x03UL << TCR_EL1_SH1_FIELD) +#define TCR_EL1_TG1_MASK (0x01UL << TCR_EL1_TG1_FIELD) +#define TCR_EL1_IPS_MASK (0x07UL << TCR_EL1_IPS_FIELD) +#define TCR_EL1_AS_MASK (0x01UL << TCR_EL1_AS_FIELD) +#define TCR_EL1_TBI0_MASK (0x01UL << TCR_EL1_TBI0_FIELD) +#define TCR_EL1_TBI1_MASK (0x01UL << TCR_EL1_TBI1_FIELD) + + +#define TCR_EL23_T0SZ_FIELD (0) +#define TCR_EL23_IRGN0_FIELD (8) +#define TCR_EL23_ORGN0_FIELD (10) +#define TCR_EL23_SH0_FIELD (12) #define TCR_EL23_TG0_FIELD (14) -#define VTCR_EL23_PS_FIELD (16) -#define TCR_EL23_T0SZ_MASK (0x1F << VTCR_EL23_T0SZ_FIELD) -#define TCR_EL23_IRGN0_MASK (0x3 << VTCR_EL23_IRGN0_FIELD) -#define TCR_EL23_ORGN0_MASK (0x3 << VTCR_EL23_ORGN0_FIELD) -#define TCR_EL23_SH0_MASK (0x3 << VTCR_EL23_SH0_FIELD) -#define TCR_EL23_TG0_MASK (0x1 << TCR_EL23_TG0_FIELD) -#define TCR_EL23_PS_MASK (0x7 << VTCR_EL23_PS_FIELD) - - -#define VTCR_EL2_T0SZ_FIELD (0) -#define VTCR_EL2_SL0_FIELD (6) -#define VTCR_EL2_IRGN0_FIELD (8) -#define VTCR_EL2_ORGN0_FIELD (10) -#define VTCR_EL2_SH0_FIELD (12) -#define VTCR_EL2_TG0_FIELD (14) -#define VTCR_EL2_PS_FIELD (16) -#define VTCR_EL2_T0SZ_MASK (0x1F << VTCR_EL2_T0SZ_FIELD) -#define VTCR_EL2_SL0_MASK (0x1F << VTCR_EL2_SL0_FIELD) -#define VTCR_EL2_IRGN0_MASK (0x3 << VTCR_EL2_IRGN0_FIELD) -#define VTCR_EL2_ORGN0_MASK (0x3 << VTCR_EL2_ORGN0_FIELD) -#define VTCR_EL2_SH0_MASK (0x3 << VTCR_EL2_SH0_FIELD) -#define VTCR_EL2_TG0_MASK (0x1 << VTCR_EL2_TG0_FIELD) -#define VTCR_EL2_PS_MASK (0x7 << VTCR_EL2_PS_FIELD) - - -#define TCR_RGN_OUTER_NON_CACHEABLE (0x0 << 10) -#define TCR_RGN_OUTER_WRITE_BACK_ALLOC (0x1 << 10) -#define TCR_RGN_OUTER_WRITE_THROUGH (0x2 << 10) -#define TCR_RGN_OUTER_WRITE_BACK_NO_ALLOC (0x3 << 10) - -#define TCR_RGN_INNER_NON_CACHEABLE (0x0 << 8) -#define TCR_RGN_INNER_WRITE_BACK_ALLOC (0x1 << 8) -#define TCR_RGN_INNER_WRITE_THROUGH (0x2 << 8) -#define TCR_RGN_INNER_WRITE_BACK_NO_ALLOC (0x3 << 8) - -#define TCR_SH_NON_SHAREABLE (0x0 << 12) -#define TCR_SH_OUTER_SHAREABLE (0x2 << 12) -#define TCR_SH_INNER_SHAREABLE (0x3 << 12) - -#define TCR_PASZ_32BITS_4GB (0x0) -#define TCR_PASZ_36BITS_64GB (0x1) -#define TCR_PASZ_40BITS_1TB (0x2) -#define TCR_PASZ_42BITS_4TB (0x3) -#define TCR_PASZ_44BITS_16TB (0x4) -#define TCR_PASZ_48BITS_256TB (0x5) +#define TCR_EL23_PS_FIELD (16) +#define TCR_EL23_T0SZ_MASK (0x1FUL << TCR_EL23_T0SZ_FIELD) +#define TCR_EL23_IRGN0_MASK (0x03UL << TCR_EL23_IRGN0_FIELD) +#define TCR_EL23_ORGN0_MASK (0x03UL << TCR_EL23_ORGN0_FIELD) +#define TCR_EL23_SH0_MASK (0x03UL << TCR_EL23_SH0_FIELD) +#define TCR_EL23_TG0_MASK (0x01UL << TCR_EL23_TG0_FIELD) +#define TCR_EL23_PS_MASK (0x07UL << TCR_EL23_PS_FIELD) + + +#define TCR_RGN_OUTER_NON_CACHEABLE (0x0UL << 10) +#define TCR_RGN_OUTER_WRITE_BACK_ALLOC (0x1UL << 10) +#define TCR_RGN_OUTER_WRITE_THROUGH (0x2UL << 10) +#define TCR_RGN_OUTER_WRITE_BACK_NO_ALLOC (0x3UL << 10) + +#define TCR_RGN_INNER_NON_CACHEABLE (0x0UL << 8) +#define TCR_RGN_INNER_WRITE_BACK_ALLOC (0x1UL << 8) +#define TCR_RGN_INNER_WRITE_THROUGH (0x2UL << 8) +#define TCR_RGN_INNER_WRITE_BACK_NO_ALLOC (0x3UL << 8) + +#define TCR_SH_NON_SHAREABLE (0x0UL << 12) +#define TCR_SH_OUTER_SHAREABLE (0x2UL << 12) +#define TCR_SH_INNER_SHAREABLE (0x3UL << 12) + +#define TCR_PASZ_32BITS_4GB (0x0UL) +#define TCR_PASZ_36BITS_64GB (0x1UL) +#define TCR_PASZ_40BITS_1TB (0x2UL) +#define TCR_PASZ_42BITS_4TB (0x3UL) +#define TCR_PASZ_44BITS_16TB (0x4UL) +#define TCR_PASZ_48BITS_256TB (0x5UL) // The value written to the T*SZ fields are defined as 2^(64-T*SZ). So a 39Bit // Virtual address range for 512GB of virtual space sets T*SZ to 25