aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTom Rini2023-09-04 10:51:58 -0400
committerTom Rini2023-09-04 10:51:58 -0400
commitddec4cae624e48c3678ea856fa7d6292a7104238 (patch)
treebb04231fb05cf9d3fc018bf874bbb6e8373968d8 /lib
parentf2bb6d9ffd9ba0d0d89c00445a70cf81327a7af2 (diff)
parentb27eeca112c1b9eef6f06a320a4310d766ac5659 (diff)
Merge tag 'v2023.10-rc4' into next
Prepare v2023.10-rc4
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile6
-rw-r--r--lib/efi_loader/efi_boottime.c89
-rw-r--r--lib/hash-checksum.c6
-rw-r--r--lib/optee/Kconfig8
4 files changed, 80 insertions, 29 deletions
diff --git a/lib/Makefile b/lib/Makefile
index 839872d804b..1c31ad9531e 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -73,9 +73,9 @@ obj-$(CONFIG_ECDSA) += ecdsa/
obj-$(CONFIG_$(SPL_)RSA) += rsa/
obj-$(CONFIG_HASH) += hash-checksum.o
obj-$(CONFIG_BLAKE2) += blake2/blake2b.o
-obj-$(CONFIG_SHA1) += sha1.o
-obj-$(CONFIG_SHA256) += sha256.o
-obj-$(CONFIG_SHA512) += sha512.o
+obj-$(CONFIG_$(SPL_)SHA1) += sha1.o
+obj-$(CONFIG_$(SPL_)SHA256) += sha256.o
+obj-$(CONFIG_$(SPL_)SHA512) += sha512.o
obj-$(CONFIG_CRYPT_PW) += crypt/
obj-$(CONFIG_$(SPL_)ASN1_DECODER) += asn1_decoder.o
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index 0e89c8505b1..0b7579cb5af 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -61,7 +61,7 @@ static volatile gd_t *efi_gd, *app_gd;
static efi_status_t efi_uninstall_protocol
(efi_handle_t handle, const efi_guid_t *protocol,
- void *protocol_interface);
+ void *protocol_interface, bool preserve);
/* 1 if inside U-Boot code, 0 if inside EFI payload code */
static int entry_count = 1;
@@ -208,6 +208,36 @@ static bool efi_event_is_queued(struct efi_event *event)
}
/**
+ * efi_purge_handle() - Clean the deleted handle from the various lists
+ * @handle: handle to remove
+ *
+ * Return: status code
+ */
+static efi_status_t efi_purge_handle(efi_handle_t handle)
+{
+ struct efi_register_notify_event *item;
+
+ if (!list_empty(&handle->protocols))
+ return EFI_ACCESS_DENIED;
+ /* The handle is about to be freed. Remove it from events */
+ list_for_each_entry(item, &efi_register_notify_events, link) {
+ struct efi_protocol_notification *hitem, *hnext;
+
+ list_for_each_entry_safe(hitem, hnext, &item->handles, link) {
+ if (handle == hitem->handle) {
+ list_del(&hitem->link);
+ free(hitem);
+ }
+ }
+ }
+ /* The last protocol has been removed, delete the handle. */
+ list_del(&handle->link);
+ free(handle);
+
+ return EFI_SUCCESS;
+}
+
+/**
* efi_process_event_queue() - process event queue
*/
static void efi_process_event_queue(void)
@@ -615,7 +645,7 @@ static efi_status_t efi_remove_all_protocols(const efi_handle_t handle)
efi_status_t ret;
ret = efi_uninstall_protocol(handle, &protocol->guid,
- protocol->protocol_interface);
+ protocol->protocol_interface, true);
if (ret != EFI_SUCCESS)
return ret;
}
@@ -639,10 +669,7 @@ efi_status_t efi_delete_handle(efi_handle_t handle)
return ret;
}
- list_del(&handle->link);
- free(handle);
-
- return ret;
+ return efi_purge_handle(handle);
}
/**
@@ -1356,6 +1383,8 @@ reconnect:
* @handle: handle from which the protocol shall be removed
* @protocol: GUID of the protocol to be removed
* @protocol_interface: interface to be removed
+ * @preserve: preserve or delete the handle and remove it from any
+ * list it participates if no protocols remain
*
* This function DOES NOT delete a handle without installed protocol.
*
@@ -1363,7 +1392,7 @@ reconnect:
*/
static efi_status_t efi_uninstall_protocol
(efi_handle_t handle, const efi_guid_t *protocol,
- void *protocol_interface)
+ void *protocol_interface, bool preserve)
{
struct efi_handler *handler;
struct efi_open_protocol_info_item *item;
@@ -1397,6 +1426,14 @@ static efi_status_t efi_uninstall_protocol
goto out;
}
r = efi_remove_protocol(handle, protocol, protocol_interface);
+ if (r != EFI_SUCCESS)
+ return r;
+ /*
+ * We don't care about the return value here since the
+ * handle might have more protocols installed
+ */
+ if (!preserve)
+ efi_purge_handle(handle);
out:
return r;
}
@@ -1422,15 +1459,10 @@ static efi_status_t EFIAPI efi_uninstall_protocol_interface
EFI_ENTRY("%p, %pUs, %p", handle, protocol, protocol_interface);
- ret = efi_uninstall_protocol(handle, protocol, protocol_interface);
+ ret = efi_uninstall_protocol(handle, protocol, protocol_interface, false);
if (ret != EFI_SUCCESS)
goto out;
- /* If the last protocol has been removed, delete the handle. */
- if (list_empty(&handle->protocols)) {
- list_del(&handle->link);
- free(handle);
- }
out:
return EFI_EXIT(ret);
}
@@ -2785,7 +2817,7 @@ static efi_status_t EFIAPI
efi_uninstall_multiple_protocol_interfaces_int(efi_handle_t handle,
efi_va_list argptr)
{
- const efi_guid_t *protocol;
+ const efi_guid_t *protocol, *next_protocol;
void *protocol_interface;
efi_status_t ret = EFI_SUCCESS;
size_t i = 0;
@@ -2795,25 +2827,34 @@ efi_uninstall_multiple_protocol_interfaces_int(efi_handle_t handle,
return EFI_INVALID_PARAMETER;
efi_va_copy(argptr_copy, argptr);
+ protocol = efi_va_arg(argptr, efi_guid_t*);
for (;;) {
- protocol = efi_va_arg(argptr, efi_guid_t*);
+ /*
+ * If efi_uninstall_protocol() fails we need to be able to
+ * reinstall the previously uninstalled protocols on the same
+ * handle.
+ * Instead of calling efi_uninstall_protocol(...,..., false)
+ * and potentially removing the handle, only allow the handle
+ * removal on the last protocol that we requested to uninstall.
+ * That way we can preserve the handle in case the latter fails
+ */
+ bool preserve = true;
+
if (!protocol)
break;
protocol_interface = efi_va_arg(argptr, void*);
+ next_protocol = efi_va_arg(argptr, efi_guid_t*);
+ if (!next_protocol)
+ preserve = false;
ret = efi_uninstall_protocol(handle, protocol,
- protocol_interface);
+ protocol_interface, preserve);
if (ret != EFI_SUCCESS)
break;
i++;
+ protocol = next_protocol;
}
- if (ret == EFI_SUCCESS) {
- /* If the last protocol has been removed, delete the handle. */
- if (list_empty(&handle->protocols)) {
- list_del(&handle->link);
- free(handle);
- }
+ if (ret == EFI_SUCCESS)
goto out;
- }
/* If an error occurred undo all changes. */
for (; i; --i) {
@@ -3712,7 +3753,7 @@ static efi_status_t EFIAPI efi_reinstall_protocol_interface(
new_interface);
/* Uninstall protocol but do not delete handle */
- ret = efi_uninstall_protocol(handle, protocol, old_interface);
+ ret = efi_uninstall_protocol(handle, protocol, old_interface, true);
if (ret != EFI_SUCCESS)
goto out;
diff --git a/lib/hash-checksum.c b/lib/hash-checksum.c
index 8f2a42f9a08..68c290d64d8 100644
--- a/lib/hash-checksum.c
+++ b/lib/hash-checksum.c
@@ -23,8 +23,10 @@ int hash_calculate(const char *name,
struct hash_algo *algo;
int ret = 0;
void *ctx;
- uint32_t i;
- i = 0;
+ int i;
+
+ if (region_count < 1)
+ return -EINVAL;
ret = hash_progressive_lookup_algo(name, &algo);
if (ret)
diff --git a/lib/optee/Kconfig b/lib/optee/Kconfig
index 517136a4485..e6834d4d3e1 100644
--- a/lib/optee/Kconfig
+++ b/lib/optee/Kconfig
@@ -11,6 +11,14 @@ config OPTEE_IMAGE
This option enable the OPTEE specific checks done before booting
an OPTEE image created with mkimage
+config OPTEE_TZDRAM_SIZE
+ hex "Amount of Trust-Zone RAM for the OPTEE image"
+ default 0x0000000
+ depends on OPTEE_LIB
+ help
+ The size of pre-allocated Trust Zone DRAM to allocate for the OPTEE
+ runtime.
+
config BOOTM_OPTEE
bool "Support OPTEE bootm command"
select BOOTM_LINUX