Hi Ray and Laszlo,

I'll send out a v2 patch. Please give your comments based the new one.

Regards,
Jian


> -----Original Message-----
> From: edk2-devel [mailto:[email protected]] On Behalf Of Wang,
> Jian J
> Sent: Saturday, March 03, 2018 4:10 PM
> To: Ni, Ruiyu <[email protected]>; Laszlo Ersek <[email protected]>; edk2-
> [email protected]
> Cc: Dong, Eric <[email protected]>
> Subject: Re: [edk2] [PATCH] UefiCpuPkg/MpInitLib: put mReservedApLoopFunc
> in executable memory
> 
> > Will MEMORY_XP be recorded in GCD in future?
> > Based on today's implementation, I prefer to not check.
> >
> 
> Yes, it's in plan. Since it will impact the memory map layout, we have to be 
> very
> careful to make those changes and do thorough OS boot tests.
> 
> Regards,
> Jian
> 
> > -----Original Message-----
> > From: Ni, Ruiyu
> > Sent: Saturday, March 03, 2018 3:08 PM
> > To: Wang, Jian J <[email protected]>; Laszlo Ersek <[email protected]>;
> > [email protected]
> > Cc: Dong, Eric <[email protected]>
> > Subject: RE: [PATCH] UefiCpuPkg/MpInitLib: put mReservedApLoopFunc in
> > executable memory
> >
> >
> >
> > Thanks/Ray
> >
> > > -----Original Message-----
> > > From: Wang, Jian J
> > > Sent: Saturday, March 3, 2018 9:32 AM
> > > To: Ni, Ruiyu <[email protected]>; Laszlo Ersek <[email protected]>;
> > > [email protected]
> > > Cc: Dong, Eric <[email protected]>
> > > Subject: RE: [PATCH] UefiCpuPkg/MpInitLib: put mReservedApLoopFunc in
> > > executable memory
> > >
> > >
> > >
> > > Regards,
> > > Jian
> > >
> > >
> > > > -----Original Message-----
> > > > From: Ni, Ruiyu
> > > > Sent: Friday, March 02, 2018 7:58 PM
> > > > To: Laszlo Ersek <[email protected]>; Wang, Jian J
> > > > <[email protected]>; [email protected]
> > > > Cc: Dong, Eric <[email protected]>
> > > > Subject: Re: [PATCH] UefiCpuPkg/MpInitLib: put mReservedApLoopFunc in
> > > > executable memory
> > > >
> > > > On 3/2/2018 7:45 PM, Laszlo Ersek wrote:
> > > > > On 03/02/18 06:58, Jian J Wang wrote:
> > > > >> if PcdDxeNxMemoryProtectionPolicy is enabled for
> > > > >> EfiReservedMemoryType of memory, #PF will be triggered for each APs
> > > > >> after ExitBootServices in SCRT test. The root cause is that AP
> > > > >> wakeup code executed at that time is stored in memory of type
> > > > >> EfiReservedMemoryType (referenced by global
> > > mReservedApLoopFunc), which is marked as non-executable.
> > > > >>
> > > > >> This patch fixes this issue by setting memory of
> > > > >> mReservedApLoopFunc to be executable immediately after allocation.
> > > > >>
> > > > >> Cc: Ruiyu Ni <[email protected]>
> > > > >> Cc: Eric Dong <[email protected]>
> > > > >> Cc: Laszlo Ersek <[email protected]>
> > > > >> Contributed-under: TianoCore Contribution Agreement 1.1
> > > > >> Signed-off-by: Jian J Wang <[email protected]>
> > > > >> ---
> > > > >>   UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 15 +++++++++++++++
> > > > >>   1 file changed, 15 insertions(+)
> > > > >>
> > > > >> diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
> > > > b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
> > > > >> index fd2317924f..5fcb08677c 100644
> > > > >> --- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
> > > > >> +++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
> > > > >> @@ -399,6 +399,21 @@ InitMpGlobalData (
> > > > >>                      &Address
> > > > >>                      );
> > > > >>     ASSERT_EFI_ERROR (Status);
> > > > >> +
> > > > >> +  //
> > > > >> +  // Make sure that the buffer memory is executable.
> > > > >> +  //
> > > > >> +  Status = gDS->GetMemorySpaceDescriptor (Address, &MemDesc);  if
> > > > >> + (!EFI_ERROR (Status)) {
> > > > >> +    gDS->SetMemorySpaceAttributes (
> > > > >> +           Address,
> > > > >> +           EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (
> > > > >> +             CpuMpData->AddressMap.RelocateApLoopFuncSize
> > > > >> +             )),
> > > > >> +           MemDesc.Attributes & (~EFI_MEMORY_XP)
> > > > >> +           );
> > > > >> +  }
> > > > >> +
> > > > >>     mReservedApLoopFunc = (VOID *) (UINTN) Address;
> > > > >>     ASSERT (mReservedApLoopFunc != NULL);
> > > > >>     mReservedTopOfApStack = (UINTN) Address + EFI_PAGES_TO_SIZE
> > > > (EFI_SIZE_TO_PAGES (ApSafeBufferSize));
> > > > >>
> > > > >
> > > > > Honestly, I see little point in the "Dxe Nx Memory Protection Policy"
> > > > > when we then override it *every time* it gets in our way.
> > > > > "RelocateApLoopFuncSize" is likely significantly smaller than a full
> > > > > page, so we're making a good chunk of the "safe stack(s)" executable 
> > > > > too.
> > > > >
> > > > > Anyway, can you perhaps check BIT0 (standing for
> > > > > EfiReservedMemoryType) in PcdDxeNxMemoryProtectionPolicy, to see
> > > if the above hack is necessary?
> > > > >
> > > > > Thanks
> > > > > Laszlo
> > > > >
> > > >
> > > > Checking PCD is not very good I think.
> > > > If checking is really needed, how about check MemDesc.Attributes
> > > > EFI_MEMORY_XP bit?
> > > >
> > > >
> > >
> > > a. Page attributes update has to be in page unit. If we want to avoid 
> > > making
> > > stack memory executable, reserving it in a separate memory page is the 
> > > only
> > > way I can think of.
> > >
> > > b. Checking MemDesc.Attributes against EFI_MEMORY_XP doesn't work
> > > here. The reason is that EFI_MEMORY_XP is set to configured type of
> > > memory via CPU Arch protocol in DxeCore code, which won't be recorded in
> > > GCD service data. Maybe checking PCD BIT0 is the only way according
> current
> > > situation.
> >
> > Will MEMORY_XP be recorded in GCD in future?
> > Based on today's implementation, I prefer to not check.
> >
> > >
> > > > --
> > > > Thanks,
> > > > Ray
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to