On 7/14/20 8:43 PM, Laszlo Ersek wrote:
> The ICH9_LPC_SMI_F_BROADCAST and ICH9_LPC_SMI_F_CPU_HOTPLUG feature flags
> cause QEMU to behave as follows:
> 
>   BROADCAST  CPU_HOTPLUG  use case / behavior
>   ---------  -----------  ------------------------------------------------
>   clear      clear        OVMF built without SMM_REQUIRE; or very old OVMF
>                           (from before commit a316d7ac91d3 / 2017-02-07).
>                           QEMU permits CPU hotplug operations, and does
>                           not cause the OS to inject an SMI upon hotplug.
>                           Firmware is not expected to be aware of hotplug
>                           events.
> 
>   clear      set          Invalid feature set; QEMU rejects the feature
>                           negotiation.
> 
>   set        clear        OVMF after a316d7ac91d3 / 2017-02-07, built with
>                           SMM_REQUIRE, but no support for CPU hotplug.
>                           QEMU gracefully refuses hotplug operations.
> 
>   set        set          OVMF after a316d7ac91d3 / 2017-02-07, built with
>                           SMM_REQUIRE, and supporting CPU hotplug. QEMU
>                           permits CPU hotplug operations, and causes the
>                           OS to inject an SMI upon hotplug. Firmware is
>                           expected to deal with hotplug events.
> 
> Negotiate ICH9_LPC_SMI_F_CPU_HOTPLUG -- but only if SEV is disabled, as
> OvmfPkg/CpuHotplugSmm can't deal with SEV yet.
> 
> Cc: Ard Biesheuvel <ard.biesheu...@arm.com>
> Cc: Boris Ostrovsky <boris.ostrov...@oracle.com>
> Cc: Igor Mammedov <imamm...@redhat.com>
> Cc: Jordan Justen <jordan.l.jus...@intel.com>
> Cc: Liran Alon <liran.a...@oracle.com>
> Cc: Philippe Mathieu-Daudé <phi...@redhat.com>
> Signed-off-by: Laszlo Ersek <ler...@redhat.com>

Reviewed-by: Philippe Mathieu-Daude <phi...@redhat.com>

> ---
> 
> Notes:
>     This is the OVMF counterpart to Igor's QEMU series:
>     
>     - [RFC 0/3] x86: fix cpu hotplug with secure boot
>       https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg03746.html
>       message-id: <20200710161704.309824-1-imamm...@redhat.com>
>     
>     Repo:   https://pagure.io/lersek/edk2.git
>     Branch: negotiate_cpuhp_with_smi_rhbz1849177
> 
>  OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf |  1 +
>  OvmfPkg/SmmControl2Dxe/SmiFeatures.c      | 26 ++++++++++++++++++--
>  2 files changed, 25 insertions(+), 2 deletions(-)
> 
> diff --git a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf 
> b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf
> index 3abed141e644..b8fdea8deb84 100644
> --- a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf
> +++ b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf
> @@ -46,6 +46,7 @@ [LibraryClasses]
>    BaseLib
>    DebugLib
>    IoLib
> +  MemEncryptSevLib
>    MemoryAllocationLib
>    PcdLib
>    PciLib
> diff --git a/OvmfPkg/SmmControl2Dxe/SmiFeatures.c 
> b/OvmfPkg/SmmControl2Dxe/SmiFeatures.c
> index 6210b7515e3e..c9d875543205 100644
> --- a/OvmfPkg/SmmControl2Dxe/SmiFeatures.c
> +++ b/OvmfPkg/SmmControl2Dxe/SmiFeatures.c
> @@ -9,6 +9,7 @@
>  
>  #include <Library/BaseLib.h>
>  #include <Library/DebugLib.h>
> +#include <Library/MemEncryptSevLib.h>
>  #include <Library/MemoryAllocationLib.h>
>  #include <Library/PcdLib.h>
>  #include <Library/QemuFwCfgLib.h>
> @@ -21,6 +22,12 @@
>  // "etc/smi/supported-features" and "etc/smi/requested-features" fw_cfg 
> files.
>  //
>  #define ICH9_LPC_SMI_F_BROADCAST BIT0
> +//
> +// The following bit value stands for "enable CPU hotplug, and inject an SMI
> +// with control value ICH9_APM_CNT_CPU_HOTPLUG upon hotplug", in the
> +// "etc/smi/supported-features" and "etc/smi/requested-features" fw_cfg 
> files.
> +//
> +#define ICH9_LPC_SMI_F_CPU_HOTPLUG BIT1
>  
>  //
>  // Provides a scratch buffer (allocated in EfiReservedMemoryType type memory)
> @@ -67,6 +74,7 @@ NegotiateSmiFeatures (
>    UINTN                SupportedFeaturesSize;
>    UINTN                RequestedFeaturesSize;
>    UINTN                FeaturesOkSize;
> +  UINT64               RequestedFeaturesMask;
>  
>    //
>    // Look up the fw_cfg files used for feature negotiation. The selector keys
> @@ -104,9 +112,16 @@ NegotiateSmiFeatures (
>    QemuFwCfgReadBytes (sizeof mSmiFeatures, &mSmiFeatures);
>  
>    //
> -  // We want broadcast SMI and nothing else.
> +  // We want broadcast SMI, SMI on CPU hotplug, and nothing else.
>    //
> -  mSmiFeatures &= ICH9_LPC_SMI_F_BROADCAST;
> +  RequestedFeaturesMask = ICH9_LPC_SMI_F_BROADCAST;
> +  if (!MemEncryptSevIsEnabled ()) {
> +    //
> +    // For now, we only support hotplug with SEV disabled.
> +    //
> +    RequestedFeaturesMask |= ICH9_LPC_SMI_F_CPU_HOTPLUG;
> +  }
> +  mSmiFeatures &= RequestedFeaturesMask;
>    QemuFwCfgSelectItem (mRequestedFeaturesItem);
>    QemuFwCfgWriteBytes (sizeof mSmiFeatures, &mSmiFeatures);
>  
> @@ -144,6 +159,13 @@ NegotiateSmiFeatures (
>      DEBUG ((DEBUG_INFO, "%a: using SMI broadcast\n", __FUNCTION__));
>    }
>  
> +  if ((mSmiFeatures & ICH9_LPC_SMI_F_CPU_HOTPLUG) == 0) {
> +    DEBUG ((DEBUG_INFO, "%a: CPU hotplug not negotiated\n", __FUNCTION__));
> +  } else {
> +    DEBUG ((DEBUG_INFO, "%a: CPU hotplug with SMI negotiated\n",
> +      __FUNCTION__));
> +  }
> +
>    //
>    // Negotiation successful (although we may not have gotten the optimal
>    // feature set).
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#64557): https://edk2.groups.io/g/devel/message/64557
Mute This Topic: https://groups.io/mt/75505395/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to