
On 5/7/19 8:12 AM, Takahiro Akashi wrote:
On Tue, May 07, 2019 at 08:05:48AM +0200, Heinrich Schuchardt wrote:
On 5/7/19 7:58 AM, Takahiro Akashi wrote:
On Tue, May 07, 2019 at 07:53:41AM +0200, Heinrich Schuchardt wrote:
On 5/7/19 7:44 AM, Takahiro Akashi wrote:
On Tue, May 07, 2019 at 07:26:46AM +0200, Heinrich Schuchardt wrote:
On 5/7/19 5:02 AM, Takahiro Akashi wrote: > On Sat, May 04, 2019 at 10:36:33AM +0200, Heinrich Schuchardt wrote: >> In UnloadImage() we need to know if an image is already started. >> >> Add a field to the handle structure identifying loaded and started images. >> >> Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de >> --- >> include/efi_loader.h | 13 +++++++++++++ >> lib/efi_loader/efi_boottime.c | 2 ++ >> 2 files changed, 15 insertions(+) >> >> diff --git a/include/efi_loader.h b/include/efi_loader.h >> index 3fd9901d66..c2a449e5b6 100644 >> --- a/include/efi_loader.h >> +++ b/include/efi_loader.h >> @@ -182,6 +182,18 @@ struct efi_handler { >> struct list_head open_infos; >> }; >> >> +/** >> + * enum efi_object_type - type of EFI object >> + * >> + * In UnloadImage we must be able to identify if the handle relates to a >> + * started image. >> + */ >> +enum efi_object_type { >> + EFI_OBJECT_TYPE_UNDEFINED = 0, >> + EFI_OBJECT_TYPE_LOADED_IMAGE, >> + EFI_OBJECT_TYPE_STARTED_IMAGE, >> +}; > > It sounds *status*, not *type*. > In a separate patch, you added U_BOOT_FIRMWARE. > We should distinguish status and type for future enhancement and > to avoid any confusion.
Having both information in the same field makes the evaluation easier.
Currently I see not necessity for more handle types to be differentiated. Let's change it when the need arises.
I don't think we need U_BOOT_FIRMWARE if we use STARTED_IMAGE for root node. Then we can rename efi_object_type to efi_image_status.
This would allow calling UnloadImage() for the root node.
Who knows the address of root node?
Just enumerated handles with a loaded image protocol.
Remove it when enumerating handles if necessary.
No, we have to return the handle when LocateHandle() is called for the loaded image protocol.
Regards
Heinrich
For safe guard, you can add if (handle == root_node) return EFI_INVALID_PARAMETER; at the beginning of unload_image.
This would not decrease complexity.
I believe that it's much better and more understandable than confusing use of status and type.
-Takahiro Akashi
Regards
Heinrich
-Takahiro Akashi
Best regards
Heinrich
-Takahiro Akashi
Best regards
Heinrich
> > Thanks, > -Takahiro Akashi > > >> /** >> * struct efi_object - dereferenced EFI handle >> * >> @@ -204,6 +216,7 @@ struct efi_object { >> struct list_head link; >> /* The list of protocols */ >> struct list_head protocols; >> + enum efi_object_type type; >> }; >> >> /** >> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c >> index 3ed08e7c37..dc444fccf6 100644 >> --- a/lib/efi_loader/efi_boottime.c >> +++ b/lib/efi_loader/efi_boottime.c >> @@ -1554,6 +1554,7 @@ efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path, >> free(info); >> return EFI_OUT_OF_RESOURCES; >> } >> + obj->header.type = EFI_OBJECT_TYPE_LOADED_IMAGE; >> >> /* Add internal object to object list */ >> efi_add_handle(&obj->header); >> @@ -2678,6 +2679,7 @@ efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle, >> } >> >> current_image = image_handle; >> + image_obj->header.type = EFI_OBJECT_TYPE_STARTED_IMAGE; >> EFI_PRINT("Jumping into 0x%p\n", image_obj->entry); >> ret = EFI_CALL(image_obj->entry(image_handle, &systab)); >> >> -- >> 2.20.1 >> >