public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Fan, Jeff" <jeff.fan@intel.com>
To: "Zeng, Star" <star.zeng@intel.com>,
	Laszlo Ersek <lersek@redhat.com>,
	"edk2-devel@ml01.01.org" <edk2-devel@ml01.01.org>
Cc: "Kinney, Michael D" <michael.d.kinney@intel.com>,
	"Justen, Jordan L" <jordan.l.justen@intel.com>,
	"Tian, Feng" <feng.tian@intel.com>
Subject: Re: [Patch v5 48/48] UefiCpuPkg/PiSmmCpuDxeSmm: Add gEfiVariableArchProtocolGuid dependency
Date: Thu, 25 Aug 2016 08:00:27 +0000	[thread overview]
Message-ID: <542CF652F8836A4AB8DBFAAD40ED192A143DEF4E@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <8c9e77d3-14d2-4a92-2407-eb80cd255bb4@intel.com>

Laszlo,

After discussed with Star, I understood OVMF's circle dependency on Variable Arch protocol and SMM CPU driver.

I will defer to check-in this patch till found the better solution.

Before the proper fix adopted, our platforms might not set the HII types dynamic PCDs used by PiSmmCpuDxeSmm driver.

Thanks!
Jeff

-----Original Message-----
From: Zeng, Star 
Sent: Wednesday, August 24, 2016 9:42 PM
To: Laszlo Ersek; Fan, Jeff; edk2-devel@ml01.01.org
Cc: Kinney, Michael D; Justen, Jordan L; Tian, Feng
Subject: Re: [edk2] [Patch v5 48/48] UefiCpuPkg/PiSmmCpuDxeSmm: Add gEfiVariableArchProtocolGuid dependency

[Snipped]

>>>>
>>>> I am not so clear about "the pristine "OVMF_VARS.fd" varstore 
>>>> template that falls right out of the OVMF build".
>>>>
>>>> Variable driver depends on PcdFlashNvStorageVariableBase(64) be set 
>>>> correctly to produce gEfiVariableArchProtocolGuid protocol.
>>>>
>>>> After PiSmmCpuDxeSmm adds gEfiVariableArchProtocolGuid dependency 
>>>> and FvbServicesSmm adds gEfiSmmCpuProtocolGuid dependency, there 
>>>> will be a dependency circle below.
>>>>  - PiSmmCpuDxeSmm depends on Variable driver to produce 
>>>> gEfiVariableArchProtocolGuid protocol.
>>>>  - FvbServicesSmm depends on PiSmmCpuDxeSmm to produce 
>>>> gEfiSmmCpuProtocolGuid protocol.
>>>>  - Variable driver depends on FvbServicesSmm to set
>>>> PcdFlashNvStorageVariableBase(64) PCD.
>>>
>>> I understand, thank you for the explanation. The 64-bit PCD that you 
>>> mention is set at the end of the entry point function.
>>>
>>>> Are below approaches possible in OVMF?
>>>> 1. Do InitializeVariableFvHeader () and
>>>> PcdFlashNvStorageVariableBase(64) PCD set at PEI phase.
>>>
>>> InitializeVariableFvHeader() writes to the pflash chip, which is 
>>> only possible if the code runs in SMM (under the use case we are 
>>> discussing now). So running it as part of a PEIM would not be right.
>>>
>>>> 2. Do InitializeVariableFvHeader () and
>>>> PcdFlashNvStorageVariableBase(64) PCD set in entrypoint with 
>>>> dependency = TRUE, and do other part of code in FvbInitialize() in 
>>>> another gEfiSmmCpuProtocolGuid notification function?
>>>
>>> That's again not good, because it would allow the entry point 
>>> function to exit with success (and to produce the FVB protocol 
>>> interface) even if the pflash configuration on the QEMU command line 
>>> is incorrect (that is, a -D SMM_REQUIRE OVMF build is being run with 
>>> "-bios", rather than the pflash chips).
>>
>> I am a little curious about what makes "writing to the pflash chip is 
>> only possible if the code runs in SMM" in OVMF?
>
> QEMU does that.
>
> That is the way QEMU protects the pflash chip from direct writes by 
> the guest OS. If you pass
>
>   -global driver=cfi.pflash01,property=secure,value=on
>
> to QEMU (which we do), then all write accesses to the chip will be 
> rejected, unless the code doing the write access runs in SMM.
>
>> I meant the code flow for approach 2) I mentioned is like below, I am 
>> not sure if it works or not. :)
>>
>> FvbInitialize() - This may could be done at PEI phase.
>>   InitializeVariableFvHeader()
>>     if ValidateFvHeader () returns error status # mark1
>>       allocate buffer to hold data from GetFvbInfo() # mark2
>>     endif
>>     return PcdOvmfFlashNvStorageVariableBase or the buffer
>>           (allocated at mark2) pointer
>>   set PcdFlashNvStorageVariableBase64/
>>       PcdFlashNvStorageFtwWorkingBase/
>>       PcdFlashNvStorageFtwSpareBase
>>       according to the return from InitializeVariableFvHeader()
>>
>> FvbWriteInitialize() - Notification function on gEfiSmmCpuProtocolGuid
>>   QemuFlashInitialize()
>>   ...
>>   Free buffer(allocated at mark2)
>>   set PcdFlashNvStorageVariableBase64/
>>       PcdFlashNvStorageFtwWorkingBase/
>>       PcdFlashNvStorageFtwSpareBase
>>       again if mark1 returned success
>>   Install FVB protocol
>>   ...
>
> I don't understand the purpose of the buffer allocated at mark2.
>
> Also, currently InitializeVariableFvHeader() erases blocks, after it 
> prints "Variable FV header is not valid. It will be reinitialized". As 
> I said, that part cannot be done in PEI.
>
> .... Anyway, I just tried to set PcdFlashNvStorageVariableBase64 / 
> PcdFlashNvStorageFtwWorkingBase / PcdFlashNvStorageFtwSpareBase right 
> in the FDF file, at build time -- that is, even earlier than in PEI 
> --, to the correct values, as dynamic defaults.
>
> (I even verified those values in the build report file.)
>
> It doesn't work: I get the exact same assertion failure. In other 
> words, even if those PCDs are set to the correct values, VariableSmm 
> blows up with "Firmware Volume for Variable Store is corrupted".
>
> ..... Ahh, I realized why this happens! QEMU prevents even *read
> accesses* if they don't come from code running in SMM.
> <http://git.qemu.org/?p=qemu.git;a=commitdiff;h=f71e42a5c987

I am surprised by the read access prevention.

>
>
> Independently, I have further thoughts about the following:
>
>>> The "other part" that you mention is about exiting the FVB driver as 
>>> early as possible, if the varstore is not backed by a pflash chip:
>>> - in the SMM_REQUIRE build, this is actually a fatal error,
>>> - in the SMM-less build, this allows the EmuVariableFvbRuntimeDxe 
>>> driver to run.
>>>
>>> Let me turn the question around: can PiSmmCpuDxeSmm consume its 
>>> settings from HOBs? The PEI phase has read-only access to variables, 
>>> and some PEIM could produce those HOBs, either directly, or from 
>>> reading variables. (Also, it would be nice to know exactly what 
>>> aspects of PiSmmCpuDxeSmm are planned to be controlled dynamically.)
>>>
>>> Alternatively, if Jordan agrees, we could break the cycle like this:
>>>
>>> (1) Drop EmuVariableFvbRuntimeDxe and its dependencies completely.
>
> Unfortunately, this won't work -- I just realized it --, because Xen 
> has no pflash chips, and removing EmuVariableFvbRuntimeDxe would break 
> OVMF on Xen.
>
> Can we research the HOB (or dynamic PCD) avenue for PiSmmCpuDxeSmm a 
> bit? Because, it seems that on QEMU, *both* FvbServicesSmm *and* 
> VariableSmm can only be dispatched after PiSmmCpuDxeSmm enters SMM.
>
> In other words, if gEfiVariableArchProtocolGuid is added as a depex to 
> PiSmmCpuDxeSmm, then we have a much tighter cycle than you described 
> earlier, on QEMU:
>
> - PiSmmCpuDxeSmm wants read-only variable access, but
> - VariableSmm must be dispatched in SMM (= after PiSmmCpuDxeSmm runs), 
> on QEMU.

Seemingly, PiSmmCpuDxeSmm could not simply include gEfiVariableArchProtocolGuid dependency. I will have some discussion with Jeff.

Thanks,
Star

>
> In fact, this makes me wonder if PEI-phase read-only variable access 
> is possible at all on QEMU. (OVMF has never used
> MdeModulePkg/Universal/Variable/Pei/.)
>
> Thanks
> Laszlo
>
>>> This would eliminate OVMF's reuse of PcdFlashNvStorageVariableBase64 
>>> for arbitrating between QemuFlashFvbServicesRuntimeDxe and 
>>> EmuVariableFvbRuntimeDxe. (For more background on this, please see 
>>> commits 4313b26de098b and 182eb4562731f.)
>>>
>>> Dropping EmuVariableFvbRuntimeDxe would also make pflash chips 
>>> mandatory for OVMF, and prevent it from running with the "-bios" 
>>> option (at long last). I'd strongly support this.
>>>
>>> (2) Set PcdFlashNvStorageVariableBase64 and the other PCDs that the 
>>> variable driver consumes directly in the OVMF DSC or FDF files, 
>>> matching the PcdOvmfFlashNvStorageXXX settings that 
>>> QemuFlashFvbServicesRuntimeDxe already uses as sorce of information.
>>> This would allow the variable driver to proceed without 
>>> QemuFlashFvbServicesRuntimeDxe's assistance (for read-only access only).
>>> This would make perfect sense, because for read-only access, the 
>>> variable driver doesn't need FVB, it only needs to know where to 
>>> read (with direct memory references).
>>>
>>> (3) QemuFlashFvbServicesRuntimeDxe would keep its structure in other 
>>> aspects; for example it would get a new depex on gEfiSmmCpuProtocolGuid.
>>> This would ensure its entry point function was executed in SMM.
>>>
>>> Thanks
>>> Laszlo
>>>
>>



  reply	other threads:[~2016-08-25  8:00 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-02  8:59 [Patch v5 00/48] MP Initialize Library Jeff Fan
2016-08-02  8:59 ` [Patch v5 01/48] UefiCpuPkg/LocalApic.h: Remove duplicated/conflicted definitions Jeff Fan
2016-08-02 17:17   ` Kinney, Michael D
2016-08-02  8:59 ` [Patch v5 02/48] UefiCpuPkg/MpInitLib: Add microcode definitions defined in IA32 SDM Jeff Fan
2016-08-02 15:20   ` Mudusuru, Giri P
2016-08-02  8:59 ` [Patch v5 03/48] UefiCpuPkg/CpuS3DataDxe: Move StartupVector allocation to EndOfDxe() Jeff Fan
2016-08-02  8:59 ` [Patch v5 04/48] UefiCpuPkg/MpInitLib: Add MP Initialize library class definition Jeff Fan
2016-08-02  8:59 ` [Patch v5 05/48] UefiCpuPkg/MpInitLib: Add two instances PeiMpInitLib and DxeMpInitLib Jeff Fan
2016-08-02  8:59 ` [Patch v5 06/48] UefiCpuPkg/MpInitLib: Add AP assembly code and MP_CPU_EXCHANGE_INFO Jeff Fan
2016-08-02  8:59 ` [Patch v5 07/48] UefiCpuPkg/MpInitLib: Fix typo and clean up the code Jeff Fan
2016-08-02  8:59 ` [Patch v5 08/48] UefiCpuPkg/MpInitLib: Add EnableExecuteDisable in MP_CPU_EXCHANGE_INFO Jeff Fan
2016-08-02  8:59 ` [Patch v5 09/48] UefiCpuPkg/MpInitLib: Add AsmRelocateApLoop() assembly code Jeff Fan
2016-08-02  8:59 ` [Patch v5 10/48] UefiCpuPkg/MpInitLib: Add MP_ASSEMBLY_ADDRESS_MAP Jeff Fan
2016-08-02  8:59 ` [Patch v5 11/48] UefiCpuPkg/MpInitLib: Get ApLoopMode and MointorFilter size Jeff Fan
2016-08-02  8:59 ` [Patch v5 12/48] UefiCpuPkg/MpInitLib: Allocate and initialize memory of MP Data buffer Jeff Fan
2016-08-02  8:59 ` [Patch v5 13/48] UefiCpuPkg/MpInitLib: Initialize CPU_AP_DATA for CPU APs Jeff Fan
2016-08-02  8:59 ` [Patch v5 14/48] UefiCpuPkg/MpInitLib: Add CPU_VOLATILE_REGISTERS & worker functions Jeff Fan
2016-08-02  8:59 ` [Patch v5 15/48] UefiCpuPkg/MpInitLib: Add MicrocodeDetect() and load microcode on BSP Jeff Fan
2016-08-02  8:59 ` [Patch v5 16/48] UefiCpuPkg/MpInitLib: Save CPU MP Data pointer Jeff Fan
2016-08-02  8:59 ` [Patch v5 17/48] UefiCpuPkg/MpInitLib: Register one End of PEI callback function Jeff Fan
2016-08-02  8:59 ` [Patch v5 18/48] UefiCpuPkg/MpInitLib: Register one period event to check APs status Jeff Fan
2016-08-02  8:59 ` [Patch v5 19/48] UefiCpuPkg/MpInitLib: Allocate AP reset vector buffer under 1MB Jeff Fan
2016-08-02  8:59 ` [Patch v5 20/48] UefiCpuPkg/MpInitLib: Add ApWakeupFunction() executed by assembly code Jeff Fan
2016-08-02  8:59 ` [Patch v5 21/48] UefiCpuPkg/MpInitLib: Fill MP_CPU_EXCHANGE_INFO fields Jeff Fan
2016-08-02  8:59 ` [Patch v5 22/48] UefiCpuPkg/MpInitLib: Add WakeUpAP() Jeff Fan
2016-08-02  8:59 ` [Patch v5 23/48] UefiCpuPkg/MpInitLib: Send INIT-SIPI-SIPI to get processor count Jeff Fan
2016-08-02  8:59 ` [Patch v5 24/48] UefiCpuPkg/MpInitLib: Enable x2APIC mode on BSP/APs Jeff Fan
2016-08-02  8:59 ` [Patch v5 25/48] UefiCpuPkg/MpInitLib: Sort processor by ascending order of APIC ID Jeff Fan
2016-08-02  8:59 ` [Patch v5 26/48] UefiCpuPkg/MpInitLib: Skip collect processor count if GUIDed HOB exist Jeff Fan
2016-08-02  8:59 ` [Patch v5 27/48] UefiCpuPkg/MpInitLib: Implementation of MpInitLibGetNumberOfProcessors() Jeff Fan
2016-08-02  8:59 ` [Patch v5 28/48] UefiCpuPkg/MpInitLib: Implementation of MpInitLibGetProcessorInfo() Jeff Fan
2016-08-02  8:59 ` [Patch v5 29/48] UefiCpuPkg/MpInitLib: Implementation of MpInitLibWhoAmI() Jeff Fan
2016-08-02  8:59 ` [Patch v5 30/48] UefiCpuPkg/MpInitLib: Implementation of MpInitLibSwitchBSP() Jeff Fan
2016-08-02  8:59 ` [Patch v5 31/48] UefiCpuPkg/MpInitLib: Implementation of MpInitLibEnableDisableAP() Jeff Fan
2016-08-02  8:59 ` [Patch v5 32/48] UefiCpuPkg/MpInitLib: Check APs Status and update APs status Jeff Fan
2016-08-02  8:59 ` [Patch v5 33/48] UefiCpuPkg/MpInitLib: Implementation of MpInitLibStartupThisAP() Jeff Fan
2016-08-02  8:59 ` [Patch v5 34/48] UefiCpuPkg/MpInitLib: Implementation of MpInitLibStartupAllAPs() Jeff Fan
2016-08-02  8:59 ` [Patch v5 35/48] UefiCpuPkg/MpInitLib: Place APs in safe loop before hand-off to OS Jeff Fan
2016-08-02  8:59 ` [Patch v5 36/48] OvmfPkg: Add MpInitLib reference in DSC files Jeff Fan
2016-08-02 11:39   ` Laszlo Ersek
2016-08-02  8:59 ` [Patch v5 37/48] QuarkPlatformPkg: " Jeff Fan
2016-08-02  8:59 ` [Patch v5 38/48] UefiCpuPkg/CpuMpPei: Consume MpInitLib to produce CPU MP PPI services Jeff Fan
2016-08-02  8:59 ` [Patch v5 39/48] UefiCpuPkg/CpuMpPei: Remove unused files and codes Jeff Fan
2016-08-02  8:59 ` [Patch v5 40/48] UefiCpuPkg/CpuMpPei: Delete PeiMpServices.c and PeiMpServices.h Jeff Fan
2016-08-02  8:59 ` [Patch v5 41/48] UefiCpuPkg/CpuDxe: Consume MpInitLib to produce CPU MP Protocol services Jeff Fan
2016-08-02  8:59 ` [Patch v5 42/48] UefiCpuPkg/CpuDxe: Move SetMtrrsFromBuffer() location Jeff Fan
2016-08-02  8:59 ` [Patch v5 43/48] UefiCpuPkg/CpuDxe: Remove unused codes and files Jeff Fan
2016-08-02  8:59 ` [Patch v5 44/48] UefiCpuPkg/CpuDxe: Remove PcdCpuMaxLogicalProcessorNumber consuming Jeff Fan
2016-08-02  8:59 ` [Patch v5 45/48] MdePkg/MpService.h: Fixed typo in function header to match PI spec Jeff Fan
2016-08-02  8:59 ` [Patch v5 46/48] MdePkg/MpService.h: Trim whitespace at end of line Jeff Fan
2016-08-02  8:59 ` [Patch v5 47/48] UefiCpuPkg/CpuDxe: Fixed typo in function header to match PI spec Jeff Fan
2016-08-02  8:59 ` [Patch v5 48/48] UefiCpuPkg/PiSmmCpuDxeSmm: Add gEfiVariableArchProtocolGuid dependency Jeff Fan
2016-08-19  1:19   ` Laszlo Ersek
2016-08-19  2:00     ` Fan, Jeff
2016-08-19  2:26       ` Laszlo Ersek
2016-08-19  2:45         ` Zeng, Star
2016-08-19  2:57           ` Zeng, Star
2016-08-19 13:19             ` Laszlo Ersek
2016-08-23 15:33             ` Laszlo Ersek
2016-08-24  2:39               ` Zeng, Star
2016-08-24  3:27                 ` Laszlo Ersek
     [not found]                   ` <ea6bfac6-1f9c-a0f6-c4ce-0b147136f34e@intel.com>
2016-08-24  8:16                     ` Zeng, Star
2016-08-24 11:53                     ` Laszlo Ersek
2016-08-24 13:42                       ` Zeng, Star
2016-08-25  8:00                         ` Fan, Jeff [this message]
2016-08-30 13:45                           ` Laszlo Ersek
2016-09-01  1:11                             ` Fan, Jeff
2016-09-01 17:46                               ` Laszlo Ersek
2016-09-02  0:49                                 ` Fan, Jeff
2016-08-19 14:28         ` Laszlo Ersek
2016-08-02 18:55 ` [Patch v5 00/48] MP Initialize Library Kinney, Michael D

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=542CF652F8836A4AB8DBFAAD40ED192A143DEF4E@shsmsx102.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox