On 10/13/15 12:32, Paolo Bonzini wrote: > > > On 12/10/2015 18:23, Paolo Bonzini wrote: >> >> >> On 05/10/2015 01:57, Michael Kinney wrote: >>> Add module that initializes a CPU for the SMM envirnment and >>> installs the first level SMI handler. This module along with the >>> SMM IPL and SMM Core provide the services required for >>> DXE_SMM_DRIVERS to register hardware and software SMI handlers. >>> >>> CPU specific features are abstracted through the SmmCpuFeaturesLib >>> >>> Platform specific features are abstracted through the >>> SmmCpuPlatformHookLib >>> >>> Several PCDs are added to enable/disable features and configure >>> settings for the PiSmmCpuDxeSmm module >>> >>> Contributed-under: TianoCore Contribution Agreement 1.0 >>> Signed-off-by: Michael Kinney <michael.d.kin...@intel.com> >> >> Hi Michael, >> >> I'm happy to report the first bug! :) >> >> InitPaging() is setting a page directory entry before initializing the >> corresponding page table. This works on real hardware (including KVM), >> but the TLB of QEMU's emulation mode is different (possibly it has >> different associativity, I don't really know) so at some point >> execution goes to nowhere's land. >> >> The fix is really simple: > > As suggested by Jordan, here's the patch again but with all the > standard signoffs. > > [pbonz...@redhat.com: InitPaging: prepare PT before filling in PDE] > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c > b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c > index 9463e97..6ee9256 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c > @@ -555,12 +555,12 @@ InitPaging ( > Pt = AllocatePages (1); > ASSERT (Pt != NULL); > > - *Pte = (UINTN)Pt | IA32_PG_RW | IA32_PG_P; > - > // Split it > - for (Level4 = 0; Level4 < SIZE_4KB / sizeof(*Pt); Level4++, Pt++) { > - *Pt = Address + ((Level4 << 12) | IA32_PG_RW | IA32_PG_P); > + for (Level4 = 0; Level4 < SIZE_4KB / sizeof(*Pt); Level4++) { > + Pt[Level4] = Address + ((Level4 << 12) | IA32_PG_RW | IA32_PG_P); > } // end for PT > + > + *Pte = (UINTN)Pt | IA32_PG_RW | IA32_PG_P; > } // end if IsAddressSplit > } // end for PTE > } // end for PDE > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel >
For now I'm picking this up as well, as a separate patch, between Mike's original series and my upcoming v3. Thanks Laszlo _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel