* [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory @ 2019-04-19 14:13 Ard Biesheuvel 2019-04-19 17:36 ` [edk2-devel] " Michael D Kinney 0 siblings, 1 reply; 12+ messages in thread From: Ard Biesheuvel @ 2019-04-19 14:13 UTC (permalink / raw) To: devel; +Cc: ming.huang, hao.a.wu, jian.j.wang, Ard Biesheuvel Given that the firmware itself may access the ESRT table when the OS invokes the UpdateCapsule () boot service, it requires a virtual mapping and so it needs to be allocated from RtServicesData memory. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c b/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c index a386a9770583..1741cbe8f2b5 100644 --- a/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c +++ b/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c @@ -571,7 +571,8 @@ EsrtReadyToBootEventNotify ( goto EXIT; } - EsrtTable = AllocatePool(sizeof(EFI_SYSTEM_RESOURCE_TABLE) + NonFmpRepositorySize + FmpRepositorySize); + EsrtTable = AllocateRuntimePool (sizeof(EFI_SYSTEM_RESOURCE_TABLE) + + NonFmpRepositorySize + FmpRepositorySize); if (EsrtTable == NULL) { DEBUG ((EFI_D_ERROR, "Esrt table memory allocation failure\n")); goto EXIT; -- 2.20.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 14:13 [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory Ard Biesheuvel @ 2019-04-19 17:36 ` Michael D Kinney 2019-04-19 17:42 ` Ard Biesheuvel 0 siblings, 1 reply; 12+ messages in thread From: Michael D Kinney @ 2019-04-19 17:36 UTC (permalink / raw) To: devel@edk2.groups.io, ard.biesheuvel@linaro.org, Kinney, Michael D Cc: ming.huang@linaro.org, Wu, Hao A, Wang, Jian J Hi Ard, The UEFI Specification Section 23.3 says: "The ESRT shall be stored in memory of type EfiBootServicesData." If an RT driver needs ESRT info after ExitBootServices(), then the RT driver should collect that information before ExitBootServices(). Best regards, Mike > -----Original Message----- > From: devel@edk2.groups.io > [mailto:devel@edk2.groups.io] On Behalf Of Ard > Biesheuvel > Sent: Friday, April 19, 2019 7:13 AM > To: devel@edk2.groups.io > Cc: ming.huang@linaro.org; Wu, Hao A > <hao.a.wu@intel.com>; Wang, Jian J > <jian.j.wang@intel.com>; Ard Biesheuvel > <ard.biesheuvel@linaro.org> > Subject: [edk2-devel] [PATCH resend] > MdeModulePkg/EsrtDxe: allocate ESRT table from > RtServicesData memory > > Given that the firmware itself may access the ESRT > table when the OS > invokes the UpdateCapsule () boot service, it requires > a virtual mapping > and so it needs to be allocated from RtServicesData > memory. > > Signed-off-by: Ard Biesheuvel > <ard.biesheuvel@linaro.org> > --- > MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c > b/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c > index a386a9770583..1741cbe8f2b5 100644 > --- a/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c > +++ b/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c > @@ -571,7 +571,8 @@ EsrtReadyToBootEventNotify ( > goto EXIT; > } > > - EsrtTable = > AllocatePool(sizeof(EFI_SYSTEM_RESOURCE_TABLE) + > NonFmpRepositorySize + FmpRepositorySize); > + EsrtTable = AllocateRuntimePool > (sizeof(EFI_SYSTEM_RESOURCE_TABLE) + > + > NonFmpRepositorySize + FmpRepositorySize); > if (EsrtTable == NULL) { > DEBUG ((EFI_D_ERROR, "Esrt table memory allocation > failure\n")); > goto EXIT; > -- > 2.20.1 > > > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 17:36 ` [edk2-devel] " Michael D Kinney @ 2019-04-19 17:42 ` Ard Biesheuvel 2019-04-19 17:53 ` Ard Biesheuvel 0 siblings, 1 reply; 12+ messages in thread From: Ard Biesheuvel @ 2019-04-19 17:42 UTC (permalink / raw) To: edk2-devel-groups-io, Kinney, Michael D Cc: ming.huang@linaro.org, Wu, Hao A, Wang, Jian J On Fri, 19 Apr 2019 at 19:36, Michael D Kinney <michael.d.kinney@intel.com> wrote: > > Hi Ard, > > The UEFI Specification Section 23.3 says: > > "The ESRT shall be stored in memory of type EfiBootServicesData." > > If an RT driver needs ESRT info after ExitBootServices(), then the > RT driver should collect that information before ExitBootServices(). > But that means that before EBS(), we will have to make a copy of the ESRT into runtime services data, and we will end up using twice as much memory - one copy in boot services data for the OS, and one copy in runtime services data for the firmware itself. I understand the reasoning behind preferring boot over runtime, so that the OS is not burdened with it if it does not care. But it this case, the RT services data will be allocated regardless, and so we end up using less memory if we expose that same copy to the OS. > > > -----Original Message----- > > From: devel@edk2.groups.io > > [mailto:devel@edk2.groups.io] On Behalf Of Ard > > Biesheuvel > > Sent: Friday, April 19, 2019 7:13 AM > > To: devel@edk2.groups.io > > Cc: ming.huang@linaro.org; Wu, Hao A > > <hao.a.wu@intel.com>; Wang, Jian J > > <jian.j.wang@intel.com>; Ard Biesheuvel > > <ard.biesheuvel@linaro.org> > > Subject: [edk2-devel] [PATCH resend] > > MdeModulePkg/EsrtDxe: allocate ESRT table from > > RtServicesData memory > > > > Given that the firmware itself may access the ESRT > > table when the OS > > invokes the UpdateCapsule () boot service, it requires > > a virtual mapping > > and so it needs to be allocated from RtServicesData > > memory. > > > > Signed-off-by: Ard Biesheuvel > > <ard.biesheuvel@linaro.org> > > --- > > MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c | 3 ++- > > 1 file changed, 2 insertions(+), 1 deletion(-) > > > > diff --git a/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c > > b/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c > > index a386a9770583..1741cbe8f2b5 100644 > > --- a/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c > > +++ b/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c > > @@ -571,7 +571,8 @@ EsrtReadyToBootEventNotify ( > > goto EXIT; > > } > > > > - EsrtTable = > > AllocatePool(sizeof(EFI_SYSTEM_RESOURCE_TABLE) + > > NonFmpRepositorySize + FmpRepositorySize); > > + EsrtTable = AllocateRuntimePool > > (sizeof(EFI_SYSTEM_RESOURCE_TABLE) + > > + > > NonFmpRepositorySize + FmpRepositorySize); > > if (EsrtTable == NULL) { > > DEBUG ((EFI_D_ERROR, "Esrt table memory allocation > > failure\n")); > > goto EXIT; > > -- > > 2.20.1 > > > > > > > > > > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 17:42 ` Ard Biesheuvel @ 2019-04-19 17:53 ` Ard Biesheuvel 2019-04-19 18:08 ` Michael D Kinney 0 siblings, 1 reply; 12+ messages in thread From: Ard Biesheuvel @ 2019-04-19 17:53 UTC (permalink / raw) To: edk2-devel-groups-io, Kinney, Michael D Cc: ming.huang@linaro.org, Wu, Hao A, Wang, Jian J On Fri, 19 Apr 2019 at 19:42, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote: > > On Fri, 19 Apr 2019 at 19:36, Michael D Kinney > <michael.d.kinney@intel.com> wrote: > > > > Hi Ard, > > > > The UEFI Specification Section 23.3 says: > > > > "The ESRT shall be stored in memory of type EfiBootServicesData." > > > > If an RT driver needs ESRT info after ExitBootServices(), then the > > RT driver should collect that information before ExitBootServices(). > > > > But that means that before EBS(), we will have to make a copy of the > ESRT into runtime services data, and we will end up using twice as > much memory - one copy in boot services data for the OS, and one copy > in runtime services data for the firmware itself. I understand the > reasoning behind preferring boot over runtime, so that the OS is not > burdened with it if it does not care. But it this case, the RT > services data will be allocated regardless, and so we end up using > less memory if we expose that same copy to the OS. > Actually, DxeCapsuleLibVirtualAddressChangeEvent() in DxeCapsuleLibFmp updates the ESRT pointer to virtual, so this code is clearly based on the assumption that the ESRT resides in memory that is covered by a runtime VA mapping. Could we instead clarify the UEFI spec to something like "The ESRT shall be stored in memory of type EfiBootServicesData unless the runtime services implementations themselves need to access it at OS runtime, in which case it may be stored in EfiRuntimeServicesData." ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 17:53 ` Ard Biesheuvel @ 2019-04-19 18:08 ` Michael D Kinney 2019-04-19 18:11 ` Ard Biesheuvel 0 siblings, 1 reply; 12+ messages in thread From: Michael D Kinney @ 2019-04-19 18:08 UTC (permalink / raw) To: devel@edk2.groups.io, ard.biesheuvel@linaro.org, Kinney, Michael D Cc: ming.huang@linaro.org, Wu, Hao A, Wang, Jian J Ard, Where is the use of ESRT at runtime? The SetVa conversion of the ESRT table may be an old artifact that we should consider removing. Thanks, Mike > -----Original Message----- > From: devel@edk2.groups.io > [mailto:devel@edk2.groups.io] On Behalf Of Ard > Biesheuvel > Sent: Friday, April 19, 2019 10:54 AM > To: edk2-devel-groups-io <devel@edk2.groups.io>; > Kinney, Michael D <michael.d.kinney@intel.com> > Cc: ming.huang@linaro.org; Wu, Hao A > <hao.a.wu@intel.com>; Wang, Jian J > <jian.j.wang@intel.com> > Subject: Re: [edk2-devel] [PATCH resend] > MdeModulePkg/EsrtDxe: allocate ESRT table from > RtServicesData memory > > On Fri, 19 Apr 2019 at 19:42, Ard Biesheuvel > <ard.biesheuvel@linaro.org> wrote: > > > > On Fri, 19 Apr 2019 at 19:36, Michael D Kinney > > <michael.d.kinney@intel.com> wrote: > > > > > > Hi Ard, > > > > > > The UEFI Specification Section 23.3 says: > > > > > > "The ESRT shall be stored in memory of type > EfiBootServicesData." > > > > > > If an RT driver needs ESRT info after > ExitBootServices(), then the > > > RT driver should collect that information before > ExitBootServices(). > > > > > > > But that means that before EBS(), we will have to > make a copy of the > > ESRT into runtime services data, and we will end up > using twice as > > much memory - one copy in boot services data for the > OS, and one copy > > in runtime services data for the firmware itself. I > understand the > > reasoning behind preferring boot over runtime, so > that the OS is not > > burdened with it if it does not care. But it this > case, the RT > > services data will be allocated regardless, and so we > end up using > > less memory if we expose that same copy to the OS. > > > > Actually, DxeCapsuleLibVirtualAddressChangeEvent() in > DxeCapsuleLibFmp > updates the ESRT pointer to virtual, so this code is > clearly based on > the assumption that the ESRT resides in memory that is > covered by a > runtime VA mapping. > > Could we instead clarify the UEFI spec to something > like > > "The ESRT shall be stored in memory of type > EfiBootServicesData unless > the runtime services implementations themselves need to > access it at > OS runtime, in which case it may be stored in > EfiRuntimeServicesData." > > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 18:08 ` Michael D Kinney @ 2019-04-19 18:11 ` Ard Biesheuvel 2019-04-19 18:23 ` Michael D Kinney 0 siblings, 1 reply; 12+ messages in thread From: Ard Biesheuvel @ 2019-04-19 18:11 UTC (permalink / raw) To: Kinney, Michael D Cc: devel@edk2.groups.io, ming.huang@linaro.org, Wu, Hao A, Wang, Jian J On Fri, 19 Apr 2019 at 20:08, Kinney, Michael D <michael.d.kinney@intel.com> wrote: > > Ard, > > Where is the use of ESRT at runtime? > DxeCapsuleLibFmp is invoked at runtime by the UpdateCapsule() and QueryCapsuleCapabilities() code. The Canonical FWTS crashes on this runtime service on some ARM and x86 systems due to this issue, hence the patch. > The SetVa conversion of the ESRT table may be an old artifact > that we should consider removing. > No, it is definitely live code. > > > -----Original Message----- > > From: devel@edk2.groups.io > > [mailto:devel@edk2.groups.io] On Behalf Of Ard > > Biesheuvel > > Sent: Friday, April 19, 2019 10:54 AM > > To: edk2-devel-groups-io <devel@edk2.groups.io>; > > Kinney, Michael D <michael.d.kinney@intel.com> > > Cc: ming.huang@linaro.org; Wu, Hao A > > <hao.a.wu@intel.com>; Wang, Jian J > > <jian.j.wang@intel.com> > > Subject: Re: [edk2-devel] [PATCH resend] > > MdeModulePkg/EsrtDxe: allocate ESRT table from > > RtServicesData memory > > > > On Fri, 19 Apr 2019 at 19:42, Ard Biesheuvel > > <ard.biesheuvel@linaro.org> wrote: > > > > > > On Fri, 19 Apr 2019 at 19:36, Michael D Kinney > > > <michael.d.kinney@intel.com> wrote: > > > > > > > > Hi Ard, > > > > > > > > The UEFI Specification Section 23.3 says: > > > > > > > > "The ESRT shall be stored in memory of type > > EfiBootServicesData." > > > > > > > > If an RT driver needs ESRT info after > > ExitBootServices(), then the > > > > RT driver should collect that information before > > ExitBootServices(). > > > > > > > > > > But that means that before EBS(), we will have to > > make a copy of the > > > ESRT into runtime services data, and we will end up > > using twice as > > > much memory - one copy in boot services data for the > > OS, and one copy > > > in runtime services data for the firmware itself. I > > understand the > > > reasoning behind preferring boot over runtime, so > > that the OS is not > > > burdened with it if it does not care. But it this > > case, the RT > > > services data will be allocated regardless, and so we > > end up using > > > less memory if we expose that same copy to the OS. > > > > > > > Actually, DxeCapsuleLibVirtualAddressChangeEvent() in > > DxeCapsuleLibFmp > > updates the ESRT pointer to virtual, so this code is > > clearly based on > > the assumption that the ESRT resides in memory that is > > covered by a > > runtime VA mapping. > > > > Could we instead clarify the UEFI spec to something > > like > > > > "The ESRT shall be stored in memory of type > > EfiBootServicesData unless > > the runtime services implementations themselves need to > > access it at > > OS runtime, in which case it may be stored in > > EfiRuntimeServicesData." > > > > > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 18:11 ` Ard Biesheuvel @ 2019-04-19 18:23 ` Michael D Kinney 2019-04-19 18:38 ` Ard Biesheuvel 0 siblings, 1 reply; 12+ messages in thread From: Michael D Kinney @ 2019-04-19 18:23 UTC (permalink / raw) To: devel@edk2.groups.io, ard.biesheuvel@linaro.org, Kinney, Michael D Cc: ming.huang@linaro.org, Wu, Hao A, Wang, Jian J Ard, Let's see if we can remove the ESRT access from those paths. That would be the better fix. Thanks, Mike > -----Original Message----- > From: devel@edk2.groups.io > [mailto:devel@edk2.groups.io] On Behalf Of Ard > Biesheuvel > Sent: Friday, April 19, 2019 11:11 AM > To: Kinney, Michael D <michael.d.kinney@intel.com> > Cc: devel@edk2.groups.io; ming.huang@linaro.org; Wu, > Hao A <hao.a.wu@intel.com>; Wang, Jian J > <jian.j.wang@intel.com> > Subject: Re: [edk2-devel] [PATCH resend] > MdeModulePkg/EsrtDxe: allocate ESRT table from > RtServicesData memory > > On Fri, 19 Apr 2019 at 20:08, Kinney, Michael D > <michael.d.kinney@intel.com> wrote: > > > > Ard, > > > > Where is the use of ESRT at runtime? > > > > DxeCapsuleLibFmp is invoked at runtime by the > UpdateCapsule() and > QueryCapsuleCapabilities() code. > > The Canonical FWTS crashes on this runtime service on > some ARM and x86 > systems due to this issue, hence the patch. > > > > The SetVa conversion of the ESRT table may be an old > artifact > > that we should consider removing. > > > > No, it is definitely live code. > > > > > > > -----Original Message----- > > > From: devel@edk2.groups.io > > > [mailto:devel@edk2.groups.io] On Behalf Of Ard > > > Biesheuvel > > > Sent: Friday, April 19, 2019 10:54 AM > > > To: edk2-devel-groups-io <devel@edk2.groups.io>; > > > Kinney, Michael D <michael.d.kinney@intel.com> > > > Cc: ming.huang@linaro.org; Wu, Hao A > > > <hao.a.wu@intel.com>; Wang, Jian J > > > <jian.j.wang@intel.com> > > > Subject: Re: [edk2-devel] [PATCH resend] > > > MdeModulePkg/EsrtDxe: allocate ESRT table from > > > RtServicesData memory > > > > > > On Fri, 19 Apr 2019 at 19:42, Ard Biesheuvel > > > <ard.biesheuvel@linaro.org> wrote: > > > > > > > > On Fri, 19 Apr 2019 at 19:36, Michael D Kinney > > > > <michael.d.kinney@intel.com> wrote: > > > > > > > > > > Hi Ard, > > > > > > > > > > The UEFI Specification Section 23.3 says: > > > > > > > > > > "The ESRT shall be stored in memory of > type > > > EfiBootServicesData." > > > > > > > > > > If an RT driver needs ESRT info after > > > ExitBootServices(), then the > > > > > RT driver should collect that information > before > > > ExitBootServices(). > > > > > > > > > > > > > But that means that before EBS(), we will have to > > > make a copy of the > > > > ESRT into runtime services data, and we will end > up > > > using twice as > > > > much memory - one copy in boot services data for > the > > > OS, and one copy > > > > in runtime services data for the firmware itself. > I > > > understand the > > > > reasoning behind preferring boot over runtime, so > > > that the OS is not > > > > burdened with it if it does not care. But it this > > > case, the RT > > > > services data will be allocated regardless, and > so we > > > end up using > > > > less memory if we expose that same copy to the > OS. > > > > > > > > > > Actually, DxeCapsuleLibVirtualAddressChangeEvent() > in > > > DxeCapsuleLibFmp > > > updates the ESRT pointer to virtual, so this code > is > > > clearly based on > > > the assumption that the ESRT resides in memory that > is > > > covered by a > > > runtime VA mapping. > > > > > > Could we instead clarify the UEFI spec to something > > > like > > > > > > "The ESRT shall be stored in memory of type > > > EfiBootServicesData unless > > > the runtime services implementations themselves > need to > > > access it at > > > OS runtime, in which case it may be stored in > > > EfiRuntimeServicesData." > > > > > > > > > > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 18:23 ` Michael D Kinney @ 2019-04-19 18:38 ` Ard Biesheuvel 2019-04-19 18:43 ` Ard Biesheuvel 0 siblings, 1 reply; 12+ messages in thread From: Ard Biesheuvel @ 2019-04-19 18:38 UTC (permalink / raw) To: Kinney, Michael D Cc: devel@edk2.groups.io, ming.huang@linaro.org, Wu, Hao A, Wang, Jian J On Fri, 19 Apr 2019 at 20:23, Kinney, Michael D <michael.d.kinney@intel.com> wrote: > > Ard, > > Let's see if we can remove the ESRT access from those > paths. That would be the better fix. > I am not that familiar with this code, but it seems that the only reason we access the ESRT at runtime is to check whether a capsule is a nested FMP capsule, where the outer GUID is cross referenced against the ESRT before checking whether the inner GUID is the FMP guid. Could we relax this check? FMP capsule can only be dispatched across a reboot anyway, and so the runtime capsule handling could accept any capsule that has an inner FMP guid. If not, it means we do need to read the ESRT at runtime, in which case my patch is the simplest solution. We would have to clarify the spec though. > > -----Original Message----- > > From: devel@edk2.groups.io > > [mailto:devel@edk2.groups.io] On Behalf Of Ard > > Biesheuvel > > Sent: Friday, April 19, 2019 11:11 AM > > To: Kinney, Michael D <michael.d.kinney@intel.com> > > Cc: devel@edk2.groups.io; ming.huang@linaro.org; Wu, > > Hao A <hao.a.wu@intel.com>; Wang, Jian J > > <jian.j.wang@intel.com> > > Subject: Re: [edk2-devel] [PATCH resend] > > MdeModulePkg/EsrtDxe: allocate ESRT table from > > RtServicesData memory > > > > On Fri, 19 Apr 2019 at 20:08, Kinney, Michael D > > <michael.d.kinney@intel.com> wrote: > > > > > > Ard, > > > > > > Where is the use of ESRT at runtime? > > > > > > > DxeCapsuleLibFmp is invoked at runtime by the > > UpdateCapsule() and > > QueryCapsuleCapabilities() code. > > > > The Canonical FWTS crashes on this runtime service on > > some ARM and x86 > > systems due to this issue, hence the patch. > > > > > > > The SetVa conversion of the ESRT table may be an old > > artifact > > > that we should consider removing. > > > > > > > No, it is definitely live code. > > > > > > > > > > > -----Original Message----- > > > > From: devel@edk2.groups.io > > > > [mailto:devel@edk2.groups.io] On Behalf Of Ard > > > > Biesheuvel > > > > Sent: Friday, April 19, 2019 10:54 AM > > > > To: edk2-devel-groups-io <devel@edk2.groups.io>; > > > > Kinney, Michael D <michael.d.kinney@intel.com> > > > > Cc: ming.huang@linaro.org; Wu, Hao A > > > > <hao.a.wu@intel.com>; Wang, Jian J > > > > <jian.j.wang@intel.com> > > > > Subject: Re: [edk2-devel] [PATCH resend] > > > > MdeModulePkg/EsrtDxe: allocate ESRT table from > > > > RtServicesData memory > > > > > > > > On Fri, 19 Apr 2019 at 19:42, Ard Biesheuvel > > > > <ard.biesheuvel@linaro.org> wrote: > > > > > > > > > > On Fri, 19 Apr 2019 at 19:36, Michael D Kinney > > > > > <michael.d.kinney@intel.com> wrote: > > > > > > > > > > > > Hi Ard, > > > > > > > > > > > > The UEFI Specification Section 23.3 says: > > > > > > > > > > > > "The ESRT shall be stored in memory of > > type > > > > EfiBootServicesData." > > > > > > > > > > > > If an RT driver needs ESRT info after > > > > ExitBootServices(), then the > > > > > > RT driver should collect that information > > before > > > > ExitBootServices(). > > > > > > > > > > > > > > > > But that means that before EBS(), we will have to > > > > make a copy of the > > > > > ESRT into runtime services data, and we will end > > up > > > > using twice as > > > > > much memory - one copy in boot services data for > > the > > > > OS, and one copy > > > > > in runtime services data for the firmware itself. > > I > > > > understand the > > > > > reasoning behind preferring boot over runtime, so > > > > that the OS is not > > > > > burdened with it if it does not care. But it this > > > > case, the RT > > > > > services data will be allocated regardless, and > > so we > > > > end up using > > > > > less memory if we expose that same copy to the > > OS. > > > > > > > > > > > > > Actually, DxeCapsuleLibVirtualAddressChangeEvent() > > in > > > > DxeCapsuleLibFmp > > > > updates the ESRT pointer to virtual, so this code > > is > > > > clearly based on > > > > the assumption that the ESRT resides in memory that > > is > > > > covered by a > > > > runtime VA mapping. > > > > > > > > Could we instead clarify the UEFI spec to something > > > > like > > > > > > > > "The ESRT shall be stored in memory of type > > > > EfiBootServicesData unless > > > > the runtime services implementations themselves > > need to > > > > access it at > > > > OS runtime, in which case it may be stored in > > > > EfiRuntimeServicesData." > > > > > > > > > > > > > > > > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 18:38 ` Ard Biesheuvel @ 2019-04-19 18:43 ` Ard Biesheuvel 2019-04-19 19:46 ` Michael D Kinney 0 siblings, 1 reply; 12+ messages in thread From: Ard Biesheuvel @ 2019-04-19 18:43 UTC (permalink / raw) To: Kinney, Michael D Cc: devel@edk2.groups.io, ming.huang@linaro.org, Wu, Hao A, Wang, Jian J On Fri, 19 Apr 2019 at 20:38, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote: > > On Fri, 19 Apr 2019 at 20:23, Kinney, Michael D > <michael.d.kinney@intel.com> wrote: > > > > Ard, > > > > Let's see if we can remove the ESRT access from those > > paths. That would be the better fix. > > > > I am not that familiar with this code, but it seems that the only > reason we access the ESRT at runtime is to check whether a capsule is > a nested FMP capsule, where the outer GUID is cross referenced against > the ESRT before checking whether the inner GUID is the FMP guid. > > Could we relax this check? FMP capsule can only be dispatched across a > reboot anyway, and so the runtime capsule handling could accept any > capsule that has an inner FMP guid. > > If not, it means we do need to read the ESRT at runtime, in which case > my patch is the simplest solution. We would have to clarify the spec > though. > Actually, I might be able to cache just the list of GUIDs at ReadyToBoot, so we can do the comparisons at runtime. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 18:43 ` Ard Biesheuvel @ 2019-04-19 19:46 ` Michael D Kinney 2019-04-19 20:04 ` Michael D Kinney 0 siblings, 1 reply; 12+ messages in thread From: Michael D Kinney @ 2019-04-19 19:46 UTC (permalink / raw) To: Ard Biesheuvel, Kinney, Michael D Cc: devel@edk2.groups.io, ming.huang@linaro.org, Wu, Hao A, Wang, Jian J Ard, I think skipping the nested check at runtime is a good idea. No need for ESRT at RT and no need to cache GUIDs at EBS. Mike > -----Original Message----- > From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org] > Sent: Friday, April 19, 2019 11:43 AM > To: Kinney, Michael D <michael.d.kinney@intel.com> > Cc: devel@edk2.groups.io; ming.huang@linaro.org; Wu, > Hao A <hao.a.wu@intel.com>; Wang, Jian J > <jian.j.wang@intel.com> > Subject: Re: [edk2-devel] [PATCH resend] > MdeModulePkg/EsrtDxe: allocate ESRT table from > RtServicesData memory > > On Fri, 19 Apr 2019 at 20:38, Ard Biesheuvel > <ard.biesheuvel@linaro.org> wrote: > > > > On Fri, 19 Apr 2019 at 20:23, Kinney, Michael D > > <michael.d.kinney@intel.com> wrote: > > > > > > Ard, > > > > > > Let's see if we can remove the ESRT access from > those > > > paths. That would be the better fix. > > > > > > > I am not that familiar with this code, but it seems > that the only > > reason we access the ESRT at runtime is to check > whether a capsule is > > a nested FMP capsule, where the outer GUID is cross > referenced against > > the ESRT before checking whether the inner GUID is > the FMP guid. > > > > Could we relax this check? FMP capsule can only be > dispatched across a > > reboot anyway, and so the runtime capsule handling > could accept any > > capsule that has an inner FMP guid. > > > > If not, it means we do need to read the ESRT at > runtime, in which case > > my patch is the simplest solution. We would have to > clarify the spec > > though. > > > > Actually, I might be able to cache just the list of > GUIDs at > ReadyToBoot, so we can do the comparisons at runtime. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 19:46 ` Michael D Kinney @ 2019-04-19 20:04 ` Michael D Kinney 2019-04-20 10:25 ` Ard Biesheuvel 0 siblings, 1 reply; 12+ messages in thread From: Michael D Kinney @ 2019-04-19 20:04 UTC (permalink / raw) To: Ard Biesheuvel, Kinney, Michael D Cc: devel@edk2.groups.io, ming.huang@linaro.org, Wu, Hao A, Wang, Jian J Ard, Saw your patch to cache the GUID table. The ESRT Table is not that much bigger, so the algorithm may be simpler if you just make a copy of the ESRT table with the active entries. * 16+24 bytes per ESRT entry. * 16 bytes/entry for just the GUID. The only advantage of checking against the ESRT GUID at RT is to reject capsules that will be rejected when the capsule is processed later. This can prevent extra reboots if an OS agent is sending capsules that do not really apply to the current system. I expect OS agent to only send capsules that are in the ESRT. Mike > -----Original Message----- > From: Kinney, Michael D > Sent: Friday, April 19, 2019 12:46 PM > To: Ard Biesheuvel <ard.biesheuvel@linaro.org>; Kinney, > Michael D <michael.d.kinney@intel.com> > Cc: devel@edk2.groups.io; ming.huang@linaro.org; Wu, > Hao A <hao.a.wu@intel.com>; Wang, Jian J > <jian.j.wang@intel.com> > Subject: RE: [edk2-devel] [PATCH resend] > MdeModulePkg/EsrtDxe: allocate ESRT table from > RtServicesData memory > > Ard, > > I think skipping the nested check at runtime is a good > idea. No need for ESRT at RT and no need to cache > GUIDs > at EBS. > > Mike > > > -----Original Message----- > > From: Ard Biesheuvel > [mailto:ard.biesheuvel@linaro.org] > > Sent: Friday, April 19, 2019 11:43 AM > > To: Kinney, Michael D <michael.d.kinney@intel.com> > > Cc: devel@edk2.groups.io; ming.huang@linaro.org; Wu, > > Hao A <hao.a.wu@intel.com>; Wang, Jian J > > <jian.j.wang@intel.com> > > Subject: Re: [edk2-devel] [PATCH resend] > > MdeModulePkg/EsrtDxe: allocate ESRT table from > > RtServicesData memory > > > > On Fri, 19 Apr 2019 at 20:38, Ard Biesheuvel > > <ard.biesheuvel@linaro.org> wrote: > > > > > > On Fri, 19 Apr 2019 at 20:23, Kinney, Michael D > > > <michael.d.kinney@intel.com> wrote: > > > > > > > > Ard, > > > > > > > > Let's see if we can remove the ESRT access from > > those > > > > paths. That would be the better fix. > > > > > > > > > > I am not that familiar with this code, but it seems > > that the only > > > reason we access the ESRT at runtime is to check > > whether a capsule is > > > a nested FMP capsule, where the outer GUID is cross > > referenced against > > > the ESRT before checking whether the inner GUID is > > the FMP guid. > > > > > > Could we relax this check? FMP capsule can only be > > dispatched across a > > > reboot anyway, and so the runtime capsule handling > > could accept any > > > capsule that has an inner FMP guid. > > > > > > If not, it means we do need to read the ESRT at > > runtime, in which case > > > my patch is the simplest solution. We would have to > > clarify the spec > > > though. > > > > > > > Actually, I might be able to cache just the list of > > GUIDs at > > ReadyToBoot, so we can do the comparisons at runtime. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [edk2-devel] [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory 2019-04-19 20:04 ` Michael D Kinney @ 2019-04-20 10:25 ` Ard Biesheuvel 0 siblings, 0 replies; 12+ messages in thread From: Ard Biesheuvel @ 2019-04-20 10:25 UTC (permalink / raw) To: Kinney, Michael D Cc: devel@edk2.groups.io, ming.huang@linaro.org, Wu, Hao A, Wang, Jian J On Fri, 19 Apr 2019 at 22:04, Kinney, Michael D <michael.d.kinney@intel.com> wrote: > > Ard, > > Saw your patch to cache the GUID table. The ESRT Table > is not that much bigger, so the algorithm may be simpler > if you just make a copy of the ESRT table with the > active entries. > > * 16+24 bytes per ESRT entry. > * 16 bytes/entry for just the GUID. > > The only advantage of checking against the ESRT GUID at > RT is to reject capsules that will be rejected when the > capsule is processed later. This can prevent extra reboots > if an OS agent is sending capsules that do not really > apply to the current system. I expect OS agent to only > send capsules that are in the ESRT. > Yeah. The only problem is that some capsules have no header at all, and so without a GUID check, we might end up interpreting random data as the capsule's HeaderSize field, which would be bad. In general, I think we should be robust against random junk being passed into the QueryCapsuleCapabilities() runtime service. ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2019-04-20 10:25 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-04-19 14:13 [PATCH resend] MdeModulePkg/EsrtDxe: allocate ESRT table from RtServicesData memory Ard Biesheuvel 2019-04-19 17:36 ` [edk2-devel] " Michael D Kinney 2019-04-19 17:42 ` Ard Biesheuvel 2019-04-19 17:53 ` Ard Biesheuvel 2019-04-19 18:08 ` Michael D Kinney 2019-04-19 18:11 ` Ard Biesheuvel 2019-04-19 18:23 ` Michael D Kinney 2019-04-19 18:38 ` Ard Biesheuvel 2019-04-19 18:43 ` Ard Biesheuvel 2019-04-19 19:46 ` Michael D Kinney 2019-04-19 20:04 ` Michael D Kinney 2019-04-20 10:25 ` Ard Biesheuvel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox