From nobody Sun Apr 28 20:14:32 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1514968946273415.49094789672495; Wed, 3 Jan 2018 00:42:26 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 49767222A54E0; Wed, 3 Jan 2018 00:37:21 -0800 (PST) Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-oln040092005034.outbound.protection.outlook.com [40.92.5.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 4499521CB2E27 for ; Wed, 3 Jan 2018 00:37:18 -0800 (PST) Received: from SN1NAM02FT013.eop-nam02.prod.protection.outlook.com (10.152.72.54) by SN1NAM02HT131.eop-nam02.prod.protection.outlook.com (10.152.73.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.20.302.6; Wed, 3 Jan 2018 08:42:20 +0000 Received: from CO2PR19MB0137.namprd19.prod.outlook.com (10.152.72.51) by SN1NAM02FT013.mail.protection.outlook.com (10.152.72.98) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.20.345.12 via Frontend Transport; Wed, 3 Jan 2018 08:42:20 +0000 Received: from CO2PR19MB0137.namprd19.prod.outlook.com ([10.161.82.25]) by CO2PR19MB0137.namprd19.prod.outlook.com ([10.161.82.25]) with mapi id 15.20.0366.009; Wed, 3 Jan 2018 08:42:20 +0000 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=40.92.5.34; helo=nam02-sn1-obe.outbound.protection.outlook.com; envelope-from=vanjeff_919@hotmail.com; receiver=edk2-devel@lists.01.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=BwgqyFx0rZIbPy2JYnxN9sEM71VCzOHhIDyGEwxzBWs=; b=tHroWq0GLlPqHiXxkyoNq9vyzROO5Cz+aoffoqM8DAmeZkIXpdPE2m9uRhBRD91tQdO/rbrF0izCo+heHlTxoD4sLDooZ3iVNq/XllBCImVxf8kY7AzqwnFzehMCQje0EJcKfqW3fjuBaaFQI7LeE3cFVg9TJF8tXBNNEMDnGzjTNIFbxk+VgFpDrACC/mfx39rnOJ+J2iJsESx+0d0kkvyY6Mwk/olVM6ZMY7OSFzJG89PlyY5K+NG9Hm3L5hI4luId1RDAJII32gBjERJEH0W4s+hAYd0QJxjX5GspDbN8gRAx3f+7kIA9yDi866awCYgwC7SPLPkM25Mx7zxusw== From: Fan Jeff To: Paulo Alcantara , "edk2-devel@lists.01.org" Thread-Topic: [edk2] [RFC v4 4/6] UefiCpuPkg/CpuExceptionHandlerLib: Add helper to valid memory addresses Thread-Index: AQHTgF9DoStmU+eSLkO0udiBPqy79aNh3Di4 Date: Wed, 3 Jan 2018 08:42:19 +0000 Message-ID: References: , <32f06077006939f71560970f6abcbbb2062ea5c3.1514517573.git.paulo@paulo.ac> In-Reply-To: <32f06077006939f71560970f6abcbbb2062ea5c3.1514517573.git.paulo@paulo.ac> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-incomingtopheadermarker: OriginalChecksum:432AF98C33DDD13880902C990EF96E7710AC4560A3FB9751B964CAB37AEEB2B9; UpperCasedChecksum:90766F88CA4701674345AF30D2A6E3569FF0F3155EE91EF10225B56453605ADF; SizeAsReceived:7355; Count:47 x-ms-exchange-messagesentrepresentingtype: 1 x-tmn: [oOvzAj2tbcFfa7XRx8nB+IixchsvL0rJ] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; SN1NAM02HT131; 6:cPelQ4zbeGiOEabHZ7OF9jGMWkeNPFNboNQXQh+xtxjpx2mrAwxOAeSVpawlljK+UAbv/pryE5tvo0+SwO3BFMjEXlene5C2LhMuMPG++hsGjUfpyUs2jDRo5wIPCq9Ai7y99JgE9Ra0GIgWfjYolL+eCiovhgFF3uCBpxTbredB+G8FeJ/DOBHcnkM+QiBLXw983j2pg02vEaMoDxlmyluh5Zx9T9OcLGkHQnv+ZS0FUI1HH7u6UaYKWVlxKIfOgFCXZeCB/9DDUtN2o0hphPwqorkZ4hF8nsCr5137+M7mNxmOdxdRTtwRzAcixz1r3ufBgXrWyla8D7nn05R7YefECmJPsQ+bCY0IA8YMZv8=; 5:mlkPncLwdj4zXrIfFrULeCo41ObZ2xzlstXxtb6BfWLEU8Q5E7gqusmMjPQpRatiLW1XsbARvwlkNwSWauMycSPasml7mijjdJjS/cc6zTQt4XR1BWuK39Oq8srN2VT75eGgMHuzqCU7VlfLIoUsgx6UzkREKZkekEGZ5P5Kwkk=; 24:OQlZw/jeBy/D4EN0GrDYoqAWmd8W3/Si+uhmU8IpN+xCFJVWiJrugM80VXYgyn2Pskyibb4Rn5rt/kHkvvCthb/Rnk2fRlzA9n7LPmRN8P0=; 7:A+vpxrGNzpCB5ExZ1BJQaSC7Ko51z/E+LZAjCVt83Sql6Wh5h2cJzplBmEcihpHu2q/INhJ642JsqYFFXa5F5v4ebwZ2fXCqEAVqTiMGjdDrm2PBrHmT9YpSEYKViw/u6+/RG3FgHoLYfHsMIiVlkRnNnvV4XMHVbTl+a+J10spItGciFCrS0qlGqZiCvXMyN4nX8UpoDhuQBBvemjelaa+Hm/eoc8wiVYX+L3umgsbLRp2Qa+todhbL1UgUZ6Ls x-incomingheadercount: 47 x-eopattributedmessage: 0 x-microsoft-antispam: UriScan:(222181515654134); BCL:0; PCL:0; RULEID:(201702061074)(5061506573)(5061507331)(1603103135)(2017031320274)(2017031324274)(2017031323274)(2017031322404)(1603101448)(1601125374)(1701031045); SRVR:SN1NAM02HT131; x-ms-traffictypediagnostic: SN1NAM02HT131: x-ms-office365-filtering-correlation-id: 2283beb8-0e39-4dbd-bb72-08d55285e6ec x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(444000031); SRVR:SN1NAM02HT131; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:SN1NAM02HT131; x-forefront-prvs: 0541031FF6 x-forefront-antispam-report: SFV:NSPM; SFS:(7070007)(98901004); DIR:OUT; SFP:1901; SCL:1; SRVR:SN1NAM02HT131; H:CO2PR19MB0137.namprd19.prod.outlook.com; FPR:; SPF:None; LANG:; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: hotmail.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2283beb8-0e39-4dbd-bb72-08d55285e6ec X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Jan 2018 08:42:19.9945 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Internet X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1NAM02HT131 X-Content-Filtered-By: Mailman/MimeDel 2.1.23 Subject: [edk2] =?gb2312?b?tPC4tDogIFtSRkMgdjQgNC82XSBVZWZpQ3B1UGtnL0Nw?= =?gb2312?b?dUV4Y2VwdGlvbkhhbmRsZXJMaWI6IEFkZCBoZWxwZXIgdG8gdmFsaWQgbWVt?= =?gb2312?b?b3J5IGFkZHJlc3Nlcw==?= X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laszlo Ersek , Eric Dong Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Paul, + // + // Calculate physical address of PML4E + // + PhysicalAddress =3D (UINT64)Cr3 & (((1ULL << MaxPhyAddrBits) - 1) << 12); + PhysicalAddress |=3D (((UINT64)LinearAddress >> 39) & 0x1FF) << 3; + Should not pass VS build, instead you could use LShiftU64/RShiftU64 to do 6= 4bit shift operation as below: PhysicalAddress =3D (UINT64)Cr3 & LShiftU64 (LShiftU64 (1, MaxPhyAddrBits= ) - 1, 12); PhysicalAddress |=3D LShiftU64 (RShiftU64((UINT64)LinearAddress, 39) & 0x= 1FF), 3); Jeff =E5=8F=91=E4=BB=B6=E4=BA=BA: Paulo Alcantara =E5=8F=91=E9=80=81=E6=97=B6=E9=97=B4: 2017=E5=B9=B412=E6=9C=8829=E6=97=A5 1= 2:41 =E6=94=B6=E4=BB=B6=E4=BA=BA: edk2-devel@lists.01.org =E6=8A=84=E9=80=81: Laszlo Ersek; Eric Dong =E4=B8=BB=E9=A2=98: [edk2] [RFC v4 4/6] UefiCpuPkg/CpuExceptionHandlerLib: = Add helper to valid memory addresses Introduce IsLinearAddressValid() function that will be used for validating memory addresses that would get dereferenced during stack traces in IA32 and X64 CPU exceptions. Contributed-under: TianoCore Contribution Agreement 1.1 Cc: Eric Dong Cc: Laszlo Ersek Requested-by: Brian Johnson Requested-by: Jiewen Yao Signed-off-by: Paulo Alcantara --- UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.c | 382 +++++= +++++++++++++++ UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h | 16 + 2 files changed, 398 insertions(+) diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.c= b/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.c index 867c5c01d6..52b3eb1463 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.c @@ -14,6 +14,9 @@ #include "CpuExceptionCommon.h" +#include +#include + // // Error code flag indicating whether or not an error code will be // pushed on the stack if an exception occurs. @@ -194,3 +197,382 @@ GetPdbFileName ( } } } + +/** + Check if a linear address is valid by walking the page tables in 4-level + paging mode. + + @param[in] Cr3 CR3 control register. + @param[in] MaxPhyAddrBits MAXPHYADDRBITS bits. + @param[in] LinearAddress Linear address to be checked. +**/ +STATIC +BOOLEAN +Do4LevelPagingModeCheck ( + IN UINTN Cr3, + IN UINT8 MaxPhyAddrBits, + IN UINTN LinearAddress + ) +{ + UINT64 PhysicalAddress; + UINT64 *Pml4TableEntry; + UINT64 *PageDirPtrTableEntry; + UINT64 *PageDirEntry; + UINT64 *PageTableEntry; + + // + // In 4-level paging mode, linear addresses are 48 bits wide + // + if ((UINT64)LinearAddress > (1ULL << 48) - 1) { + return FALSE; + } + + // + // Calculate physical address of PML4E + // + PhysicalAddress =3D (UINT64)Cr3 & (((1ULL << MaxPhyAddrBits) - 1) << 12); + PhysicalAddress |=3D (((UINT64)LinearAddress >> 39) & 0x1FF) << 3; + + ASSERT ((PhysicalAddress & (sizeof (*Pml4TableEntry) - 1)) =3D=3D 0); + + Pml4TableEntry =3D (UINT64 *)(UINTN)PhysicalAddress; + + // + // Check if a PDPTE is present + // + if ((*Pml4TableEntry & BIT0) =3D=3D 0) { + return FALSE; + } + + // + // Calculate physical address of PDPTE + // + PhysicalAddress =3D *Pml4TableEntry & (((1ULL << MaxPhyAddrBits) - 1) <<= 12); + PhysicalAddress |=3D (((UINT64)LinearAddress >> 30) & 0x1FF) << 3; + + ASSERT ((PhysicalAddress & (sizeof (*PageDirPtrTableEntry) - 1)) =3D=3D = 0); + + PageDirPtrTableEntry =3D (UINT64 *)(UINTN)PhysicalAddress; + + // + // Check whether a PDPTE or 1GiB page entry is present + // + if ((*PageDirPtrTableEntry & BIT0) =3D=3D 0) { + return FALSE; + } + + // + // Check if PDPTE maps an 1GiB page + // + if ((*PageDirPtrTableEntry & BIT7) !=3D 0) { + return TRUE; + } + + // + // Calculate physical address of PDE + // + PhysicalAddress =3D *PageDirPtrTableEntry & (((1ULL << MaxPhyAddrBits) -= 1) << + 12); + PhysicalAddress |=3D (((UINT64)LinearAddress >> 21) & 0x1FF) << 3; + + ASSERT ((PhysicalAddress & (sizeof (*PageDirEntry) - 1)) =3D=3D 0); + + PageDirEntry =3D (UINT64 *)(UINTN)PhysicalAddress; + + // + // Check whether a PDE or a 2MiB page entry is present + // + if ((*PageDirEntry & BIT0) =3D=3D 0) { + return FALSE; + } + + // + // Check if PDE maps a 2MiB page + // + if ((*PageDirEntry & BIT7) !=3D 0) { + return TRUE; + } + + // + // Calculate physical address of PTE + // + PhysicalAddress =3D *PageDirEntry & (((1ULL << MaxPhyAddrBits) - 1) << 1= 2); + PhysicalAddress |=3D (((UINT64)LinearAddress >> 12) & 0x1FF) << 3; + + ASSERT ((PhysicalAddress & (sizeof (*PageTableEntry) - 1)) =3D=3D 0); + + PageTableEntry =3D (UINT64 *)(UINTN)PhysicalAddress; + + // + // Check if PTE maps a 4KiB page + // + if ((*PageTableEntry & BIT0) =3D=3D 0) { + return FALSE; + } + + return TRUE; +} + +/** + Check if a linear address is valid by walking the page tables in 32-bit = paging + mode. + + @param[in] Cr3 CR3 control register. + @param[in] Cr4 CR4 control register. + @param[in] LinearAddress Linear address to be checked. +**/ +STATIC +BOOLEAN +Do32BitPagingModeCheck ( + IN UINTN Cr3, + IN UINTN Cr4, + IN UINTN LinearAddress + ) +{ + UINT64 PhysicalAddress; + UINT32 *PageDirEntry; + UINT32 *PageTableEntry; + + if (LinearAddress > MAX_UINT32) { + return FALSE; + } + + // + // Calculate physical address of PDE + // + PhysicalAddress =3D (UINT32)Cr3 & (((1ULL << 20) - 1) << 12); + PhysicalAddress |=3D (((UINT32)LinearAddress >> 22) & 0x3FF) << 2; + + ASSERT ((PhysicalAddress & (sizeof (*PageDirEntry) - 1)) =3D=3D 0); + + PageDirEntry =3D (UINT32 *)(UINTN)PhysicalAddress; + + // + // Check whether a PTE or a 4MiB page is present + // + if ((*PageDirEntry & BIT0) =3D=3D 0) { + return FALSE; + } + + // + // Check if PDE maps a 4MiB page + // + if ((Cr4 & BIT4) !=3D 0 && (*PageDirEntry & BIT7) !=3D 0) { + return TRUE; + } + + // + // Calculate physical address of PTE + // + PhysicalAddress =3D *PageDirEntry & (((1ULL << 20) - 1) << 12); + PhysicalAddress |=3D (((UINT32)LinearAddress >> 12) & 0x3FF) << 2; + + ASSERT ((PhysicalAddress & (sizeof (*PageTableEntry) - 1)) =3D=3D 0); + + PageTableEntry =3D (UINT32 *)(UINTN)PhysicalAddress; + + // + // Check if PTE maps a 4KiB page + // + if ((*PageTableEntry & BIT0) =3D=3D 0) { + return FALSE; + } + + return TRUE; +} + +/** + Check if a linear address is valid by walking the page tables in PAE pag= ing + mode. + + @param[in] Cr3 CR3 control register. + @param[in] MaxPhyAddrBits MAXPHYADDRBITS bits. + @param[in] LinearAddress Linear address to be checked. +**/ +STATIC +BOOLEAN +DoPAEPagingModeCheck ( + IN UINTN Cr3, + IN UINT8 MaxPhyAddrBits, + IN UINTN LinearAddress + ) +{ + UINT64 PhysicalAddress; + UINT64 *PageDirPtrTableEntry; + UINT64 *PageDirEntry; + UINT64 *PageTableEntry; + + if (LinearAddress > MAX_UINT32) { + return FALSE; + } + + // + // Calculate physical address of PDPTE + // + PhysicalAddress =3D (UINT32)Cr3 >> 5; + + // + // Select PDPTE register + // + PhysicalAddress +=3D + ((UINT32)LinearAddress >> 30) * sizeof (*PageDirPtrTableEntry); + + PageDirPtrTableEntry =3D (UINT64 *)(UINTN)PhysicalAddress; + + // + // Check if PDE is present + // + if ((*PageDirPtrTableEntry & BIT0) =3D=3D 0) { + return FALSE; + } + + PhysicalAddress =3D *PageDirPtrTableEntry & (((1ULL << MaxPhyAddrBits) -= 1) << + 12); + PhysicalAddress |=3D ((LinearAddress >> 21) & 0x1FF) << 3; + ASSERT ((PhysicalAddress & (sizeof (*PageDirEntry) - 1)) =3D=3D 0); + + PageDirEntry =3D (UINT64 *)(UINTN)PhysicalAddress; + + // + // Check whether a PTE or a 2MiB page is present + // + if ((*PageDirEntry & BIT0) =3D=3D 0) { + return FALSE; + } + + // + // Check if PDE maps a 2MiB page + // + if ((*PageDirEntry & BIT7) !=3D 0) { + return TRUE; + } + + // + // Calculate physical address of PTE + // + PhysicalAddress =3D *PageDirEntry & (((1ULL << MaxPhyAddrBits) - 1) << 1= 2); + PhysicalAddress |=3D ((LinearAddress >> 12) & 0x1FF) << 3; + ASSERT ((PhysicalAddress & (sizeof (*PageTableEntry) - 1)) =3D=3D 0); + + PageTableEntry =3D (UINT64 *)(UINTN)PhysicalAddress; + + // + // Check if PTE maps a 4KiB page + // + if ((*PageTableEntry & BIT0) =3D=3D 0) { + return FALSE; + } + + return TRUE; +} + +/** + Check if a linear address is valid. + + @param[in] Cr0 CR0 control register. + @param[in] Cr3 CR3 control register. + @param[in] Cr4 CR4 control register. + @param[in] LinearAddress Linear address to be checked. +**/ +BOOLEAN +IsLinearAddressValid ( + IN UINTN Cr0, + IN UINTN Cr3, + IN UINTN Cr4, + IN UINTN LinearAddress + ) +{ + UINT32 Eax; + UINT32 Edx; + UINT8 MaxPhyAddrBits; + MSR_IA32_EFER_REGISTER Msr; + BOOLEAN AddressValid; + + // + // Check for valid input parameters + // + if (Cr0 =3D=3D 0 || Cr4 =3D=3D 0 || LinearAddress =3D=3D 0) { + return FALSE; + } + + // + // Check if paging is disabled + // + if ((Cr0 & BIT31) =3D=3D 0) { + // + // If CR4.PAE bit is set, then the linear (or physical) address suppor= ts + // only up to 36 bits. + // + if (((Cr4 & BIT5) !=3D 0 && (UINT64)LinearAddress > 0xFFFFFFFFFULL) || + LinearAddress > 0xFFFFFFFF) { + return FALSE; + } + + return TRUE; + } + + // + // Paging can be enabled only if CR0.PE bit is set + // + if ((Cr0 & BIT0) =3D=3D 0) { + return FALSE; + } + + // + // CR3 register cannot be zero if paging is enabled + // + if (Cr3 =3D=3D 0) { + return FALSE; + } + + // + // Get MAXPHYADDR bits + // + AsmCpuid (0x80000000, &Eax, NULL, NULL, NULL); + if (Eax >=3D 0x80000008) { + AsmCpuid (0x80000008, &Eax, NULL, NULL, NULL); + MaxPhyAddrBits =3D (UINT8)Eax; + } else { + AsmCpuid (1, NULL, NULL, NULL, &Edx); + if ((Edx & BIT6) !=3D 0) { + MaxPhyAddrBits =3D 36; + } else { + MaxPhyAddrBits =3D 32; + } + } + + ASSERT (MaxPhyAddrBits > 0); + + AddressValid =3D FALSE; + + // + // check if CR4.PAE bit is not set + // + if ((Cr4 & BIT5) =3D=3D 0) { + // + // Check if linear address is valid in 32-bit paging mode + // + AddressValid =3D Do32BitPagingModeCheck (Cr3, Cr4, LinearAddress); + } else { + if (MaxPhyAddrBits > 52) { + return FALSE; + } + + Msr.Uint64 =3D AsmReadMsr64 (MSR_IA32_EFER); + + if (Msr.Bits.LME =3D=3D 0) { + // + // Check if linear address is valid in PAE paging mode + // + AddressValid =3D DoPAEPagingModeCheck (Cr3, MaxPhyAddrBits, LinearAd= dress); + } else { + // + // Check if linear address is valid in 4-level paging mode + // + AddressValid =3D Do4LevelPagingModeCheck (Cr3, MaxPhyAddrBits, + LinearAddress); + } + } + + return AddressValid; +} diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h= b/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h index ec46c2d9d3..1b51034c25 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h @@ -330,5 +330,21 @@ GetPdbFileName ( OUT CHAR8 **PdbFileName ); +/** + Check if a linear address is valid. + + @param[in] Cr0 CR0 control register. + @param[in] Cr3 CR3 control register. + @param[in] Cr4 CR4 control register. + @param[in] LinearAddress Linear address to be checked. +**/ +BOOLEAN +IsLinearAddressValid ( + IN UINTN Cr0, + IN UINTN Cr3, + IN UINTN Cr4, + IN UINTN LinearAddress + ); + #endif -- 2.14.3 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel