diff options
author | Etienne Carriere <etienne.carriere@foss.st.com> | 2023-11-29 13:37:53 +0100 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2023-12-19 10:07:48 -0500 |
commit | 51774b3b03a60a553cf183e6b8f5f8ee80afe625 (patch) | |
tree | 00aa51a5dcd8ad6bdfe9f28e3f0f432656743f52 | |
parent | ab9500e9c3fa1a4512eeebcc616f7ba73cf938ef (diff) | |
download | u-boot-51774b3b03a60a553cf183e6b8f5f8ee80afe625.zip u-boot-51774b3b03a60a553cf183e6b8f5f8ee80afe625.tar.gz u-boot-51774b3b03a60a553cf183e6b8f5f8ee80afe625.tar.bz2 |
tee: optee: don't enumerate services if there ain't any
Change optee driver service enumeration to not enumerate (and
allocate a zero sized shared memory buffer) when OP-TEE
reports that there is no service to enumerate.
This change fixes an existing issue that occurs when the such zero
sized shared memory buffer allocated from malloc() has a physical
address of offset 0 of a physical 4kB page. In such case, OP-TEE
secure world refuses to register the zero-sized shared memory
area and makes U-Boot optee service enumeration to fail.
Fixes: 94ccfb78a4d6 ("drivers: tee: optee: discover OP-TEE services")
Signed-off-by: Etienne Carriere <etienne.carriere@foss.st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
-rw-r--r-- | drivers/tee/optee/core.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index 5308dd5..47f845c 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -139,6 +139,11 @@ static int enum_services(struct udevice *dev, struct tee_shm **shm, size_t *coun if (ret) return ret; + if (!shm_size) { + *count = 0; + return 0; + } + ret = tee_shm_alloc(dev, shm_size, 0, shm); if (ret) { dev_err(dev, "Failed to allocated shared memory: %d\n", ret); @@ -185,14 +190,15 @@ static int bind_service_drivers(struct udevice *dev) ret = enum_services(dev, &service_list, &service_count, tee_sess, PTA_CMD_GET_DEVICES); - if (!ret) + if (!ret && service_count) ret = bind_service_list(dev, service_list, service_count); tee_shm_free(service_list); + service_list = NULL; ret2 = enum_services(dev, &service_list, &service_count, tee_sess, PTA_CMD_GET_DEVICES_SUPP); - if (!ret2) + if (!ret2 && service_count) ret2 = bind_service_list(dev, service_list, service_count); tee_shm_free(service_list); |