From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by mx.groups.io with SMTP id smtpd.web11.14236.1585150191733096102 for ; Wed, 25 Mar 2020 08:29:52 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@linaro.org header.s=google header.b=sV/qvPCv; spf=pass (domain: linaro.org, ip: 209.85.128.68, mailfrom: ard.biesheuvel@linaro.org) Received: by mail-wm1-f68.google.com with SMTP id a9so3175213wmj.4 for ; Wed, 25 Mar 2020 08:29:51 -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:in-reply-to:references; bh=AoO++BaYuX4r3cjxOHkGtk0ULLht9CKdxVXYTW1gOsg=; b=sV/qvPCvgjqmFLRNlv5AXupyGClGmx3Z64ab5iQ3szp6D1vu7smz6bsKiA0FP7POFz IdkkoB+Co+GlziZHBKsDdpnlBAkK/sMeQFycQdc86iFuXjdXzl1vaM7bJ4IQ3ynjg70E Yowrl2hVwCb1YKl2iWhHbD40jDsIpXs2kAOL8DjA8hJP19W2CrdNDwiTty/m6QsH8jSf jHESK2RZViRXzluJalK7+i5WeDd2QGnEYZggac32wcM0EIJ/eF4qiyeZSxeEs0yb5VGc QNtl8lqQPsb9ypNoh471KsCqk990XVCJ01VvspJsc4I/JBd70nd8wwHjgKa2komLYqDA PItw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AoO++BaYuX4r3cjxOHkGtk0ULLht9CKdxVXYTW1gOsg=; b=emrbeplYrFBpf33f+Aon+Zvy+LP2BY6H4KLcexv1MzMa/hhLmuQCnN8Xub2vRivm91 YcxcXyIUkhWk82AUENKfLpjQ5KXqNdJPjTOlmFVRni2gkAyr5eI6G04+QbzcShq92yaD 44KHgwlbu2CVL8sqPo3FVte12TQ0a5CyRF3NKvUepTO1ZR1FYaqEJHeKbvaEXhB1lLsu UiBGfk9bfw3RKAbIcGobuuE48fSKQH2NVjfIR8vnip30sKDUp6kqSY506zkuQRvMPaKT rnStlYQVhEHewmI/al/71QhenMX8RutkTdzQGgiEUVMVgFoC89494owjkE00Ui9NY2S+ kH6Q== X-Gm-Message-State: ANhLgQ2XQu8O6EOwrLqIOXEeiT2tYAjbniDHsnHbUr1ADVUuayCyUk8n VUGYY2l1HkAiqAJ5xZxVrDE8RLvsBEL1KGna X-Google-Smtp-Source: ADFU+vsjjOQO+aV0f1VwBT1KjAKsLN6KIjBWs4r2xR/7QBxNdZl4IeRGP0Av1DlcO5boU8eJ0Qx7ww== X-Received: by 2002:a1c:2d8a:: with SMTP id t132mr4204301wmt.83.1585150187902; Wed, 25 Mar 2020 08:29:47 -0700 (PDT) Return-Path: Received: from e123331-lin.home (amontpellier-657-1-18-247.w109-210.abo.wanadoo.fr. [109.210.65.247]) by smtp.gmail.com with ESMTPSA id r15sm29249296wra.19.2020.03.25.08.29.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Mar 2020 08:29:47 -0700 (PDT) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Laszlo Ersek , Leif Lindholm , Ashish Singhal Subject: [PATCH v3 2/3] ArmPkg/ArmMmuLib AARCH64: use helpers to determine table entry types Date: Wed, 25 Mar 2020 16:29:39 +0100 Message-Id: <20200325152940.1492-3-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200325152940.1492-1-ard.biesheuvel@linaro.org> References: <20200325152940.1492-1-ard.biesheuvel@linaro.org> Given how the meaning of the attribute bits for page table entry types is slightly awkward, and changes between levels, add some helpers to abstract from this. Signed-off-by: Ard Biesheuvel Reviewed-by: Leif Lindholm --- ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c | 40 +++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c index d78918cf7ba8..0680ba36d907 100644 --- a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c +++ b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c @@ -162,6 +162,36 @@ FreePageTablesRecursive ( FreePages (TranslationTable, 1); } +STATIC +BOOLEAN +IsBlockEntry ( + IN UINT64 Entry, + IN UINTN Level + ) +{ + if (Level == 3) { + return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3; + } + return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY; +} + +STATIC +BOOLEAN +IsTableEntry ( + IN UINT64 Entry, + IN UINTN Level + ) +{ + if (Level == 3) { + // + // TT_TYPE_TABLE_ENTRY aliases TT_TYPE_BLOCK_ENTRY_LEVEL3 + // so we need to take the level into account as well. + // + return FALSE; + } + return (Entry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY; +} + STATIC EFI_STATUS UpdateRegionMappingRecursive ( @@ -203,7 +233,7 @@ UpdateRegionMappingRecursive ( if (Level == 0 || ((RegionStart | BlockEnd) & BlockMask) != 0) { ASSERT (Level < 3); - if ((*Entry & TT_TYPE_MASK) != TT_TYPE_TABLE_ENTRY) { + if (!IsTableEntry (*Entry, Level)) { // // No table entry exists yet, so we need to allocate a page table // for the next level. @@ -221,7 +251,7 @@ UpdateRegionMappingRecursive ( InvalidateDataCacheRange (TranslationTable, EFI_PAGE_SIZE); } - if ((*Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY) { + if (IsBlockEntry (*Entry, Level)) { // // We are splitting an existing block entry, so we have to populate // the new table with the attributes of the block entry it replaces. @@ -252,7 +282,7 @@ UpdateRegionMappingRecursive ( AttributeSetMask, AttributeClearMask, TranslationTable, Level + 1); if (EFI_ERROR (Status)) { - if ((*Entry & TT_TYPE_MASK) != TT_TYPE_TABLE_ENTRY) { + if (!IsTableEntry (*Entry, Level)) { // // We are creating a new table entry, so on failure, we can free all // allocations we made recursively, given that the whole subhierarchy @@ -265,10 +295,10 @@ UpdateRegionMappingRecursive ( return Status; } - if ((*Entry & TT_TYPE_MASK) != TT_TYPE_TABLE_ENTRY) { + if (!IsTableEntry (*Entry, Level)) { EntryValue = (UINTN)TranslationTable | TT_TYPE_TABLE_ENTRY; ReplaceTableEntry (Entry, EntryValue, RegionStart, - (*Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY); + IsBlockEntry (*Entry, Level)); } } else { EntryValue = (*Entry & AttributeClearMask) | AttributeSetMask; -- 2.17.1