efi_loader: Don't limit the StMM buffer size explicitly
Currently we allow and explicitly check a single shared page with StandAloneMM. This is dictated by OP-TEE which runs the application. However there's no way for us dynamically discover the number of pages we are allowed to use. Since writing big EFI signature list variable requires more than a page, OP-TEE has bumped the number of shared pages to four. Let's remove our explicit check and allow the request to reach OP-TEE even if it's bigger than what it supports. There's no need to sanitize the number of pages internally. OP-TEE will fail if we try to write more than it's allowed. The error will just trigger later on, during the StMM access. While at it add an error message to help users figure out what failed. Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Tested-by: Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org> Signed-off-by: Ilias Apalodimas <apalos@gmail.com>
This commit is contained in:
parent
40e5b53ea0
commit
2707610eb7
@ -58,6 +58,7 @@
|
|||||||
#define TEE_SUCCESS 0x00000000
|
#define TEE_SUCCESS 0x00000000
|
||||||
#define TEE_ERROR_STORAGE_NOT_AVAILABLE 0xf0100003
|
#define TEE_ERROR_STORAGE_NOT_AVAILABLE 0xf0100003
|
||||||
#define TEE_ERROR_GENERIC 0xffff0000
|
#define TEE_ERROR_GENERIC 0xffff0000
|
||||||
|
#define TEE_ERROR_EXCESS_DATA 0xffff0004
|
||||||
#define TEE_ERROR_BAD_PARAMETERS 0xffff0006
|
#define TEE_ERROR_BAD_PARAMETERS 0xffff0006
|
||||||
#define TEE_ERROR_ITEM_NOT_FOUND 0xffff0008
|
#define TEE_ERROR_ITEM_NOT_FOUND 0xffff0008
|
||||||
#define TEE_ERROR_NOT_IMPLEMENTED 0xffff0009
|
#define TEE_ERROR_NOT_IMPLEMENTED 0xffff0009
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <mm_communication.h>
|
#include <mm_communication.h>
|
||||||
|
|
||||||
#define OPTEE_PAGE_SIZE BIT(12)
|
|
||||||
extern struct efi_var_file __efi_runtime_data *efi_var_buf;
|
extern struct efi_var_file __efi_runtime_data *efi_var_buf;
|
||||||
static efi_uintn_t max_buffer_size; /* comm + var + func + data */
|
static efi_uintn_t max_buffer_size; /* comm + var + func + data */
|
||||||
static efi_uintn_t max_payload_size; /* func + data */
|
static efi_uintn_t max_payload_size; /* func + data */
|
||||||
@ -114,7 +113,11 @@ static efi_status_t optee_mm_communicate(void *comm_buf, ulong dsize)
|
|||||||
rc = tee_invoke_func(conn.tee, &arg, 2, param);
|
rc = tee_invoke_func(conn.tee, &arg, 2, param);
|
||||||
tee_shm_free(shm);
|
tee_shm_free(shm);
|
||||||
tee_close_session(conn.tee, conn.session);
|
tee_close_session(conn.tee, conn.session);
|
||||||
if (rc || arg.ret != TEE_SUCCESS)
|
if (rc)
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
if (arg.ret == TEE_ERROR_EXCESS_DATA)
|
||||||
|
log_err("Variable payload too large\n");
|
||||||
|
if (arg.ret != TEE_SUCCESS)
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
|
|
||||||
switch (param[1].u.value.a) {
|
switch (param[1].u.value.a) {
|
||||||
@ -255,15 +258,6 @@ efi_status_t EFIAPI get_max_payload(efi_uintn_t *size)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
*size = var_payload->size;
|
*size = var_payload->size;
|
||||||
/*
|
|
||||||
* Although the max payload is configurable on StMM, we only share a
|
|
||||||
* single page from OP-TEE for the non-secure buffer used to communicate
|
|
||||||
* with StMM. Since OP-TEE will reject to map anything bigger than that,
|
|
||||||
* make sure we are in bounds.
|
|
||||||
*/
|
|
||||||
if (*size > OPTEE_PAGE_SIZE)
|
|
||||||
*size = OPTEE_PAGE_SIZE - MM_COMMUNICATE_HEADER_SIZE -
|
|
||||||
MM_VARIABLE_COMMUNICATE_SIZE;
|
|
||||||
/*
|
/*
|
||||||
* There seems to be a bug in EDK2 miscalculating the boundaries and
|
* There seems to be a bug in EDK2 miscalculating the boundaries and
|
||||||
* size checks, so deduct 2 more bytes to fulfill this requirement. Fix
|
* size checks, so deduct 2 more bytes to fulfill this requirement. Fix
|
||||||
|
Loading…
Reference in New Issue
Block a user