From nobody Sat Feb 7 05:14:49 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+54950+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+54950+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1582755148; cv=none; d=zohomail.com; s=zohoarc; b=S27dMMI546RwKPVuZqAstajYBDivO4HJ2HMZ0h5SLajSIki1sYKzyAuhPtDryCTWHfhpzceszHNR8FR6tSWSZ6XEXhpG70B+SeEluBPq5p66KHW1zGc2um2WsxFYQQxly4+rqiXztOZRH4qxsiYY63nLJ54jSIJkjowxDp1I2nY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1582755148; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=41gDx85t+B1HdcjOhC2qlP6G5LA7layUfwLRAhbmc44=; b=TplgQOIRrDeC4qUhWQs6fY6dqGu8fswpK9sPhE1niCeHXwAGb0Dixz0mf1wcpBlkRHo/NYdBmzFcQSzJQC4IbfPcYXszt8eeCgF1Tk92gnPpGbq5olsiM8pu9hF209jCJFPr5pOO2n1LRaagAAaf34GuqYOijYFL3hkAEbGQURM= 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+54950+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 15827551482949.76081564493461; Wed, 26 Feb 2020 14:12:28 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id v1F6YY1788612xo23ehLMiVY; Wed, 26 Feb 2020 14:12:27 -0800 X-Received: from us-smtp-delivery-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.81]) by mx.groups.io with SMTP id smtpd.web09.293.1582755146601753322 for ; Wed, 26 Feb 2020 14:12:26 -0800 X-Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-389-H3J24dOAPvGjKO_9Ut7OBA-1; Wed, 26 Feb 2020 17:12:18 -0500 X-MC-Unique: H3J24dOAPvGjKO_9Ut7OBA-1 X-Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 3D475DB60; Wed, 26 Feb 2020 22:12:17 +0000 (UTC) X-Received: from lacos-laptop-7.usersys.redhat.com (ovpn-116-185.ams2.redhat.com [10.36.116.185]) by smtp.corp.redhat.com (Postfix) with ESMTP id 839B960BEF; Wed, 26 Feb 2020 22:12:15 +0000 (UTC) From: "Laszlo Ersek" To: edk2-devel-groups-io Cc: Ard Biesheuvel , Igor Mammedov , Jiewen Yao , Jordan Justen , Michael Kinney , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [edk2-devel] [PATCH v2 06/16] OvmfPkg/CpuHotplugSmm: introduce skeleton for CPU Hotplug SMM driver Date: Wed, 26 Feb 2020 23:11:46 +0100 Message-Id: <20200226221156.29589-7-lersek@redhat.com> In-Reply-To: <20200226221156.29589-1-lersek@redhat.com> References: <20200226221156.29589-1-lersek@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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,lersek@redhat.com X-Gm-Message-State: GUGhF0kfzARZbbSNWYyrVAyxx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1582755147; bh=41gDx85t+B1HdcjOhC2qlP6G5LA7layUfwLRAhbmc44=; h=Cc:Content-Type:Date:From:Reply-To:Subject:To; b=e0rz+Mou2ktYS7boe8KG8YHBJiVIVvywZ/lOXhUbOCRxOkXuKFf4tUNGPfymBf+MeEN 4QXt3+L+83DuWFpaoe5z95c+kNeYuIx6LQfsp5vX1qgMTIw6IyRLaPdTgVlQARgeErpJp PqjZg8wnV73xuagFnaU4xI1yzm5YIIEYk4w= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" Add a new SMM driver skeleton that registers a root SMI handler, and checks if the SMI control value (written to 0xB2) indicates a CPU hotplug SMI. QEMU's ACPI payload will cause the OS to raise a broadcast SMI when a CPU hotplug event occurs, namely by writing value 4 to IO Port 0xB2. In other words, control value 4 is now allocated for this purpose; introduce the ICH9_APM_CNT_CPU_HOTPLUG macro for it. The standard identifiers in this driver use the new MM (Management Mode) terminology from the PI spec, not the earlier SMM (System Management Mode) terms. Cc: Ard Biesheuvel Cc: Igor Mammedov Cc: Jiewen Yao Cc: Jordan Justen Cc: Michael Kinney Cc: Philippe Mathieu-Daud=C3=A9 Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1512 Signed-off-by: Laszlo Ersek Acked-by: Ard Biesheuvel Reviewed-by: Ard Biesheuvel --- Notes: v2: =20 - Pick up Ard's Acked-by, which is conditional on approval from Intel reviewers on Cc. (I'd like to save Ard the churn of re-acking unmodified patches.) OvmfPkg/OvmfPkgIa32.dsc | 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 1 + OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/OvmfPkgIa32.fdf | 1 + OvmfPkg/OvmfPkgIa32X64.fdf | 1 + OvmfPkg/OvmfPkgX64.fdf | 1 + OvmfPkg/Include/IndustryStandard/Q35MchIch9.h | 5 +- OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf | 48 +++++ OvmfPkg/CpuHotplugSmm/CpuHotplug.c | 191 ++++++++++++++++++++ 9 files changed, 248 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index 8c065ca7cec9..78310da44a5f 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -851,44 +851,45 @@ [Components] =20 OvmfPkg/PlatformDxe/Platform.inf OvmfPkg/IoMmuDxe/IoMmuDxe.inf =20 !if $(SMM_REQUIRE) =3D=3D TRUE OvmfPkg/SmmAccess/SmmAccess2Dxe.inf OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf =20 # # SMM Initial Program Load (a DXE_RUNTIME_DRIVER) # MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf =20 # # SMM_CORE # MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf =20 # # Privileged drivers (DXE_SMM_DRIVER modules) # + OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf { LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf } UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf { SmmCpuPlatformHookLib|OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmC= puPlatformHookLibQemu.inf SmmCpuFeaturesLib|OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLi= b.inf } =20 # # Variable driver stack (SMM) # OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf { NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf } MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf =20 diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 944b785e61a9..428578a4f839 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -865,44 +865,45 @@ [Components.X64] OvmfPkg/PlatformDxe/Platform.inf OvmfPkg/AmdSevDxe/AmdSevDxe.inf OvmfPkg/IoMmuDxe/IoMmuDxe.inf =20 !if $(SMM_REQUIRE) =3D=3D TRUE OvmfPkg/SmmAccess/SmmAccess2Dxe.inf OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf =20 # # SMM Initial Program Load (a DXE_RUNTIME_DRIVER) # MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf =20 # # SMM_CORE # MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf =20 # # Privileged drivers (DXE_SMM_DRIVER modules) # + OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf { LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf } UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf { SmmCpuPlatformHookLib|OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmC= puPlatformHookLibQemu.inf SmmCpuFeaturesLib|OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLi= b.inf } =20 # # Variable driver stack (SMM) # OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf { NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf } MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf =20 diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 8de0f7179784..73b92f259201 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -863,44 +863,45 @@ [Components] OvmfPkg/PlatformDxe/Platform.inf OvmfPkg/AmdSevDxe/AmdSevDxe.inf OvmfPkg/IoMmuDxe/IoMmuDxe.inf =20 !if $(SMM_REQUIRE) =3D=3D TRUE OvmfPkg/SmmAccess/SmmAccess2Dxe.inf OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf =20 # # SMM Initial Program Load (a DXE_RUNTIME_DRIVER) # MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf =20 # # SMM_CORE # MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf =20 # # Privileged drivers (DXE_SMM_DRIVER modules) # + OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf { LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf } UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf { SmmCpuPlatformHookLib|OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmC= puPlatformHookLibQemu.inf SmmCpuFeaturesLib|OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLi= b.inf } =20 # # Variable driver stack (SMM) # OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf { NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf } MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf =20 diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf index 63607551ed75..61b891765c56 100644 --- a/OvmfPkg/OvmfPkgIa32.fdf +++ b/OvmfPkg/OvmfPkgIa32.fdf @@ -301,44 +301,45 @@ [FV.DXEFV] INF MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf =20 !ifdef $(CSM_ENABLE) INF OvmfPkg/Csm/BiosThunk/VideoDxe/VideoDxe.inf INF OvmfPkg/Csm/LegacyBiosDxe/LegacyBiosDxe.inf INF RuleOverride=3DCSM OvmfPkg/Csm/Csm16/Csm16.inf !else INF OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf !endif =20 INF OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf INF OvmfPkg/VirtioGpuDxe/VirtioGpu.inf INF OvmfPkg/PlatformDxe/Platform.inf INF OvmfPkg/IoMmuDxe/IoMmuDxe.inf =20 !if $(SMM_REQUIRE) =3D=3D TRUE INF OvmfPkg/SmmAccess/SmmAccess2Dxe.inf INF OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf INF MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf INF MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf +INF OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf INF UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf INF MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf INF UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf =20 # # Variable driver stack (SMM) # INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf =20 !else =20 # # Variable driver stack (non-SMM) # INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf !endif diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index 0488e5d95ffe..501b4fcb7b67 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -308,44 +308,45 @@ [FV.DXEFV] INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf =20 !ifdef $(CSM_ENABLE) INF OvmfPkg/Csm/BiosThunk/VideoDxe/VideoDxe.inf INF OvmfPkg/Csm/LegacyBiosDxe/LegacyBiosDxe.inf INF RuleOverride=3DCSM OvmfPkg/Csm/Csm16/Csm16.inf !else INF OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf !endif =20 INF OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf INF OvmfPkg/VirtioGpuDxe/VirtioGpu.inf INF OvmfPkg/PlatformDxe/Platform.inf INF OvmfPkg/AmdSevDxe/AmdSevDxe.inf INF OvmfPkg/IoMmuDxe/IoMmuDxe.inf =20 !if $(SMM_REQUIRE) =3D=3D TRUE INF OvmfPkg/SmmAccess/SmmAccess2Dxe.inf INF OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf INF MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf INF MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf +INF OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf INF UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf INF MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf INF UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf =20 # # Variable driver stack (SMM) # INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf =20 !else =20 # # Variable driver stack (non-SMM) # INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf !endif diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index 0488e5d95ffe..501b4fcb7b67 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -308,44 +308,45 @@ [FV.DXEFV] INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf =20 !ifdef $(CSM_ENABLE) INF OvmfPkg/Csm/BiosThunk/VideoDxe/VideoDxe.inf INF OvmfPkg/Csm/LegacyBiosDxe/LegacyBiosDxe.inf INF RuleOverride=3DCSM OvmfPkg/Csm/Csm16/Csm16.inf !else INF OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf !endif =20 INF OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf INF OvmfPkg/VirtioGpuDxe/VirtioGpu.inf INF OvmfPkg/PlatformDxe/Platform.inf INF OvmfPkg/AmdSevDxe/AmdSevDxe.inf INF OvmfPkg/IoMmuDxe/IoMmuDxe.inf =20 !if $(SMM_REQUIRE) =3D=3D TRUE INF OvmfPkg/SmmAccess/SmmAccess2Dxe.inf INF OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf INF UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf INF MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf INF MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf +INF OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf INF UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf INF MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf INF UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf =20 # # Variable driver stack (SMM) # INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf =20 !else =20 # # Variable driver stack (non-SMM) # INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf !endif diff --git a/OvmfPkg/Include/IndustryStandard/Q35MchIch9.h b/OvmfPkg/Includ= e/IndustryStandard/Q35MchIch9.h index cb705fee92ca..73db4b59a111 100644 --- a/OvmfPkg/Include/IndustryStandard/Q35MchIch9.h +++ b/OvmfPkg/Include/IndustryStandard/Q35MchIch9.h @@ -90,37 +90,38 @@ #define POWER_MGMT_REGISTER_Q35(Offset) \ PCI_LIB_ADDRESS (0, 0x1f, 0, (Offset)) =20 #define POWER_MGMT_REGISTER_Q35_EFI_PCI_ADDRESS(Offset) \ EFI_PCI_ADDRESS (0, 0x1f, 0, (Offset)) =20 #define ICH9_PMBASE 0x40 #define ICH9_PMBASE_MASK (BIT15 | BIT14 | BIT13 | BIT12 | BIT11= | \ BIT10 | BIT9 | BIT8 | BIT7) =20 #define ICH9_ACPI_CNTL 0x44 #define ICH9_ACPI_CNTL_ACPI_EN BIT7 =20 #define ICH9_GEN_PMCON_1 0xA0 #define ICH9_GEN_PMCON_1_SMI_LOCK BIT4 =20 #define ICH9_RCBA 0xF0 #define ICH9_RCBA_EN BIT0 =20 // // IO ports // -#define ICH9_APM_CNT 0xB2 -#define ICH9_APM_STS 0xB3 +#define ICH9_APM_CNT 0xB2 +#define ICH9_APM_CNT_CPU_HOTPLUG 0x04 +#define ICH9_APM_STS 0xB3 =20 #define ICH9_CPU_HOTPLUG_BASE 0x0CD8 =20 // // IO ports relative to PMBASE // #define ICH9_PMBASE_OFS_SMI_EN 0x30 #define ICH9_SMI_EN_APMC_EN BIT5 #define ICH9_SMI_EN_GBL_SMI_EN BIT0 =20 #define ICH9_ROOT_COMPLEX_BASE 0xFED1C000 =20 #endif diff --git a/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf b/OvmfPkg/CpuHotplugSm= m/CpuHotplugSmm.inf new file mode 100644 index 000000000000..fa70858a8dab --- /dev/null +++ b/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf @@ -0,0 +1,48 @@ +## @file +# Root SMI handler for VCPU hotplug SMIs. +# +# Copyright (c) 2020, Red Hat, Inc. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 1.29 + PI_SPECIFICATION_VERSION =3D 0x00010046 # P= I-1.7.0 + BASE_NAME =3D CpuHotplugSmm + FILE_GUID =3D 84EEA114-C6BE-4445-8F90-51D97863E363 + MODULE_TYPE =3D DXE_SMM_DRIVER + ENTRY_POINT =3D CpuHotplugEntry + +# +# The following information is for reference only and not required by the = build +# tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 +# + +[Sources] + CpuHotplug.c + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + MmServicesTableLib + PcdLib + UefiDriverEntryPoint + +[Protocols] + gEfiMmCpuIoProtocolGuid ## CON= SUMES + +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdQ35SmramAtDefaultSmbase ## CON= SUMES + +[FeaturePcd] + gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire ## CON= SUMES + +[Depex] + gEfiMmCpuIoProtocolGuid diff --git a/OvmfPkg/CpuHotplugSmm/CpuHotplug.c b/OvmfPkg/CpuHotplugSmm/Cpu= Hotplug.c new file mode 100644 index 000000000000..fd09403eabf3 --- /dev/null +++ b/OvmfPkg/CpuHotplugSmm/CpuHotplug.c @@ -0,0 +1,191 @@ +/** @file + Root SMI handler for VCPU hotplug SMIs. + + Copyright (c) 2020, Red Hat, Inc. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include // ICH9_APM_CNT +#include // CpuDeadLoop() +#include // ASSERT() +#include // gMmst +#include // PcdGetBool() +#include // EFI_MM_CPU_IO_PROTOCOL +#include // EFI_STATUS + +// +// We use this protocol for accessing IO Ports. +// +STATIC EFI_MM_CPU_IO_PROTOCOL *mMmCpuIo; +// +// Represents the registration of the CPU Hotplug MMI handler. +// +STATIC EFI_HANDLE mDispatchHandle; + + +/** + CPU Hotplug MMI handler function. + + This is a root MMI handler. + + @param[in] DispatchHandle The unique handle assigned to this handle= r by + EFI_MM_SYSTEM_TABLE.MmiHandlerRegister(). + + @param[in] Context Context passed in by + EFI_MM_SYSTEM_TABLE.MmiManage(). Due to + CpuHotplugMmi() being a root MMI handler, + Context is ASSERT()ed to be NULL. + + @param[in,out] CommBuffer Ignored, due to CpuHotplugMmi() being a r= oot + MMI handler. + + @param[in,out] CommBufferSize Ignored, due to CpuHotplugMmi() being a r= oot + MMI handler. + + @retval EFI_SUCCESS The MMI was handled and the MMI + source was quiesced. When retu= rned + by a non-root MMI handler, + EFI_SUCCESS terminates the + processing of MMI handlers in + EFI_MM_SYSTEM_TABLE.MmiManage(= ). + For a root MMI handler (i.e., = for + the present function too), + EFI_SUCCESS behaves identicall= y to + EFI_WARN_INTERRUPT_SOURCE_QUIE= SCED, + as further root MMI handlers a= re + going to be called by + EFI_MM_SYSTEM_TABLE.MmiManage() + anyway. + + @retval EFI_WARN_INTERRUPT_SOURCE_QUIESCED The MMI source has been quie= sced, + but other handlers should st= ill + be called. + + @retval EFI_WARN_INTERRUPT_SOURCE_PENDING The MMI source is still pend= ing, + and other handlers should st= ill + be called. + + @retval EFI_INTERRUPT_PENDING The MMI source could not be + quiesced. +**/ +STATIC +EFI_STATUS +EFIAPI +CpuHotplugMmi ( + IN EFI_HANDLE DispatchHandle, + IN CONST VOID *Context OPTIONAL, + IN OUT VOID *CommBuffer OPTIONAL, + IN OUT UINTN *CommBufferSize OPTIONAL + ) +{ + EFI_STATUS Status; + UINT8 ApmControl; + + // + // Assert that we are entering this function due to our root MMI handler + // registration. + // + ASSERT (DispatchHandle =3D=3D mDispatchHandle); + // + // When MmiManage() is invoked to process root MMI handlers, the caller = (the + // MM Core) is expected to pass in a NULL Context. MmiManage() then pass= es + // the same NULL Context to individual handlers. + // + ASSERT (Context =3D=3D NULL); + // + // Read the MMI command value from the APM Control Port, to see if this = is an + // MMI we should care about. + // + Status =3D mMmCpuIo->Io.Read (mMmCpuIo, MM_IO_UINT8, ICH9_APM_CNT, 1, + &ApmControl); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: failed to read ICH9_APM_CNT: %r\n", __FUNCTI= ON__, + Status)); + // + // We couldn't even determine if the MMI was for us or not. + // + goto Fatal; + } + + if (ApmControl !=3D ICH9_APM_CNT_CPU_HOTPLUG) { + // + // The MMI is not for us. + // + return EFI_WARN_INTERRUPT_SOURCE_QUIESCED; + } + + // + // We've handled this MMI. + // + return EFI_SUCCESS; + +Fatal: + ASSERT (FALSE); + CpuDeadLoop (); + // + // We couldn't handle this MMI. + // + return EFI_INTERRUPT_PENDING; +} + + +// +// Entry point function of this driver. +// +EFI_STATUS +EFIAPI +CpuHotplugEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + // + // This module should only be included when SMM support is required. + // + ASSERT (FeaturePcdGet (PcdSmmSmramRequire)); + // + // This driver depends on the dynamically detected "SMRAM at default SMB= ASE" + // feature. + // + if (!PcdGetBool (PcdQ35SmramAtDefaultSmbase)) { + return EFI_UNSUPPORTED; + } + + // + // Errors from here on are fatal; we cannot allow the boot to proceed if= we + // can't set up this driver to handle CPU hotplug. + // + // First, collect the protocols needed later. All of these protocols are + // listed in our module DEPEX. + // + Status =3D gMmst->MmLocateProtocol (&gEfiMmCpuIoProtocolGuid, + NULL /* Registration */, (VOID **)&mMmCpuIo); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: locate MmCpuIo: %r\n", __FUNCTION__, Status)= ); + goto Fatal; + } + + // + // Register the handler for the CPU Hotplug MMI. + // + Status =3D gMmst->MmiHandlerRegister ( + CpuHotplugMmi, + NULL, // HandlerType: root MMI handler + &mDispatchHandle + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: MmiHandlerRegister(): %r\n", __FUNCTION__, + Status)); + goto Fatal; + } + + return EFI_SUCCESS; + +Fatal: + ASSERT (FALSE); + CpuDeadLoop (); + return Status; +} --=20 2.19.1.3.g30247aa5d201 -=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 (#54950): https://edk2.groups.io/g/devel/message/54950 Mute This Topic: https://groups.io/mt/71575181/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-