Hi Adriano, On Wed, 22 Jan 2025 at 19:09, Adriano Cordova <adria...@gmail.com> wrote: > > The coomand bootefi calls efi_init_obj_list to do the efi set up > before launching an .efi payload, but efi_init_obj_list is called > only once. There are some initializations which depend on the > environment and should be done each time a payload gets launched and > not only once. A motivation for this changes is the following order > of events: > > 1. Launch an EFI application (e.g. bootefi hello) > 2. Change the ip address > 3. Launch another application which uses the pxe protocol > > As the EFI pxe protocol was initialized when the handles > for efi net were created in 1., the ip was hardcoded there. > > In this example, another possibility would be to make a callback for ip > address changes to go all the way up to efi_net. > > Signed-off-by: Adriano Cordova <adriano.cord...@canonical.com> > --- > lib/efi_loader/efi_setup.c | 21 ++++++++++++++++++++- > 1 file changed, 20 insertions(+), 1 deletion(-) > > diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c > index aa59bc7779..164586742a 100644 > --- a/lib/efi_loader/efi_setup.c > +++ b/lib/efi_loader/efi_setup.c > @@ -12,6 +12,7 @@ > #include <log.h> > #include <asm-generic/unaligned.h> > > +#define OBJ_LIST_INITIALIZED 0 > #define OBJ_LIST_NOT_INITIALIZED 1 > > efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED; > @@ -208,6 +209,18 @@ out: > return -1; > } > > +/** > + * efi_start_obj_list() - Start EFI object list > + * > + * Return: status code > + */ > +static efi_status_t efi_start_obj_list(void) > +{ > + efi_status_t ret = EFI_SUCCESS; > + > + return ret; > +} > + > /** > * efi_init_obj_list() - Initialize and populate EFI object list > * > @@ -217,7 +230,9 @@ efi_status_t efi_init_obj_list(void) > { > efi_status_t ret = EFI_SUCCESS; > > - /* Initialize once only */ > + /* Initialize only once, but start every time if correctly > initialized*/ > + if (efi_obj_list_initialized == OBJ_LIST_INITIALIZED) > + return efi_start_obj_list();
Why do we need this? It doesn't reconfigure anything, just returns EFI_SUCCESS. efi_obj_list_initialized should already be 0 on success > if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED) > return efi_obj_list_initialized; > > @@ -349,6 +364,10 @@ efi_status_t efi_init_obj_list(void) > if (IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK) && > !IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK_EARLY)) > ret = efi_launch_capsules(); > + if (ret != EFI_SUCCESS) > + goto out; > + > + ret = efi_start_obj_list(); This isn't changing anything on the flow. I am not sure what you are trying to do here. > out: > efi_obj_list_initialized = ret; > return ret; > -- > 2.43.0 > Cheers /Ilias