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.9276.1585136337261198615 for ; Wed, 25 Mar 2020 04:38:57 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@linaro.org header.s=google header.b=Va6tRfcw; 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 c187so2096317wme.1 for ; Wed, 25 Mar 2020 04:38:57 -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=YearsH8Uf6AGQ7SC32tmxQh/WC3BQyAyLQ3la9OcF3Q=; b=Va6tRfcwMABxgJ1/pKf6Aum3TnKFnUDDO+IPuY40+0j21Usm5+3EMxkQmGs66Ce/2U oAOY10hztVWprFRJ3aMRtB2mS0ajlS1iR515hwh6KoWulpR0m1QFNxU/g8sF69kSSdOH rt1fmO+54V6zwv7rI14MqBcxQ3eiZhzasEeSOApxleLiFc2r3you0NkHUR6HEkRg0vLY kA2H0QOGB6IDppnguZi2YmAiX1QcZUEMOWP3JC/NVTnZhJ6yypyMBVpmHCqRvPrF5v6x tLfBfW36Lr9rQGkTH2xUy6+z/VuxQX2L6Hz91VonoTS6DFuKvPTHdeA8G9M1t259Epnr rrCA== 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=YearsH8Uf6AGQ7SC32tmxQh/WC3BQyAyLQ3la9OcF3Q=; b=JFDM6NNO7YFwMqzOwF7oRjSH0Y480snNDdL/IU3T/8mihiTQrxMEURsIAJANOqxEem VplpGKpl7AqgE10Pr1Fj+cZeni2abv4wj9BVB7jCaL4EVAQm59K2yqpYBE6sbgspGF2Q u9jCZ3/vnhhqmgyriDcihGMLuREhYK0mI8bFux4cVDkAlg32LMLNZTCrpxxJXzGL5OL3 Flu+7OkLUQsuxJ41y60yv/joNlDFAW8ufg4f6Eg2Tf8Fw4GMjNxcyNaZ0xkOH0xpENk2 0R5Ai/O7MkGjIUhU3OPZIoCi6TINoArOAROJEfQQBnFto2c36m8P0vIp+DlUDiGzI0rF LXIA== X-Gm-Message-State: ANhLgQ29CweRXNQPuwvY1Yv7MqrRB23UzMREUh2e5As8Pnx7uRscryza oUIM2AXFkthCSAvqfCtSEqgsltMDJfW9nJro X-Google-Smtp-Source: ADFU+vtoaJDC1ymLD7SXUnjE+HJLjuHvWCZrkX7pudgeDQa9OI+0IruTSrVntAd/ppTuCbZ/a/yIEw== X-Received: by 2002:a1c:2e10:: with SMTP id u16mr2848648wmu.143.1585136335508; Wed, 25 Mar 2020 04:38:55 -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 v26sm33259682wra.7.2020.03.25.04.38.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Mar 2020 04:38:54 -0700 (PDT) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Laszlo Ersek , Leif Lindholm , Ashish Singhal Subject: [PATCH v2 1/2] ArmPkg/ArmMmuLib AARCH64: use helpers to determine table entry types Date: Wed, 25 Mar 2020 12:38:45 +0100 Message-Id: <20200325113846.21700-2-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200325113846.21700-1-ard.biesheuvel@linaro.org> References: <20200325113846.21700-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 a43d468b73ca..6f6ef5b05fbc 100644 --- a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c +++ b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c @@ -156,6 +156,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 ( @@ -197,7 +227,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. @@ -215,7 +245,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. @@ -246,7 +276,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 @@ -259,10 +289,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