Re: [edk2] [PATCH v2 05/12] MdeModulePkg/NvmExpressPei: Avoid updating the module-level variable
Reviewed-by: Ray Ni > -Original Message- > From: Wu, Hao A > Sent: Thursday, January 31, 2019 10:49 AM > To: edk2-devel@lists.01.org > Cc: Wu, Hao A ; Wang, Jian J ; > Ni, Ray > Subject: [PATCH v2 05/12] MdeModulePkg/NvmExpressPei: Avoid updating > the module-level variable > > This commit is out of the scope for BZ-1409. The commit will remove the call > of RegisterForShadow() at the entry point of the driver. By doing so, the > driver is now possible to be executed without being re-loaded into > permanent memory. > > Thus, this commit will update the NvmExpressPei driver to avoid updating > the content of a global variable. > > Cc: Jian J Wang > Cc: Ray Ni > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Hao Wu > --- > MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h | 12 +- > MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c| 153 > +++- > MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c | 11 +- > 3 files changed, 92 insertions(+), 84 deletions(-) > > diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h > b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h > index 0bd62c2459..0135eca6f0 100644 > --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h > +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h > @@ -2,7 +2,7 @@ >The NvmExpressPei driver is used to manage non-volatile memory > subsystem >which follows NVM Express specification at PEI phase. > > - Copyright (c) 2018, Intel Corporation. All rights reserved. > + Copyright (c) 2018 - 2019, Intel Corporation. All rights > + reserved. > >This program and the accompanying materials >are licensed and made available under the terms and conditions @@ - > 147,13 +147,9 @@ struct _PEI_NVME_CONTROLLER_PRIVATE_DATA { >CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, EndOfPeiNotifyList, > NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE) > > > -/** > - Initialize IOMMU. > -**/ > -VOID > -IoMmuInit ( > - VOID > - ); > +// > +// Internal functions > +// > > /** >Allocates pages that are suitable for an OperationBusMasterCommonBuffer > or diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c > b/MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c > index 51b48d38dd..cb629c16b0 100644 > --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c > +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c > @@ -1,7 +1,7 @@ > /** @file >The DMA memory help function. > > - Copyright (c) 2018, Intel Corporation. All rights reserved. > + Copyright (c) 2018 - 2019, Intel Corporation. All rights > + reserved. > >This program and the accompanying materials >are licensed and made available under the terms and conditions @@ -16,7 > +16,33 @@ > > #include "NvmExpressPei.h" > > -EDKII_IOMMU_PPI *mIoMmu; > +/** > + Get IOMMU PPI. > + > + @return Pointer to IOMMU PPI. > + > +**/ > +EDKII_IOMMU_PPI * > +GetIoMmu ( > + VOID > + ) > +{ > + EFI_STATUS Status; > + EDKII_IOMMU_PPI*IoMmu; > + > + IoMmu = NULL; > + Status = PeiServicesLocatePpi ( > + , > + 0, > + NULL, > + (VOID **) > + ); > + if (!EFI_ERROR (Status) && (IoMmu != NULL)) { > +return IoMmu; > + } > + > + return NULL; > +} > > /** >Provides the controller-specific addresses required to access system > memory from a @@ -46,18 +72,21 @@ IoMmuMap ( >OUT VOID **Mapping >) > { > - EFI_STATUS Status; > - UINT64 Attribute; > - > - if (mIoMmu != NULL) { > -Status = mIoMmu->Map ( > - mIoMmu, > - Operation, > - HostAddress, > - NumberOfBytes, > - DeviceAddress, > - Mapping > - ); > + EFI_STATUS Status; > + UINT64 Attribute; > + EDKII_IOMMU_PPI*IoMmu; > + > + IoMmu = GetIoMmu (); > + > + if (IoMmu != NULL) { > +Status = IoMmu->Map ( > + IoMmu, > + Operation, > + HostAddress, > + NumberOfBytes, > + DeviceAddress, > + Mapping > + ); > if (EFI_ERROR (Status)) { >return EFI_OUT_OF_RESOURCES; > } > @@ -78,11 +107,11 @@ IoMmuMap ( >ASSERT(FALSE); >return EFI_INVALID_PARAMETER; > } > -Status = mIoMmu->SetAttribute ( > - mIoMmu, > - *Mapping, > - Attribute > - ); > +Status = IoMmu->SetAttribute ( > + IoMmu, > + *Mapping, > + Attribute > + ); > if (EFI_ERROR (Status)) { >return Status; > } > @@ -108,11 +137,14 @@ IoMmuUnmap ( >IN VOID *Mapping >) > { > - EFI_STATUS Status; > + EFI_STATUS Status; > +
[edk2] [PATCH v2 05/12] MdeModulePkg/NvmExpressPei: Avoid updating the module-level variable
This commit is out of the scope for BZ-1409. The commit will remove the call of RegisterForShadow() at the entry point of the driver. By doing so, the driver is now possible to be executed without being re-loaded into permanent memory. Thus, this commit will update the NvmExpressPei driver to avoid updating the content of a global variable. Cc: Jian J Wang Cc: Ray Ni Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Hao Wu --- MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h | 12 +- MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c| 153 +++- MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.c | 11 +- 3 files changed, 92 insertions(+), 84 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h index 0bd62c2459..0135eca6f0 100644 --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPei.h @@ -2,7 +2,7 @@ The NvmExpressPei driver is used to manage non-volatile memory subsystem which follows NVM Express specification at PEI phase. - Copyright (c) 2018, Intel Corporation. All rights reserved. + Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions @@ -147,13 +147,9 @@ struct _PEI_NVME_CONTROLLER_PRIVATE_DATA { CR (a, PEI_NVME_CONTROLLER_PRIVATE_DATA, EndOfPeiNotifyList, NVME_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE) -/** - Initialize IOMMU. -**/ -VOID -IoMmuInit ( - VOID - ); +// +// Internal functions +// /** Allocates pages that are suitable for an OperationBusMasterCommonBuffer or diff --git a/MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c b/MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c index 51b48d38dd..cb629c16b0 100644 --- a/MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c +++ b/MdeModulePkg/Bus/Pci/NvmExpressPei/DmaMem.c @@ -1,7 +1,7 @@ /** @file The DMA memory help function. - Copyright (c) 2018, Intel Corporation. All rights reserved. + Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions @@ -16,7 +16,33 @@ #include "NvmExpressPei.h" -EDKII_IOMMU_PPI *mIoMmu; +/** + Get IOMMU PPI. + + @return Pointer to IOMMU PPI. + +**/ +EDKII_IOMMU_PPI * +GetIoMmu ( + VOID + ) +{ + EFI_STATUS Status; + EDKII_IOMMU_PPI*IoMmu; + + IoMmu = NULL; + Status = PeiServicesLocatePpi ( + , + 0, + NULL, + (VOID **) + ); + if (!EFI_ERROR (Status) && (IoMmu != NULL)) { +return IoMmu; + } + + return NULL; +} /** Provides the controller-specific addresses required to access system memory from a @@ -46,18 +72,21 @@ IoMmuMap ( OUT VOID **Mapping ) { - EFI_STATUS Status; - UINT64 Attribute; - - if (mIoMmu != NULL) { -Status = mIoMmu->Map ( - mIoMmu, - Operation, - HostAddress, - NumberOfBytes, - DeviceAddress, - Mapping - ); + EFI_STATUS Status; + UINT64 Attribute; + EDKII_IOMMU_PPI*IoMmu; + + IoMmu = GetIoMmu (); + + if (IoMmu != NULL) { +Status = IoMmu->Map ( + IoMmu, + Operation, + HostAddress, + NumberOfBytes, + DeviceAddress, + Mapping + ); if (EFI_ERROR (Status)) { return EFI_OUT_OF_RESOURCES; } @@ -78,11 +107,11 @@ IoMmuMap ( ASSERT(FALSE); return EFI_INVALID_PARAMETER; } -Status = mIoMmu->SetAttribute ( - mIoMmu, - *Mapping, - Attribute - ); +Status = IoMmu->SetAttribute ( + IoMmu, + *Mapping, + Attribute + ); if (EFI_ERROR (Status)) { return Status; } @@ -108,11 +137,14 @@ IoMmuUnmap ( IN VOID *Mapping ) { - EFI_STATUS Status; + EFI_STATUS Status; + EDKII_IOMMU_PPI*IoMmu; + + IoMmu = GetIoMmu (); - if (mIoMmu != NULL) { -Status = mIoMmu->SetAttribute (mIoMmu, Mapping, 0); -Status = mIoMmu->Unmap (mIoMmu, Mapping); + if (IoMmu != NULL) { +Status = IoMmu->SetAttribute (IoMmu, Mapping, 0); +Status = IoMmu->Unmap (IoMmu, Mapping); } else { Status = EFI_SUCCESS; } @@ -148,39 +180,42 @@ IoMmuAllocateBuffer ( EFI_STATUSStatus; UINTN NumberOfBytes; EFI_PHYSICAL_ADDRESS HostPhyAddress; + EDKII_IOMMU_PPI *IoMmu; *HostAddress = NULL; *DeviceAddress = 0; - if (mIoMmu !=