On 10/15/15 00:25, Laszlo Ersek wrote:

> Test environment and results:
> 
> Host kernel:
> - latest RHEL-7 development kernel (3.10.0-323.el7), with Paolo's
>   following patches backported by yours truly:
>   - KVM: x86: clean up kvm_arch_vcpu_runnable
>   - KVM: x86: fix SMI to halted VCPU
> 
> QEMU:
> - current upstream (c49d3411faae), with Paolo's patch applied:
>   - target-i386: allow any alignment for SMBASE
> 
> Below, the meaning of "bitness=32" is:
> * qemu-system-i386
> * -cpu coreduo,-nx
> 
> Whereas "bitness=64" means:
> * qemu-system-x86_64
> * no special -cpu flag
> 
> For variable access verification, "efibootmgr" is invoked (without
> options) at the guest OS (Fedlet 20141209) root prompt.
> 
>   bitness  accel  VCPUs  result
>   -------  -----  -----  -----------------------------------------------
>   32       KVM    1      Fedlet 20141209 boots, S3 works, variables work
> 
>   32       KVM    2      stuck in SMBASE relocation, APIC IDs look valid
> 
>   32       TCG    1      Fedlet 20141209 boots, S3 works, variables work
> 
>   32       TCG    2      Fedlet 20141209 boots, variables (efibootmgr)
>                          are broken -- nothing is printed

I'm trying to track down this failure.

I wrote a separate reproducer, a small UEFI application, that does the
following:
- call GetMemoryMap() and ExitBootServices()
- enumerate variables with GetNextVariableName()
- shut down the VM with ResetSystem().

This app works perfectly with #vcpus = 1 and #vcpus = 2 as well, using
TCG. This proves that runtime variable access works with multiple CPUs too.

However, when the GetNextVariableName() calls are issued from within
Fedlet, they work only with #vcpus = 1; the same EFI service call fails
with #vcpus = 2.

In other words, I cannot reproduce the issue from a UEFI shell app, in
spite of calling GetNextVariableName() after ExitBootServices().

This is extremely annoying. Something gets corrupted when the SMM-backed
variable service is called from within the Fedlet OS (with #vcpus=2
only), but I have no clue what.

Maybe the problem is caused by the combination of #vcpus=2 and
SetVirtualAddressMap(). Because, one aspect of the (failing) Fedlet
environment that my UEFI app does *not* reflect is the non-1:1 mapping.

Paolo, can you please advise me on how to set up a KVM env / host kernel
that is supposed to work? What host kernel should I build? I have a
spare laptop (with Fedora 22 I believe) with unrestricted guest support
in the hardware. I think it should be possible to boot a Fedora 22
userland with a fresh upstream kernel. (I won't try that with my main,
new RHEL-7 laptop.)

I'd like to test this on KVM, because the problem doesn't seem to
reproduce unless I boot a real guest OS, and doing that on TCG is about
as exciting as watching paint dry.

Thanks!
Laszlo

> 
>   64       KVM    >=1    "KVM: entry failed, hardware error 0x80000021"
>                          while guest in SMBASE relocation
> 
>   64       TCG    1      F21 XFCE LiveCD boots, variable access OK, S3
>                          resume triggers InternalX86EnablePaging64()
>                          ASSERT() in
>                          "MdePkg/Library/BaseLib/X64/Non-existing.c".
>                          Looks like a bug in S3Resume2Pei?
> 
>   64       TCG    2      F21 XFCE LiveCD boots, variable access
>                          (efibootmgr) is broken -- reports EINVAL
> 
> These results are not consistent with the ones seen by Paolo, which is
> why I didn't update the last (OvmfPkg/README) patch in the series, about
> the current level of functionality. (Added a note to it about this
> fact.)
> 
> What makes me glad is that the scenario that I've been testing and
> re-testing successfully since May, i.e., 32-bit/KVM/UP, *does* work.
> 
> Thanks
> Laszlo
> 
> Cc: Paolo Bonzini <[email protected]>
> Cc: Jordan Justen <[email protected]>
> Cc: Michael Kinney <[email protected]>
> 
> Laszlo Ersek (42):
>   UefiCpuPkg: CpuDxe: broadcast MTRR changes to APs
>   OvmfPkg: introduce -D SMM_REQUIRE and PcdSmmSmramRequire
>   OvmfPkg: Sec: force reinit of BaseExtractGuidedSectionLib handler
>     table
>   OvmfPkg: Sec: assert the build-time calculated end of the scratch
>     buffer
>   OvmfPkg: decompress FVs on S3 resume if SMM_REQUIRE is set
>   OvmfPkg: PlatformPei: allow caching in AddReservedMemoryBaseSizeHob()
>   OvmfPkg: PlatformPei: account for TSEG size with PcdSmmSmramRequire
>     set
>   OvmfPkg: add PEIM for providing TSEG-as-SMRAM during PEI
>   OvmfPkg: add DXE_DRIVER for providing TSEG-as-SMRAM during boot-time
>     DXE
>   OvmfPkg: implement EFI_SMM_CONTROL2_PROTOCOL with a DXE_RUNTIME_DRIVER
>   OvmfPkg: pull in the SMM IPL and SMM core
>   OvmfPkg: pull in CpuIo2Smm driver
>   OvmfPkg: AcpiS3SaveDxe: don't fake LockBox protocol if SMM_REQUIRE
>   OvmfPkg: LockBox: -D SMM_REQUIRE excludes our fake lockbox
>   OvmfPkg: LockBox: use SMM stack with -D SMM_REQUIRE
>   OvmfPkg: resolve ReportStatusCodeLib for DXE_SMM_DRIVER modules
>   OvmfPkg: resolve CpuExceptionHandlerLib for DXE_SMM_DRIVER modules
>   OvmfPkg: set gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmEnableBspElection to
>     FALSE
>   OvmfPkg: build PiSmmCpuDxeSmm for -D SMM_REQUIRE
>   OvmfPkg: add skeleton QuarkPort/CpuS3DataDxe
>   OvmfPkg: QuarkPort/CpuS3DataDxe: fill in ACPI_CPU_DATA.StartupVector
>   OvmfPkg: QuarkPort/CpuS3DataDxe: handle IDT, GDT and MCE in
>     ACPI_CPU_DATA
>   OvmfPkg: QuarkPort/CpuS3DataDxe: handle StackAddress and StackSize
>   OvmfPkg: import CpuConfigLib header from
>     Quark_EDKII_v1.1.0/IA32FamilyCpuBasePkg
>   OvmfPkg: QuarkPort/CpuS3DataDxe: fill in ACPI_CPU_DATA.NumberOfCpus
>   OvmfPkg: QuarkPort/CpuS3DataDxe: fill in ACPI_CPU_DATA.MtrrTable
>   OvmfPkg: QuarkPort/CpuS3DataDxe: handle register tables in
>     ACPI_CPU_DATA
>   OvmfPkg: build QuarkPort/CpuS3DataDxe for -D SMM_REQUIRE
>   OvmfPkg: QemuFlashFvbServicesRuntimeDxe: strip trailing whitespace
>   OvmfPkg: QemuFlashFvbServicesRuntimeDxe: rewrap source code to 79
>     chars
>   OvmfPkg: QemuFlashFvbServicesRuntimeDxe: fix VALID_ARCHITECTURES in
>     INF
>   OvmfPkg: QemuFlashFvbServicesRuntimeDxe: remove FvbDevLock field
>   OvmfPkg: QemuFlashFvbServicesRuntimeDxe: remove FvbScratchSpace field
>   OvmfPkg: QemuFlashFvbServicesRuntimeDxe: no dual addressing needed
>   OvmfPkg: QemuFlashFvbServicesRuntimeDxe: split out runtime DXE
>     specifics
>   OvmfPkg: QemuFlashFvbServicesRuntimeDxe: clean up includes and
>     libraries
>   OvmfPkg: QemuFlashFvbServicesRuntimeDxe: add DXE_SMM_DRIVER build
>   OvmfPkg: QemuFlashFvbServicesRuntimeDxe: adhere to -D SMM_REQUIRE
>   OvmfPkg: consolidate variable driver stack in DSC and FDF files
>   OvmfPkg: pull in SMM-based variable driver stack
>   OvmfPkg: double the SMRAM (TSEG) size for the 64-bit DXE phase builds
>   OvmfPkg: README: document SMM status
> 
> Michael Kinney (2):
>   UefiCpuPkg: CpuDxe: Fix ASSERT() when only 1 CPU detected
>   OvmfPkg: resolve DebugAgentLib for DXE_SMM_DRIVER modules
> 
> Paolo Bonzini (8):
>   UefiCpuPkg: PiSmmCpuDxeSmm: prepare PT in InitPaging before filling in
>     PDE
>   UefiCpuPkg: PiSmmCpuDxeSmm: do not execute RSM from 64-bit mode
>   OvmfPkg: import SmmCpuFeaturesLib from UefiCpuPkg
>   OvmfPkg: SmmCpuFeaturesLib: remove unnecessary bits
>   OvmfPkg: SmmCpuFeaturesLib: implement SMRAM state save map access
>   OvmfPkg: SmmCpuFeaturesLib: customize state save map format
>   OvmfPkg: use relaxed AP SMM synchronization mode
>   OvmfPkg: port CpuS3DataDxe to X64
> 
>  OvmfPkg/OvmfPkg.dec                                                          
>             |  29 +
>  OvmfPkg/OvmfPkgIa32.dsc                                                      
>             | 119 ++-
>  OvmfPkg/OvmfPkgIa32X64.dsc                                                   
>             | 119 ++-
>  OvmfPkg/OvmfPkgX64.dsc                                                       
>             | 119 ++-
>  OvmfPkg/OvmfPkgIa32.fdf                                                      
>             |  57 +-
>  OvmfPkg/OvmfPkgIa32X64.fdf                                                   
>             |  57 +-
>  OvmfPkg/OvmfPkgX64.fdf                                                       
>             |  57 +-
>  OvmfPkg/AcpiS3SaveDxe/AcpiS3SaveDxe.inf                                      
>             |   3 +-
>  OvmfPkg/Library/LockBoxLib/LockBoxBaseLib.inf                                
>             |   3 +
>  OvmfPkg/Library/LockBoxLib/LockBoxDxeLib.inf                                 
>             |   3 +
>  OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf                      
>             |  38 +
>  OvmfPkg/PlatformPei/PlatformPei.inf                                          
>             |   5 +
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf             
>             |  44 +-
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/{FvbServicesRuntimeDxe.inf => 
> FvbServicesSmm.inf} |  53 +-
>  OvmfPkg/QuarkPort/CpuS3DataDxe/CpuS3DataDxe.inf                              
>             | 107 +++
>  OvmfPkg/Sec/SecMain.inf                                                      
>             |   6 +
>  OvmfPkg/SmmAccess/SmmAccess2Dxe.inf                                          
>             |  57 ++
>  OvmfPkg/SmmAccess/SmmAccessPei.inf                                           
>             |  70 ++
>  OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf                                    
>             |  65 ++
>  OvmfPkg/Include/Register/QemuSmramSaveStateMap.h                             
>             | 184 +++++
>  OvmfPkg/PlatformPei/Platform.h                                               
>             |   3 +-
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.h                      
>             |  74 +-
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.h                           
>             |   9 +-
>  OvmfPkg/QuarkPort/CpuS3DataDxe/Cpu.h                                         
>             |  97 +++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/IA32/ArchSpecificDef.h                        
>             |  57 ++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/MpApic.h                                      
>             |  69 ++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/MpCommon.h                                    
>             | 187 +++++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/MpService.h                                   
>             |  49 ++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/X64/ArchSpecificDef.h                         
>             |  59 ++
>  OvmfPkg/QuarkPort/Include/Library/CpuConfigLib.h                             
>             | 671 +++++++++++++++++
>  OvmfPkg/SmmAccess/SmramInternal.h                                            
>             |  89 +++
>  UefiCpuPkg/CpuDxe/CpuMp.h                                                    
>             |  13 +
>  OvmfPkg/AcpiS3SaveDxe/AcpiS3Save.c                                           
>             |  14 +-
>  OvmfPkg/Library/LockBoxLib/LockBoxLib.c                                      
>             |   2 +
>  OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c                        
>             | 790 ++++++++++++++++++++
>  OvmfPkg/PlatformPei/Fv.c                                                     
>             |  27 +-
>  OvmfPkg/PlatformPei/MemDetect.c                                              
>             |  85 ++-
>  OvmfPkg/PlatformPei/Platform.c                                               
>             |   9 +-
>  OvmfPkg/PlatformPei/Xen.c                                                    
>             |   2 +-
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbInfo.c                             
>             |  56 +-
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c                      
>             | 653 +++++++---------
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c                   
>             | 157 ++++
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceSmm.c                   
>             |  69 ++
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.c                           
>             |  27 +-
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashDxe.c                        
>             |  28 +
>  OvmfPkg/QuarkPort/CpuS3DataDxe/IA32/ArchSpecific.c                           
>             | 105 +++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/MpApic.c                                      
>             |  93 +++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/MpCommon.c                                    
>             | 298 ++++++++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/ProcessorConfig.c                             
>             | 335 +++++++++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/X64/ArchSpecific.c                            
>             | 108 +++
>  OvmfPkg/Sec/SecMain.c                                                        
>             |  52 +-
>  OvmfPkg/SmmAccess/SmmAccess2Dxe.c                                            
>             | 156 ++++
>  OvmfPkg/SmmAccess/SmmAccessPei.c                                             
>             | 446 +++++++++++
>  OvmfPkg/SmmAccess/SmramInternal.c                                            
>             | 188 +++++
>  OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.c                                      
>             | 365 +++++++++
>  UefiCpuPkg/CpuDxe/CpuDxe.c                                                   
>             |  26 +
>  UefiCpuPkg/CpuDxe/CpuMp.c                                                    
>             |  36 +-
>  UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c                                       
>             |   8 +-
>  OvmfPkg/DecomprScratchEnd.fdf.inc                                            
>             |  72 ++
>  OvmfPkg/OvmfPkg.fdf.inc                                                      
>             |   2 +
>  OvmfPkg/QuarkPort/CpuS3DataDxe/IA32/CpuAsm.S                                 
>             |  56 ++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/IA32/CpuAsm.asm                               
>             |  69 ++
>  OvmfPkg/QuarkPort/CpuS3DataDxe/X64/CpuAsm.nasm                               
>             |  58 ++
>  OvmfPkg/README                                                               
>             |  43 ++
>  UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S                                     
>             |  13 +
>  UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm                                   
>             |  13 +
>  UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmInit.S                                      
>             |  13 +
>  UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmInit.asm                                    
>             |  13 +
>  68 files changed, 6468 insertions(+), 591 deletions(-)
>  create mode 100644 OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf
>  copy OvmfPkg/QemuFlashFvbServicesRuntimeDxe/{FvbServicesRuntimeDxe.inf => 
> FvbServicesSmm.inf} (59%)
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/CpuS3DataDxe.inf
>  create mode 100644 OvmfPkg/SmmAccess/SmmAccess2Dxe.inf
>  create mode 100644 OvmfPkg/SmmAccess/SmmAccessPei.inf
>  create mode 100644 OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf
>  create mode 100644 OvmfPkg/Include/Register/QemuSmramSaveStateMap.h
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/Cpu.h
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/IA32/ArchSpecificDef.h
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/MpApic.h
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/MpCommon.h
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/MpService.h
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/X64/ArchSpecificDef.h
>  create mode 100644 OvmfPkg/QuarkPort/Include/Library/CpuConfigLib.h
>  create mode 100644 OvmfPkg/SmmAccess/SmramInternal.h
>  create mode 100644 OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c
>  create mode 100644 OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c
>  create mode 100644 OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceSmm.c
>  create mode 100644 OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashDxe.c
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/IA32/ArchSpecific.c
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/MpApic.c
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/MpCommon.c
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/ProcessorConfig.c
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/X64/ArchSpecific.c
>  create mode 100644 OvmfPkg/SmmAccess/SmmAccess2Dxe.c
>  create mode 100644 OvmfPkg/SmmAccess/SmmAccessPei.c
>  create mode 100644 OvmfPkg/SmmAccess/SmramInternal.c
>  create mode 100644 OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.c
>  create mode 100644 OvmfPkg/DecomprScratchEnd.fdf.inc
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/IA32/CpuAsm.S
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/IA32/CpuAsm.asm
>  create mode 100644 OvmfPkg/QuarkPort/CpuS3DataDxe/X64/CpuAsm.nasm
> 

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to