tee: Correct inappropriate usage of TEE_SHM_DMA_BUF flag

Currently TEE_SHM_DMA_BUF flag has been inappropriately used to not
register shared memory allocated for private usage by underlying TEE
driver: OP-TEE in this case. So rather add a new flag as TEE_SHM_PRIV
that can be utilized by underlying TEE drivers for private allocation
and usage of shared memory.

With this corrected, allow tee_shm_alloc_kernel_buf() to allocate a
shared memory region without the backing of dma-buf.

Cc: stable@vger.kernel.org
Signed-off-by: Sumit Garg <sumit.garg@linaro.org>
Co-developed-by: Tyler Hicks <tyhicks@linux.microsoft.com>
Signed-off-by: Tyler Hicks <tyhicks@linux.microsoft.com>
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
Reviewed-by: Sumit Garg <sumit.garg@linaro.org>
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
This commit is contained in:
Sumit Garg 2021-06-14 17:33:15 -05:00 коммит произвёл Jens Wiklander
Родитель dc7019b7d0
Коммит 376e4199e3
6 изменённых файлов: 15 добавлений и 8 удалений

Просмотреть файл

@ -184,7 +184,7 @@ static struct tee_shm *get_msg_arg(struct tee_context *ctx, size_t num_params,
struct optee_msg_arg *ma; struct optee_msg_arg *ma;
shm = tee_shm_alloc(ctx, OPTEE_MSG_GET_ARG_SIZE(num_params), shm = tee_shm_alloc(ctx, OPTEE_MSG_GET_ARG_SIZE(num_params),
TEE_SHM_MAPPED); TEE_SHM_MAPPED | TEE_SHM_PRIV);
if (IS_ERR(shm)) if (IS_ERR(shm))
return shm; return shm;

Просмотреть файл

@ -278,7 +278,8 @@ static void optee_release(struct tee_context *ctx)
if (!ctxdata) if (!ctxdata)
return; return;
shm = tee_shm_alloc(ctx, sizeof(struct optee_msg_arg), TEE_SHM_MAPPED); shm = tee_shm_alloc(ctx, sizeof(struct optee_msg_arg),
TEE_SHM_MAPPED | TEE_SHM_PRIV);
if (!IS_ERR(shm)) { if (!IS_ERR(shm)) {
arg = tee_shm_get_va(shm, 0); arg = tee_shm_get_va(shm, 0);
/* /*

Просмотреть файл

@ -314,7 +314,7 @@ static void handle_rpc_func_cmd_shm_alloc(struct tee_context *ctx,
shm = cmd_alloc_suppl(ctx, sz); shm = cmd_alloc_suppl(ctx, sz);
break; break;
case OPTEE_RPC_SHM_TYPE_KERNEL: case OPTEE_RPC_SHM_TYPE_KERNEL:
shm = tee_shm_alloc(ctx, sz, TEE_SHM_MAPPED); shm = tee_shm_alloc(ctx, sz, TEE_SHM_MAPPED | TEE_SHM_PRIV);
break; break;
default: default:
arg->ret = TEEC_ERROR_BAD_PARAMETERS; arg->ret = TEEC_ERROR_BAD_PARAMETERS;
@ -502,7 +502,8 @@ void optee_handle_rpc(struct tee_context *ctx, struct optee_rpc_param *param,
switch (OPTEE_SMC_RETURN_GET_RPC_FUNC(param->a0)) { switch (OPTEE_SMC_RETURN_GET_RPC_FUNC(param->a0)) {
case OPTEE_SMC_RPC_FUNC_ALLOC: case OPTEE_SMC_RPC_FUNC_ALLOC:
shm = tee_shm_alloc(ctx, param->a1, TEE_SHM_MAPPED); shm = tee_shm_alloc(ctx, param->a1,
TEE_SHM_MAPPED | TEE_SHM_PRIV);
if (!IS_ERR(shm) && !tee_shm_get_pa(shm, 0, &pa)) { if (!IS_ERR(shm) && !tee_shm_get_pa(shm, 0, &pa)) {
reg_pair_from_64(&param->a1, &param->a2, pa); reg_pair_from_64(&param->a1, &param->a2, pa);
reg_pair_from_64(&param->a4, &param->a5, reg_pair_from_64(&param->a4, &param->a5,

Просмотреть файл

@ -27,7 +27,11 @@ static int pool_op_alloc(struct tee_shm_pool_mgr *poolm,
shm->paddr = page_to_phys(page); shm->paddr = page_to_phys(page);
shm->size = PAGE_SIZE << order; shm->size = PAGE_SIZE << order;
if (shm->flags & TEE_SHM_DMA_BUF) { /*
* Shared memory private to the OP-TEE driver doesn't need
* to be registered with OP-TEE.
*/
if (!(shm->flags & TEE_SHM_PRIV)) {
unsigned int nr_pages = 1 << order, i; unsigned int nr_pages = 1 << order, i;
struct page **pages; struct page **pages;
@ -60,7 +64,7 @@ err:
static void pool_op_free(struct tee_shm_pool_mgr *poolm, static void pool_op_free(struct tee_shm_pool_mgr *poolm,
struct tee_shm *shm) struct tee_shm *shm)
{ {
if (shm->flags & TEE_SHM_DMA_BUF) if (!(shm->flags & TEE_SHM_PRIV))
optee_shm_unregister(shm->ctx, shm); optee_shm_unregister(shm->ctx, shm);
free_pages((unsigned long)shm->kaddr, get_order(shm->size)); free_pages((unsigned long)shm->kaddr, get_order(shm->size));

Просмотреть файл

@ -117,7 +117,7 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx, size_t size, u32 flags)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
if ((flags & ~(TEE_SHM_MAPPED | TEE_SHM_DMA_BUF))) { if ((flags & ~(TEE_SHM_MAPPED | TEE_SHM_DMA_BUF | TEE_SHM_PRIV))) {
dev_err(teedev->dev.parent, "invalid shm flags 0x%x", flags); dev_err(teedev->dev.parent, "invalid shm flags 0x%x", flags);
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
@ -207,7 +207,7 @@ EXPORT_SYMBOL_GPL(tee_shm_alloc);
*/ */
struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size) struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size)
{ {
return tee_shm_alloc(ctx, size, TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); return tee_shm_alloc(ctx, size, TEE_SHM_MAPPED);
} }
EXPORT_SYMBOL_GPL(tee_shm_alloc_kernel_buf); EXPORT_SYMBOL_GPL(tee_shm_alloc_kernel_buf);

Просмотреть файл

@ -27,6 +27,7 @@
#define TEE_SHM_USER_MAPPED BIT(4) /* Memory mapped in user space */ #define TEE_SHM_USER_MAPPED BIT(4) /* Memory mapped in user space */
#define TEE_SHM_POOL BIT(5) /* Memory allocated from pool */ #define TEE_SHM_POOL BIT(5) /* Memory allocated from pool */
#define TEE_SHM_KERNEL_MAPPED BIT(6) /* Memory mapped in kernel space */ #define TEE_SHM_KERNEL_MAPPED BIT(6) /* Memory mapped in kernel space */
#define TEE_SHM_PRIV BIT(7) /* Memory private to TEE driver */
struct device; struct device;
struct tee_device; struct tee_device;