public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Zeng, Star" <star.zeng@intel.com>
To: Laszlo Ersek <lersek@redhat.com>,
	"Fan, Jeff" <jeff.fan@intel.com>,
	"edk2-devel@ml01.01.org" <edk2-devel@ml01.01.org>
Cc: "Kinney, Michael D" <michael.d.kinney@intel.com>,
	"Jordan Justen (Intel address)" <jordan.l.justen@intel.com>,
	"Tian, Feng" <feng.tian@intel.com>
Subject: Re: [Patch v5 48/48] UefiCpuPkg/PiSmmCpuDxeSmm: Add gEfiVariableArchProtocolGuid dependency
Date: Wed, 24 Aug 2016 21:42:07 +0800	[thread overview]
Message-ID: <8c9e77d3-14d2-4a92-2407-eb80cd255bb4@intel.com> (raw)
In-Reply-To: <bb6e2e4a-e474-5bf8-9b8c-bd66b2c5adfd@redhat.com>

[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-24 13:42 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 [this message]
2016-08-25  8:00                         ` Fan, Jeff
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=8c9e77d3-14d2-4a92-2407-eb80cd255bb4@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