efi_loader: list of open protocol infos
Add a list of open protocol infos to each protocol of a handle. Provide helper functions to access the list items. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
5be9744ae7
commit
fe1599daf5
@ -96,15 +96,28 @@ extern const efi_guid_t efi_file_info_guid;
|
||||
extern unsigned int __efi_runtime_start, __efi_runtime_stop;
|
||||
extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
|
||||
|
||||
/*
|
||||
* When a protocol is opened a open protocol info entry is created.
|
||||
* These are maintained in a list.
|
||||
*/
|
||||
struct efi_open_protocol_info_item {
|
||||
/* Link to the list of open protocol info entries of a protocol */
|
||||
struct list_head link;
|
||||
struct efi_open_protocol_info_entry info;
|
||||
};
|
||||
|
||||
/*
|
||||
* When the UEFI payload wants to open a protocol on an object to get its
|
||||
* interface (usually a struct with callback functions), this struct maps the
|
||||
* protocol GUID to the respective protocol interface */
|
||||
* protocol GUID to the respective protocol interface
|
||||
*/
|
||||
struct efi_handler {
|
||||
/* Link to the list of protocols of a handle */
|
||||
struct list_head link;
|
||||
const efi_guid_t *guid;
|
||||
void *protocol_interface;
|
||||
/* Link to the list of open protocol info items */
|
||||
struct list_head open_infos;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -814,6 +814,40 @@ struct efi_object *efi_search_obj(const void *handle)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create open protocol info entry and add it to a protocol.
|
||||
*
|
||||
* @handler handler of a protocol
|
||||
* @return open protocol info entry
|
||||
*/
|
||||
static struct efi_open_protocol_info_entry *efi_create_open_info(
|
||||
struct efi_handler *handler)
|
||||
{
|
||||
struct efi_open_protocol_info_item *item;
|
||||
|
||||
item = calloc(1, sizeof(struct efi_open_protocol_info_item));
|
||||
if (!item)
|
||||
return NULL;
|
||||
/* Append the item to the open protocol info list. */
|
||||
list_add_tail(&item->link, &handler->open_infos);
|
||||
|
||||
return &item->info;
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove an open protocol info entry from a protocol.
|
||||
*
|
||||
* @handler handler of a protocol
|
||||
* @return status code
|
||||
*/
|
||||
static efi_status_t efi_delete_open_info(
|
||||
struct efi_open_protocol_info_item *item)
|
||||
{
|
||||
list_del(&item->link);
|
||||
free(item);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Install new protocol on a handle.
|
||||
*
|
||||
@ -840,6 +874,7 @@ efi_status_t efi_add_protocol(const void *handle, const efi_guid_t *protocol,
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
handler->guid = protocol;
|
||||
handler->protocol_interface = protocol_interface;
|
||||
INIT_LIST_HEAD(&handler->open_infos);
|
||||
list_add_tail(&handler->link, &efiobj->protocols);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user