Laszlo:

> * Independently: if the CSM too conflicts with the null detection
> feature, then we should probably report an "unsupported configuration"
> error for the following case:
> 
>   -D NULL_DETECT_ENABLE -D CSM_ENABLE
> 
> But, I don't know if triggering build errors, with custom error
> messages, is possible in DSC files.

Now, there is no support to report the error message for the invalid 
combination. I think this is a good request to BaseTools. We can introduce 
!error "error message" syntax in DSC/FDF. If the invalid combination happen, 
!error will trig build error message. Could you help submit this feature 
request in BugZillar?

Thanks
Liming
> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Laszlo 
> Ersek
> Sent: Wednesday, September 6, 2017 9:19 PM
> To: Yao, Jiewen <jiewen....@intel.com>; Wang, Jian J <jian.j.w...@intel.com>; 
> Justen, Jordan L <jordan.l.jus...@intel.com>
> Cc: Kinney, Michael D <michael.d.kin...@intel.com>; edk2-devel@lists.01.org
> Subject: Re: [edk2] ASSERT in QemuVideoDxe driver during reset
> 
> On 09/06/17 13:16, Yao, Jiewen wrote:
> > HI
> > I think the NULL detection feature should *never* break any existing 
> > platform.
> > No real function should be skipped for PcdNullDetection.
> >
> > If InstallVbeShim () is needed for CSM, we should always call 
> > InstallVbeShim() for CSM.
> 
> Wait a second please -- the VBE shim exists so that we can boot Windows7
> on OVMF *without* the CSM.
> 
> If you build OVMF with the SeaBIOS CSM, then Windows7 will simply boot
> in legacy mode, and work as usual.
> 
> But if you build OVMF without a CSM, then Windows7 will break mid-way
> into booting. The reason is that Windows7 insists on some legacy VBE
> services even if it is booted on a pure UEFI system. By faking a minimal
> set of legacy VBE services, Windows7 boots just fine in UEFI mode.
> 
> (Windows 7 doesn't actually execute the VBE services' real mode code on
> the processor; instead the code is interpreted in a software emulator.)
> 
> The dependency on legacy VBE services is arguably a bug of UEFI Windows
> 7. One way to work it around is to build OVMF with the SeaBIOS CSM, and
> just boot Windows7 in legacy mode.
> 
> However, in some environments, building OVMF with a CSM is not
> desirable. That's why we created the VBE shim. It is a terrible hack,
> but it fits the Windows7 bug just fine.
> 
> > I suggest below options:
> >
> > 1)       In OVMF, if CSM is enabled, disable PcdNullDetection.
> >
> > 2)       In OVMF, if any driver need access first 4K page, the code should 
> > explicit call SetAttribute(0, 4K, READ|WRITE), if
> PcdNullDetection is enabled.
> >
> > Either #1 or #2 is OK.
> > #1 is simple, and #2 can help detect more potential issue.
> 
> * Regarding #1:
> 
> As I wrote above, the VBE shim is mutually exclusive with CSM:
> 
>   //
>   // The allocation request may fail, eg. if LegacyBiosDxe has already run.
>   //
> 
> So, if the CSM was built into OVMF, then the VBE shim is already skipped
> at boot.
> 
> 
> * Regarding #2:
> 
> I agree that *temporarily* enabling R/W access to page zero, using the
> appropriate DXE service, could make the VBE Shim installation work.
> 
> However, making page 0 unaccessible right after, could very easily break
> Windows 7, if some component of Windows 7 accessed page 0, before
> setting up new page tables. After all, in the InstallVbeShim() function,
> we write stuff to page 0 *because* Windows 7 will read it from there.
> 
> 
> * If it is more convenient than a "--pcd=..." option for "build", we can
> also add another build-time macro to the OVMF DSC files, called
> NULL_DETECT_ENABLE. This would then turn on the PcdNullDetection bits,
> for "-D NULL_DETECT_ENABLE".
> 
> NULL_DETECT_ENABLE should default to FALSE.
> 
> 
> * Independently: if the CSM too conflicts with the null detection
> feature, then we should probably report an "unsupported configuration"
> error for the following case:
> 
>   -D NULL_DETECT_ENABLE -D CSM_ENABLE
> 
> But, I don't know if triggering build errors, with custom error
> messages, is possible in DSC files.
> 
> Thanks
> Laszlo
> 
> 
> > From: Laszlo Ersek [mailto:ler...@redhat.com]
> > Sent: Wednesday, September 6, 2017 6:21 PM
> > To: Wang, Jian J <jian.j.w...@intel.com>; Justen, Jordan L 
> > <jordan.l.jus...@intel.com>; Yao, Jiewen <jiewen....@intel.com>
> > Cc: edk2-devel@lists.01.org; Kinney, Michael D <michael.d.kin...@intel.com>
> > Subject: Re: ASSERT in QemuVideoDxe driver during reset
> >
> > On 09/06/17 10:15, Wang, Jian J wrote:
> >> Hi guys,
> >>
> >> I found an ASSERT issue in function InstallVbeShim() in QemuVideoDxe
> >> driver during reset. The assert statement is like below.
> >>
> >>     ASSERT (Int0x10->Segment == 0x0000);
> >>     ASSERT (Int0x10->Offset  == 0x0000);
> >>
> >> This happened after I have enabled NULL pointer access detection
> >> feature, in which page 0 (4K)  is disabled.
> >
> > The NULL pointer access detection conflicts with the VBE shim. For
> > installing the VBE shim, OVMF has to write to page 0, on purpose.
> >
> > Please see commit 90803342b1b6 ("OvmfPkg: QemuVideoDxe: Int10h stub for
> > Windows 7 & 2008 (stdvga, QXL)", 2014-05-20).
> >
> >> And because of page 0 disabled, I have to skip the memory clearing for
> >> page 0 in DXE core.
> >
> > By doing that, you invalidate the following comment in said OVMF commit:
> >
> > +    //
> > +    // We managed to allocate the page at zero. SVN r14218 guarantees that 
> > it
> > +    // is NUL-filled.
> > +    //
> > +    ASSERT (Int0x10->Segment == 0x0000);
> > +    ASSERT (Int0x10->Offset  == 0x0000);
> >
> > Because SVN r14218 was what added the clearing of page 0 to the DXE
> > core. (Expressed as a git commit: d436d5ca0936.)
> >
> >> Otherwise it will cause page fault exception there. It seems that QEMU
> >> may clear all its memory at startup. Skipping the action of clearing
> >> page 0 in core won't cause ASSERT issue in QemuVideoDxe, for the first
> >> time boot. But QemuVideoDxe will write int10 vector at memory 0x10 and
> >> QEMU will not clear all its memory during warm boot. ASSERT will be
> >> triggered after reset.
> >
> > QEMU does not clear guest RAM at reboot (or S3 resume).
> >
> >> It's easy to fix this issue but there're some subtle situations which
> >> I'm not quite certain. I'd like your opinions for them.
> >>
> >> Here're my thoughts on several solutions:
> >> a) Remove the ASSERT statement in InstallVbeShim().
> >
> > Not a good idea.
> >
> >> But I'm sure if it is safe to do so because I don't quite understand
> >> the purpose of the ASSERT.
> >
> > The ASSERT expresses our belief that, after we manage to *allocate* page
> > 0, we can freely write the real mode Int0x10 vector there, without
> > overwriting anything else.
> >
> >> b) Instead of skipping clearing page 0, enable it, do clearing and
> >> then disable it. The problem here is that CPU arch protocol is not
> >> ready at that time. I have to "manually" do page operation, which
> >> might be non-portable and a little bit odd in DXE core.
> >> c) Move code clearing page 0 from DXE core to another place wherever
> >> appropriate, like DxeIpl or cpu driver. But I think there's a good
> >> reason to put code there before.
> >
> > I'm not sure how the NULL pointer access detection is enabled. Is it
> > enabled by a PCD?
> >
> > Hm, yes, it seems, from your patch
> >
> >   [edk2] [PATCH 1/2] Implement NULL pointer detection for EDK-II Core
> >
> > that the PCD is called
> >
> >   gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetection
> >
> > I can see in that patch that the DXE core is updated *not* to clear page
> > 0 if the PCD is set to TRUE. That makes sense.
> >
> > However, OVMF should also be updated to skip the VBE shim installation
> > if the PCD is set to TRUE. Namely, if the PCD is set to TRUE, then we
> > simply cannot put the legacy Int0x10 vector in place, so we shouldn't
> > even try.
> >
> > Please extend your original patch set with a patch for OvmfPkg. In the
> > file "OvmfPkg/QemuVideoDxe/Driver.c", locate the InstallVbeShim() call
> > site:
> >
> >> #if defined MDE_CPU_IA32 || defined MDE_CPU_X64
> >>   if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO ||
> >>       Private->Variant == QEMU_VIDEO_BOCHS) {
> >>     InstallVbeShim (Card->Name, 
> >> Private->GraphicsOutput.Mode->FrameBufferBase);
> >>   }
> >> #endif
> >
> > and please skip the call if the PCD is set to TRUE:
> >
> >> #if defined MDE_CPU_IA32 || defined MDE_CPU_X64
> >>   if (!FeaturePcdGet (PcdNullPointerDetection) &&
> >>       (Private->Variant == QEMU_VIDEO_BOCHS_MMIO ||
> >>        Private->Variant == QEMU_VIDEO_BOCHS)) {
> >>     InstallVbeShim (Card->Name, 
> >> Private->GraphicsOutput.Mode->FrameBufferBase);
> >>   }
> >> #endif
> >
> > Now, the consequence of this would be a working OVMF build, but it would
> > also break booting UEFI Windows 7 on OVMF. Therefore, please append
> > *another* patch to your patch set, setting the Feature PCD to FALSE in
> > all three OVMF DSC files:
> >
> > - OvmfPkg/OvmfPkgIa32.dsc
> > - OvmfPkg/OvmfPkgIa32X64.dsc
> > - OvmfPkg/OvmfPkgX64.dsc
> >
> > We cannot break Windows 7 booting in upstream OVMF. If someone really
> > wants the null pointer detection in OVMF (and doesn't need Windows 7 for
> > sure), they can patch the DSC files, or else pass the
> >
> >   --pcd=gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetection=TRUE
> >
> > option to the "build" utility.
> >
> > ... I'm now seeing in the original discussion that perhaps you will
> > introduce a bitmap instead (one bit per firmware phase). That's OK with
> > me; please reinterpret all of the above with the "DXE bit" then.
> >
> > When you post the next version of the patch set, please CC Jordan and
> > myself on the OvmfPkg patches.
> >
> > Thank you!
> > Laszlo
> >
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to