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>
master
Heinrich Schuchardt 7 years ago committed by Alexander Graf
parent 5be9744ae7
commit fe1599daf5
  1. 15
      include/efi_loader.h
  2. 35
      lib/efi_loader/efi_boottime.c

@ -97,14 +97,27 @@ 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;
};
/*

@ -815,6 +815,40 @@ struct efi_object *efi_search_obj(const void *handle)
}
/*
* 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.
*
* @handle handle on which the protocol shall be installed
@ -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…
Cancel
Save