feat(handoff): add func to check and init a tl

Add a function to check whether a transfer list has been initialized
at the input address. If not, initialize a transfer list at the
specified location with the given size. This is to help ensure that we
don't accidently overwrite a transfer list that's been passed from a
previous stage.

Change-Id: Ic5906626df09d3801435488e258490765e8f81eb
Signed-off-by: Harrison Mutai <harrison.mutai@arm.com>
This commit is contained in:
Harrison Mutai 2024-11-06 10:03:51 +00:00
parent 523c78704f
commit f1d9459335
2 changed files with 20 additions and 0 deletions

View file

@ -110,6 +110,7 @@ struct __attribute__((packed)) transfer_list_entry {
CASSERT(sizeof(struct transfer_list_entry) == U(0x8), assert_transfer_list_entry_size);
void transfer_list_dump(struct transfer_list_header *tl);
struct transfer_list_header *transfer_list_ensure(void *addr, size_t size);
entry_point_info_t *
transfer_list_set_handoff_args(struct transfer_list_header *tl,
entry_point_info_t *ep_info);

View file

@ -521,3 +521,22 @@ void *transfer_list_entry_data(struct transfer_list_entry *entry)
}
return (uint8_t *)entry + entry->hdr_size;
}
/*******************************************************************************
* Verifies that the transfer list has not already been initialized, then
* initializes it at the specified memory location.
*
* Return pointer to the transfer list or NULL on error
* *****************************************************************************/
struct transfer_list_header *transfer_list_ensure(void *addr, size_t size)
{
struct transfer_list_header *tl = NULL;
if (transfer_list_check_header(addr) == TL_OPS_ALL) {
return (struct transfer_list_header *)addr;
}
tl = transfer_list_init((void *)addr, size);
return tl;
}