From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mx.groups.io with SMTP id smtpd.web11.95555.1679645270512955904 for ; Fri, 24 Mar 2023 01:07:50 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=ZiYwDabN; spf=pass (domain: intel.com, ip: 134.134.136.100, mailfrom: ray.ni@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1679645270; x=1711181270; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=6MYXGst6cu65shuVn8F3g6cifBOxpQL7DLvYupI4/qM=; b=ZiYwDabN3y3sk9+A1V/0xACrfytH5yTKToQ1cSr05NrI7Lw15dg5GIEd eawV6tikGU9IiamZrRAAk/qlHauSUcWNuSQAgrKJp5oYhpf7I9882y83o KXxV84p5OhHc53Ube6BOA0xefaJoi4oJm0x6O4b2oMw3fbBsX2R7bGE4U mBilKOocys5vrWexYePEeDoW35eg9LX2v6/Fi5hbINk+0epGitpOsOID9 ig2Brd3KrK3MLShdd4T/K9uVwkTvVVI49OxELoJVXAsxgf9qlzcERWsSw ff9xd5tvLkvO7BPS/UhCPDzj+ooycSApTE7SbYdL9trkeZwdvhKuuv+xY A==; X-IronPort-AV: E=McAfee;i="6600,9927,10658"; a="404639939" X-IronPort-AV: E=Sophos;i="5.98,287,1673942400"; d="scan'208";a="404639939" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Mar 2023 01:07:49 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10658"; a="747060501" X-IronPort-AV: E=Sophos;i="5.98,287,1673942400"; d="scan'208";a="747060501" Received: from orsmsx603.amr.corp.intel.com ([10.22.229.16]) by fmsmga008.fm.intel.com with ESMTP; 24 Mar 2023 01:07:49 -0700 Received: from orsmsx611.amr.corp.intel.com (10.22.229.24) by ORSMSX603.amr.corp.intel.com (10.22.229.16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Fri, 24 Mar 2023 01:07:48 -0700 Received: from orsmsx612.amr.corp.intel.com (10.22.229.25) by ORSMSX611.amr.corp.intel.com (10.22.229.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Fri, 24 Mar 2023 01:07:48 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx612.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21 via Frontend Transport; Fri, 24 Mar 2023 01:07:48 -0700 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (104.47.55.177) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.21; Fri, 24 Mar 2023 01:07:48 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=aG4LWWnGkEv6UU9uHO/YWZUBmplDL9iYu50lGVMDDU9GIE6qcpHji4olLjv8FNAId+iDPUD80tzLdL+JfChqjmACThTKKCGs9MlR6ttetNE5LE4M5XTfMqFf6EKxuMlnSIWOKqWtaE+PVa1k2o/Bx2OqsP5r3WksDxLdOusM/SqD+1qAIFDogvytENK5SA23jASVQBxZRJU3vd8ZowbBXoih/nIq7762C8svct+as43bOkqMqixqLKa5u+zWfgH7pqdHz0X4vfpiEmIOfGlWQ6OdtxANyFRi0nssQzx9F8sYjVTVp1Asx8o0U5Q1dRZgWVzkCK2KDC/fa2Tki2eVbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=yR3G7sIKUNoKhpRklxECEieTia/oJMTiSEdDuI9U3rk=; b=DtCw51LvWfB+f8JiFKJfKBdbX15VohMhFbpsQWjmMlgQ6ju87KDu4/PF0k6zzPN2di0B/rhweZvny6FezR+oGbbkTFUZP4kQqF7wldTebs0zafFHDh9hz5liaeGBP+TjXLqS7ZXG8Ctz7MXWtx24SdPsm5Ac5QgCKpZPwawtWf+gwisJCevdk0/4Fh0SkoK9iJpL9BcNdpq8VTFg/gEmMUCDKLAQgDIvxRXN8T4gPxUddDurPVWyd1XZJw2Q0sANqe1s+bMYCrTFIAyEPiyhddduSxxpNqGSzkfQaIBUv46BcNaL0IfCDTA6QZVLedjxYW1ATB9uumu01r1nc83qpA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from MN6PR11MB8244.namprd11.prod.outlook.com (2603:10b6:208:470::14) by PH8PR11MB6705.namprd11.prod.outlook.com (2603:10b6:510:1c4::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6178.37; Fri, 24 Mar 2023 08:07:46 +0000 Received: from MN6PR11MB8244.namprd11.prod.outlook.com ([fe80::ae07:e96a:4a24:8a69]) by MN6PR11MB8244.namprd11.prod.outlook.com ([fe80::ae07:e96a:4a24:8a69%7]) with mapi id 15.20.6178.037; Fri, 24 Mar 2023 08:07:46 +0000 From: "Ni, Ray" To: "Tan, Dun" , "devel@edk2.groups.io" CC: "Dong, Eric" , "Kumar, Rahul R" , Gerd Hoffmann , "Liu, Zhiguang" Subject: Re: [Patch V5 12/22] UefiCpuPkg/CpuPageTableLib:Modify RandomTest to check Mask/Attr Thread-Topic: [Patch V5 12/22] UefiCpuPkg/CpuPageTableLib:Modify RandomTest to check Mask/Attr Thread-Index: AQHZXhYIl53WDUaJn0C5ZWw+5HLhkq8Jkz/Q Date: Fri, 24 Mar 2023 08:07:45 +0000 Message-ID: References: <20230324060020.940-1-dun.tan@intel.com> <20230324060020.940-13-dun.tan@intel.com> In-Reply-To: <20230324060020.940-13-dun.tan@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MN6PR11MB8244:EE_|PH8PR11MB6705:EE_ x-ms-office365-filtering-correlation-id: 808b23ba-8c41-4bff-84ca-08db2c3ed9f7 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: Grut3A5fRZ9Vlw8N14jtfZ5oo07MS3p4YjxaCL2CztXKqGqBHYa6CzWiWEDFZCCTzBPMr87zhf84hnsVhMO6DGoI1gnA+JM3GnpXmWf4xGNECQ/OO2EC3g/CGxzU4/udQnXTJMKcdlILQMFtJ1Qylg49OojpqUoxYHF/3hFNKHHhDhMz9CIYiO51+IBNLNP95k09uGu3ParQYvLIM6Sw1xKp5hZU6j60crzO2ORtVdRN7I9EyKPOGH4n3oVIR9m7Zje1fDeGtP2jGB0MPlJXQUeim48qN+kd5g/9l9NweDJ2Ah6CXnmXEL/YME/vymXWs1ic2cFc9cWRozHWI+bJ4dlbrJbXcw5sBhbC41QwMHzGybdJGC03T5Qke1WgvFDyZuLvQocO3GxPSdZ+d15akgzg+kuFtedORxcEDioFWtmTpUo5GP4kOunVFXekDcPfZvKhFaPZ+iyppwRVKLxBrdeGscpXv+1uCyNZ/pzPf2oIjtVOE8K6s+uLcKxXr3Ulnd2jYS5cLv80qoPPyheNCDzAolBiil1QnQ6Ll8E4KBZ5velAtoeJ8r0R7Ov+5LMPOEld8djfs0YOUN4zUZND6sAC+KbWUEBG5kINv+8FzQKJdt6imUGNg7Ai5oQbM7kdMeBbJ9P84rcWXz5MEH1/xtVuiWLdp76TmB2NpSpx/L2GorvEF2MhTLbia9tBjaqqRssxzqmzCIyw9xbniOKN/w== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN6PR11MB8244.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230025)(346002)(396003)(366004)(136003)(39860400002)(376002)(451199018)(33656002)(186003)(26005)(6506007)(107886003)(53546011)(83380400001)(86362001)(38070700005)(2906002)(66946007)(66556008)(66446008)(71200400001)(76116006)(64756008)(54906003)(9686003)(8676002)(110136005)(66476007)(55016003)(4326008)(82960400001)(122000001)(478600001)(38100700002)(41300700001)(316002)(7696005)(52536014)(5660300002)(8936002);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?boLQ0yChyAv+SVPagqkYgkEnN//B1b5AFujdQ7qAp1iQFdlFZwnktzfvTaZ6?= =?us-ascii?Q?X4advCRXLt/V32WduqjymyiTkgbdV9vkJ+rRw99roicUHgwqr9nyfmFCb7s1?= =?us-ascii?Q?3IakFu24Gdu/mq7UdbS9F2xEQqyAStEw2t8t+0ygDdAM2dGaNZgpbcNxEO5m?= =?us-ascii?Q?raU+Vq8TyqqBGW+8XKBnK6oH0EoiqBfLvwdOjq96t7voYLT4iHOD0ZQFNovw?= =?us-ascii?Q?jMDF45QaFS2awoO4hh9OSMElspdS8CbzxYr4FkbcwXIUzgtFuJM50vGxIUO5?= =?us-ascii?Q?na+7ZFRtyQHtG3ucGL9zD93bbvQWK4WKVflutpBe8C4KWQ9mCoiy/HwPo6nN?= =?us-ascii?Q?kzbyZSSnB1jZbQSN5TDu+OTK83donI2IbVnPi7Iyu7IXBcd3Ehc4EGrbEi5+?= =?us-ascii?Q?spg7j8V8DAh7OMG+zklXFGosmbXh4iADb3g4ZH4xLZoJgBNBTgnqedq0tMZV?= =?us-ascii?Q?7Q0Z1eiZEZkTt10wQeheqBLLE9GNhNsh9Q+ebM3cTYSbyiQTJciZhGUSdnYP?= =?us-ascii?Q?dXFZrxLveDtYwv2PLwOYB7o8vc6ro6Fk1RsynqIEw2SW1KVuAr4v8zeJodIn?= =?us-ascii?Q?namGK36bxtKXe3YNkQ8KkmemKFHe4YnfYNeqm8V9Ftu3H3+UpeHmU2mk8onT?= =?us-ascii?Q?SPBTn5jG6IIg01L7JpkjY0ReONIZXDwFFqb5NzVmpGQSSROnrWiiWOaaCY5s?= =?us-ascii?Q?LdfAkHwVRdByZLTNi3pEkqXuz1eUL5QhNZSCStgdxRBc/hN1QyA3STl9S4jB?= =?us-ascii?Q?A2ENRu3v24j4JI4B7HCVJP6VPjBzzoirLE1b5kGpl4O18nuc/RAVvUcinbjl?= =?us-ascii?Q?7FK2ICKjNJPZZISBBxhgKIaGUwjjQnb6nbayBnndvdVfuGNhxMs17IXL7S1L?= =?us-ascii?Q?7ntj346Dk7mpvlnQphWX3Cso0z0bDhTwUT8V9KgeXkUD/+R9MAbI2ud2pkJE?= =?us-ascii?Q?eNn1w3h/pTKGpb1nKhyqYH+VdTtVysXzsDM5WOM0vXTm9LMFfpMEn6h6vUey?= =?us-ascii?Q?B7Ed60G0yRhDNNcpmb7Nma21q0R8fvjvnEDCLm514pJo5SGp5QZhMhBjvQ7O?= =?us-ascii?Q?Epgnm+FDSwHJn7LT6V05+fe42yjWeqY2Rb8r55coHSzykR9tSfStbGDpS7bp?= =?us-ascii?Q?TFkDZrLhUSWrLRThiv6+uET6ukfA8BabYLwdVHX30M9rEm5sR4lXHJg9E9if?= =?us-ascii?Q?1hJd5BO6O1eTZqKHFKXMZUT5qKg64RSu3E/uUB1M2dLwMJchg29I1/TnLL4v?= =?us-ascii?Q?RX3iFM1qBCtvxf5ANDZFlRYThUss/jLa+NrWPxmTIF20hd3mCjwp8YQIC7TR?= =?us-ascii?Q?ncplF4HgN/JjhZisGAu7E2UQw0OEaSqZqyYa8ZtqTz2lxew4m3u4MVW+InLg?= =?us-ascii?Q?NkwBxjYdfMzOtt47YZ7/QelXxQmPnnBI1LC4kR6wPA0LFQtGkNjMq9GtV107?= =?us-ascii?Q?AssfiHHsbg85CFQ98x/OyI7XGE1H6/mD87+qr6cErXsKuW1XbZUbT211X1Da?= =?us-ascii?Q?gdQeTUbwVrC8xa/rcSA2Fu2Wz3hpbUdIS1uPZ9E0MRrXQdY+DAkwRoGkrPSV?= =?us-ascii?Q?jGgLIBV434zmXW32DnI=3D?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MN6PR11MB8244.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 808b23ba-8c41-4bff-84ca-08db2c3ed9f7 X-MS-Exchange-CrossTenant-originalarrivaltime: 24 Mar 2023 08:07:45.9216 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: xxaPiisN7b/bbepUZ0KVQo2+SKiLRNZJA9HRKfhhBsVQ8S65OPI0e7/eaIKUNXIfx9umTCoQ0sja58GEEBO2Kw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR11MB6705 Return-Path: ray.ni@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Ray Ni > -----Original Message----- > From: Tan, Dun > Sent: Friday, March 24, 2023 2:00 PM > To: devel@edk2.groups.io > Cc: Dong, Eric ; Ni, Ray ; Kumar, > Rahul R ; Gerd Hoffmann ; > Liu, Zhiguang > Subject: [Patch V5 12/22] UefiCpuPkg/CpuPageTableLib:Modify RandomTest > to check Mask/Attr >=20 > Modify RandomTest to check invalid input. When creating new page > table or updating exsiting page table: > 1.If set [LinearAddress, LinearAddress+Length] to non-present, all > other attributes should not be provided. > 2.If [LinearAddress, LinearAddress+Length] contain non-present range, > the Returnstatus of PageTableMap() should be InvalidParameter when: > 2.1Some of attributes are not provided when mapping non-present range > to present. > 2.2Set any other attribute without setting the non-present range to > Present. >=20 > Signed-off-by: Dun Tan > Cc: Eric Dong > Cc: Ray Ni > Cc: Rahul Kumar > Tested-by: Gerd Hoffmann > Acked-by: Gerd Hoffmann > Cc: Zhiguang Liu > --- > UefiCpuPkg/Library/CpuPageTableLib/UnitTest/RandomTest.c | 153 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++------------------------- > UefiCpuPkg/Library/CpuPageTableLib/UnitTest/TestHelper.c | 6 +++++- > 2 files changed, 133 insertions(+), 26 deletions(-) >=20 > diff --git a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/RandomTest.c > b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/RandomTest.c > index 612fddcee0..121cc4f2b2 100644 > --- a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/RandomTest.c > +++ b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/RandomTest.c > @@ -273,6 +273,27 @@ ValidateAndRandomeModifyPageTable ( > return Status; > } >=20 > +/** > + Remove the last MAP_ENTRY in MapEntrys. > + > + @param MapEntrys Pointer to MapEntrys buffer > +**/ > +VOID > +RemoveLastMapEntry ( > + IN OUT MAP_ENTRYS *MapEntrys > + ) > +{ > + UINTN MapsIndex; > + > + if (MapEntrys->Count =3D=3D 0) { > + return; > + } > + > + MapsIndex =3D MapEntrys->Count - 1; > + ZeroMem (&(MapEntrys->Maps[MapsIndex]), sizeof (MAP_ENTRY)); > + MapEntrys->Count =3D MapsIndex; > +} > + > /** > Generate single random map entry. > The map entry can be the input of function PageTableMap > @@ -327,7 +348,16 @@ GenerateSingleRandomMapEntry ( > MapEntrys->Maps[MapsIndex].Mask.Uint64 =3D MapEntrys- > >Maps[Random32 (0, (UINT32)MapsIndex-1)].Mask.Uint64; > } else { > MapEntrys->Maps[MapsIndex].Attribute.Uint64 =3D Random64 (0, > MAX_UINT64) & mSupportedBit.Uint64; > - MapEntrys->Maps[MapsIndex].Mask.Uint64 =3D Random64 (0, > MAX_UINT64) & mSupportedBit.Uint64; > + if (RandomBoolean (5)) { > + // > + // The probability to get random Mask should be small since all bi= ts of a > random number > + // have a high probability of containing 0, which may be a invalid= input. > + // > + MapEntrys->Maps[MapsIndex].Mask.Uint64 =3D Random64 (0, > MAX_UINT64) & mSupportedBit.Uint64; > + } else { > + MapEntrys->Maps[MapsIndex].Mask.Uint64 =3D MAX_UINT64; > + } > + > if (MapEntrys->Maps[MapsIndex].Mask.Bits.ProtectionKey !=3D 0) { > MapEntrys->Maps[MapsIndex].Mask.Bits.ProtectionKey =3D 0xF; > } > @@ -337,15 +367,7 @@ GenerateSingleRandomMapEntry ( > MapEntrys->Maps[MapsIndex].Attribute.Bits.PageTableBaseAddress =3D > MapEntrys->Maps[MapsIndex].LinearAddress >> 12; > MapEntrys->Maps[MapsIndex].Mask.Bits.PageTableBaseAddress =3D > 0xFFFFFFFFFF; > } else { > - // > - // Todo: If the mask bit for base address is zero, when dump the > pagetable, every entry mapping to physical address zeor. > - // This means the map count will be a large number, and imposs= ible to > finish in proper time. > - // Need to avoid such case when remove the Random option > ONLY_ONE_ONE_MAPPING > - // > MapEntrys->Maps[MapsIndex].Attribute.Bits.PageTableBaseAddress =3D > (Random64 (0, (((UINT64)1)<<52) - 1) & AlignedTable[Random32 (0, > ARRAY_SIZE (AlignedTable) -1)])>> 12; > - if (RandomBoolean (50)) { > - MapEntrys->Maps[MapsIndex].Mask.Bits.PageTableBaseAddress =3D 0; > - } > } >=20 > MapEntrys->Count +=3D 1; > @@ -608,25 +630,65 @@ SingleMapEntryTest ( > IN UINTN InitMapCount > ) > { > - UINTN MapsIndex; > - RETURN_STATUS Status; > - UINTN PageTableBufferSize; > - VOID *Buffer; > - IA32_MAP_ENTRY *Map; > - UINTN MapCount; > - UINTN Index; > - UINTN KeyPointCount; > - UINTN NewKeyPointCount; > - UINT64 *KeyPointBuffer; > - UINTN Level; > - UINT64 Value; > - UNIT_TEST_STATUS TestStatus; > - MAP_ENTRY *LastMapEntry; > - > - MapsIndex =3D MapEntrys->Count; > + UINTN MapsIndex; > + RETURN_STATUS Status; > + UINTN PageTableBufferSize; > + VOID *Buffer; > + IA32_MAP_ENTRY *Map; > + UINTN MapCount; > + UINTN Index; > + UINTN KeyPointCount; > + UINTN NewKeyPointCount; > + UINT64 *KeyPointBuffer; > + UINTN Level; > + UINT64 Value; > + UNIT_TEST_STATUS TestStatus; > + MAP_ENTRY *LastMapEntry; > + IA32_MAP_ATTRIBUTE *Mask; > + IA32_MAP_ATTRIBUTE *Attribute; > + UINT64 LastNotPresentRegionStart; > + BOOLEAN IsNotPresent; > + > + MapsIndex =3D MapEntrys->Count; > + MapCount =3D 0; > + LastNotPresentRegionStart =3D 0; > + IsNotPresent =3D FALSE; >=20 > GenerateSingleRandomMapEntry (MaxAddress, MapEntrys); > LastMapEntry =3D &MapEntrys->Maps[MapsIndex]; > + Status =3D PageTableParse (*PageTable, PagingMode, NULL, &MapCou= nt); > + > + if (MapCount !=3D 0) { > + UT_ASSERT_EQUAL (Status, RETURN_BUFFER_TOO_SMALL); > + Map =3D AllocatePages (EFI_SIZE_TO_PAGES (MapCount * sizeof > (IA32_MAP_ENTRY))); > + ASSERT (Map !=3D NULL); > + Status =3D PageTableParse (*PageTable, PagingMode, Map, &MapCount); > + } > + > + // > + // Check if the generated MapEntrys->Maps[MapsIndex] contains not- > present range. > + // > + if (LastMapEntry->Length > 0) { > + for (Index =3D 0; Index < MapCount; Index++) { > + if ((LastNotPresentRegionStart < Map[Index].LinearAddress) && > + (LastMapEntry->LinearAddress < Map[Index].LinearAddress) && > (LastMapEntry->LinearAddress + LastMapEntry->Length > > LastNotPresentRegionStart)) > + { > + // > + // MapEntrys->Maps[MapsIndex] contains not-present range in > exsiting page table. > + // > + break; > + } > + > + LastNotPresentRegionStart =3D Map[Index].LinearAddress + > Map[Index].Length; > + } > + > + // > + // Either LastMapEntry overlaps with the not-present region in the v= ery > end > + // Or it overlaps with one in the middle > + if (LastNotPresentRegionStart < LastMapEntry->LinearAddress + > LastMapEntry->Length) { > + IsNotPresent =3D TRUE; > + } > + } >=20 > PageTableBufferSize =3D 0; > Status =3D PageTableMap ( > @@ -639,6 +701,47 @@ SingleMapEntryTest ( > &LastMapEntry->Attribute, > &LastMapEntry->Mask > ); > + > + Attribute =3D &LastMapEntry->Attribute; > + Mask =3D &LastMapEntry->Mask; > + // > + // If set [LinearAddress, LinearAddress+Attribute] to not preset, all > + // other attributes should not be provided. > + // > + if ((LastMapEntry->Length > 0) && (Attribute->Bits.Present =3D=3D 0) &= & > (Mask->Bits.Present =3D=3D 1) && (Mask->Uint64 > 1)) { > + RemoveLastMapEntry (MapEntrys); > + UT_ASSERT_EQUAL (Status, RETURN_INVALID_PARAMETER); > + return UNIT_TEST_PASSED; > + } > + > + // > + // Return Status for non-present range also should be InvalidParameter > when: > + // 1. Some of attributes are not provided when mapping non-present > range to present. > + // 2. Set any other attribute without setting the non-present range to > Present. > + // > + if (IsNotPresent) { > + if ((Mask->Bits.Present =3D=3D 1) && (Attribute->Bits.Present =3D=3D= 1)) { > + // > + // Creating new page table or remapping non-present range to prese= nt. > + // > + if ((Mask->Bits.ReadWrite =3D=3D 0) || (Mask->Bits.UserSupervisor = =3D=3D 0) || > (Mask->Bits.WriteThrough =3D=3D 0) || (Mask->Bits.CacheDisabled =3D=3D 0)= || > + (Mask->Bits.Accessed =3D=3D 0) || (Mask->Bits.Dirty =3D=3D 0) = || (Mask- > >Bits.Pat =3D=3D 0) || (Mask->Bits.Global =3D=3D 0) || > + (Mask->Bits.PageTableBaseAddress =3D=3D 0) || (Mask- > >Bits.ProtectionKey =3D=3D 0) || (Mask->Bits.Nx =3D=3D 0)) > + { > + RemoveLastMapEntry (MapEntrys); > + UT_ASSERT_EQUAL (Status, RETURN_INVALID_PARAMETER); > + return UNIT_TEST_PASSED; > + } > + } else if ((Mask->Bits.Present =3D=3D 0) && (Mask->Uint64 > 1)) { > + // > + // Only change other attributes for non-present range is not permi= tted. > + // > + RemoveLastMapEntry (MapEntrys); > + UT_ASSERT_EQUAL (Status, RETURN_INVALID_PARAMETER); > + return UNIT_TEST_PASSED; > + } > + } > + > if (PageTableBufferSize !=3D 0) { > UT_ASSERT_EQUAL (Status, RETURN_BUFFER_TOO_SMALL); >=20 > diff --git a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/TestHelper.c > b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/TestHelper.c > index 5bd70c0f65..10fdee2f94 100644 > --- a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/TestHelper.c > +++ b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/TestHelper.c > @@ -1,7 +1,7 @@ > /** @file > helper file for Unit tests of the CpuPageTableLib instance of the > CpuPageTableLib class >=20 > - Copyright (c) 2022, Intel Corporation. All rights reserved.
> + Copyright (c) 2022 - 2023, Intel Corporation. All rights reserved.
> SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > **/ > @@ -171,6 +171,10 @@ IsPageTableValid ( > UNIT_TEST_STATUS Status; > IA32_PAGING_ENTRY *PagingEntry; >=20 > + if (PageTable =3D=3D 0) { > + return UNIT_TEST_PASSED; > + } > + > if ((PagingMode =3D=3D Paging32bit) || (PagingMode =3D=3D PagingPae) |= | > (PagingMode >=3D PagingModeMax)) { > // > // 32bit paging is never supported. > -- > 2.31.1.windows.1