From nobody Mon Feb 9 09:32:47 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+61824+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+61824+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1593501873; cv=none; d=zohomail.com; s=zohoarc; b=dpQBZSadSAQDVuDY2OdFraxsd0JygjGbUWAJ30dDsaoKSFT/lG9JZy6wgpytTb57P2lYYrR63Ra7iZeNVLe2QzfZy7oXKDOtBSzu5hq3Boar5akTnim/P8+QCddlt+3yCE9AF2wn1VZrwDVBlUgYM9AblThHt53iUe4qi1fx8YA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593501873; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=yg10+77o7Nnv+oB6l+BQTDEHftjCrJUoZrW9CcT2M5s=; b=lWE1EC7+Ykn2VW3K3C/l3WACh3UzvtCig/s6EEk9MAOCPsRw9ETE5ggS3+u7W27incSUv/y/qfqmJD/vvT50rKgfE6VgqECQVYuj58KCNNFV5x8lgBbByv/ARSLG4aMYZ5jijdfiz2FsT9ztpIGpEvF4sIazztNgXQeWWaAsQwQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+61824+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 159350187338134.28315054967743; Tue, 30 Jun 2020 00:24:33 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id utl2YY1788612xVk1aXPhM9j; Tue, 30 Jun 2020 00:24:33 -0700 X-Received: from mga17.intel.com (mga17.intel.com []) by mx.groups.io with SMTP id smtpd.web12.10277.1593501867582751430 for ; Tue, 30 Jun 2020 00:24:31 -0700 IronPort-SDR: 8VEOpG+o7EAeHE4lHSkSDikaS7fAPvg/0yWhttfGq6uJd0MMUg7a5SRpCYI68YwGNitXzo88HS nd/LaGQHFC/Q== X-IronPort-AV: E=McAfee;i="6000,8403,9666"; a="126292065" X-IronPort-AV: E=Sophos;i="5.75,296,1589266800"; d="scan'208";a="126292065" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Jun 2020 00:24:31 -0700 IronPort-SDR: 3hsqVINxl7itFbDiZbzFkIRwcEQfkauPDrohpDWgbNM2DRDUxnekGQYXB/kEOCxAdkrv1FEZmn WAn1bH3+KwWg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,296,1589266800"; d="scan'208";a="320853990" X-Received: from guominji-mobl.ccr.corp.intel.com ([10.238.4.95]) by FMSMGA003.fm.intel.com with ESMTP; 30 Jun 2020 00:24:29 -0700 From: "Guomin Jiang" To: devel@edk2.groups.io Cc: Michael Kubacki , Eric Dong , Ray Ni , Laszlo Ersek , Rahul Kumar Subject: [edk2-devel] [PATCH 2/6] UefiCpuPkg/CpuMpPei: Add GDT and IDT migration support (CVE-2019-11098) Date: Tue, 30 Jun 2020 15:24:18 +0800 Message-Id: <20200630072422.753-3-guomin.jiang@intel.com> In-Reply-To: <20200630072422.753-1-guomin.jiang@intel.com> References: <20200630072422.753-1-guomin.jiang@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,guomin.jiang@intel.com X-Gm-Message-State: cE0vh2W4fqNNq50j7tU1fq88x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1593501873; bh=VyDdrN2uqbYTeAt0EKkzz37J+/e2UXU90wAYY0hMaMg=; h=Cc:Date:From:Reply-To:Subject:To; b=c/4XC3YEsTEKkq4W46WfhwnO7is9fl9eD94RiyJ4b9Ob8tEe9wf0NpcFMcVEmaGM0hx cTZ7sUBIh+qU6m/uoUPyAuvdcx/X5U4CEU99h337kP/r1eVENrVK2CX0uWwNCKhL25uyD WVjTijj1napx5D1mj7H4slzqPErZ7t9V4sU= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Michael Kubacki REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D1614 Moves the GDT and IDT to permanent memory in a memory discovered callback. This is done to ensure the GDT and IDT authenticated in pre-memory is not fetched from outside a verified location after the permanent memory transition. Cc: Eric Dong Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Signed-off-by: Michael Kubacki --- UefiCpuPkg/CpuMpPei/CpuMpPei.c | 40 ++++++++++++++++++- UefiCpuPkg/CpuMpPei/CpuMpPei.h | 13 ++++++ UefiCpuPkg/CpuMpPei/CpuPaging.c | 14 +++++-- .../Ia32/ArchExceptionHandler.c | 4 +- .../SecPeiCpuException.c | 2 +- 5 files changed, 65 insertions(+), 8 deletions(-) diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c index 07ccbe7c6a91..2d6f1bc98851 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c @@ -429,6 +429,44 @@ GetGdtr ( AsmReadGdtr ((IA32_DESCRIPTOR *)Buffer); } =20 +/** + Migrates the Global Descriptor Table (GDT) to permanent memory. + + @retval EFI_SUCCESS The GDT was migrated successfully. + @retval EFI_OUT_OF_RESOURCES The GDT could not be migrated due to lac= k of available memory. + +**/ +EFI_STATUS +EFIAPI +MigrateGdt ( + VOID + ) +{ + EFI_STATUS Status; + UINTN GdtBufferSize; + IA32_DESCRIPTOR Gdtr; + UINT8 *GdtBuffer; + + AsmReadGdtr ((IA32_DESCRIPTOR *) &Gdtr); + GdtBufferSize =3D sizeof (IA32_TSS_DESCRIPTOR) + Gdtr.Limit + 1; + + Status =3D PeiServicesAllocatePool ( + GdtBufferSize, + (VOID **) &GdtBuffer + ); + ASSERT (GdtBuffer !=3D NULL); + if (EFI_ERROR (Status)) { + return EFI_OUT_OF_RESOURCES; + } + + GdtBuffer =3D ALIGN_POINTER (GdtBuffer, sizeof (IA32_TSS_DESCRIPTOR)); + CopyMem ((VOID *) (UINTN) GdtBuffer, (VOID *) Gdtr.Base, Gdtr.Limit + 1); + Gdtr.Base =3D (UINT32)(UINTN) GdtBuffer; + AsmWriteGdtr (&Gdtr); + + return EFI_SUCCESS; +} + /** Initializes CPU exceptions handlers for the sake of stack switch require= ment. =20 @@ -644,7 +682,7 @@ InitializeCpuMpWorker ( &gEfiVectorHandoffInfoPpiGuid, 0, NULL, - (VOID **)&VectorHandoffInfoPpi + (VOID **) &VectorHandoffInfoPpi ); if (Status =3D=3D EFI_SUCCESS) { VectorInfo =3D VectorHandoffInfoPpi->Info; diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.h b/UefiCpuPkg/CpuMpPei/CpuMpPei.h index 7d5c527d6006..5dc956409594 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h @@ -397,6 +397,19 @@ SecPlatformInformation2 ( OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2 ); =20 +/** + Migrates the Global Descriptor Table (GDT) to permanent memory. + + @retval EFI_SUCCESS The GDT was migrated successfully. + @retval EFI_OUT_OF_RESOURCES The GDT could not be migrated due to lac= k of available memory. + +**/ +EFI_STATUS +EFIAPI +MigrateGdt ( + VOID + ); + /** Initializes MP and exceptions handlers. =20 diff --git a/UefiCpuPkg/CpuMpPei/CpuPaging.c b/UefiCpuPkg/CpuMpPei/CpuPagin= g.c index a462e7ee1e38..d0cbebf70bbf 100644 --- a/UefiCpuPkg/CpuMpPei/CpuPaging.c +++ b/UefiCpuPkg/CpuMpPei/CpuPaging.c @@ -152,7 +152,7 @@ GetPhysicalAddressWidth ( Get the type of top level page table. =20 @retval Page512G PML4 paging. - @retval Page1G PAE paing. + @retval Page1G PAE paging. =20 **/ PAGE_ATTRIBUTE @@ -582,7 +582,7 @@ SetupStackGuardPage ( } =20 /** - Enabl/setup stack guard for each processor if PcdCpuStackGuard is set to= TRUE. + Enable/setup stack guard for each processor if PcdCpuStackGuard is set t= o TRUE. =20 Doing this in the memory-discovered callback is to make sure the Stack G= uard feature to cover as most PEI code as possible. @@ -602,8 +602,14 @@ MemoryDiscoveredPpiNotifyCallback ( IN VOID *Ppi ) { - EFI_STATUS Status; - BOOLEAN InitStackGuard; + EFI_STATUS Status; + BOOLEAN InitStackGuard; + BOOLEAN InterruptState; + + InterruptState =3D SaveAndDisableInterrupts (); + Status =3D MigrateGdt (); + ASSERT_EFI_ERROR (Status); + SetInterruptState (InterruptState); =20 // // Paging must be setup first. Otherwise the exception TSS setup during = MP diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHa= ndler.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandl= er.c index 1aafb7dac139..903449e0daa9 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c @@ -18,8 +18,8 @@ **/ VOID ArchUpdateIdtEntry ( - IN IA32_IDT_GATE_DESCRIPTOR *IdtEntry, - IN UINTN InterruptHandler + OUT IA32_IDT_GATE_DESCRIPTOR *IdtEntry, + IN UINTN InterruptHandler ) { IdtEntry->Bits.OffsetLow =3D (UINT16)(UINTN)InterruptHandler; diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c= b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c index 20148db74cf8..d4ae153c5742 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c @@ -87,7 +87,7 @@ InitializeCpuExceptionHandlers ( IdtEntryCount =3D (IdtDescriptor.Limit + 1) / sizeof (IA32_IDT_GATE_DESC= RIPTOR); if (IdtEntryCount > CPU_EXCEPTION_NUM) { // - // CPU exeption library only setup CPU_EXCEPTION_NUM exception handler= at most + // CPU exception library only setup CPU_EXCEPTION_NUM exception handle= r at most // IdtEntryCount =3D CPU_EXCEPTION_NUM; } --=20 2.25.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#61824): https://edk2.groups.io/g/devel/message/61824 Mute This Topic: https://groups.io/mt/75209406/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-