From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A32339EB47 for ; Wed, 29 Jul 2026 07:06:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785308773; cv=none; b=Agdb7W5r0D3WGVuYTDOBSBhnsIrkUmoQWdr4HbfJ0MQWT4OPUbEFvOi/q5/St8hTVUgEUokXqXgHfrGRhaMceM1IXO4Bk7puJMNAf78Wm4I4QZWFJ622YnRXy6VLqLvrppUFh3hbqGFgfuUzcd+twD7ZJO63q4gFfXyeOPfdZdY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785308773; c=relaxed/simple; bh=JpbjOed841uoNyZgbbrf8oa3r2l9U4SVOjjXNLfnmJI=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=i847xZnTnufE5kimHcd1IFnc+J33R2HsETtlp6/nBV5KkBcEBIH+S14OHr4evawmzi1fJVcyOpFmnrb+Pn9/sz2/FcDjwt/k0/iZg5VxDO4NzAAwMIrIUpp+I3O3nKNZMuDIGMVL2pe+dNnrzaNXbgfZA7lT0s/eFqXpHx4BvF4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=Mjv1wOyW; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ViA3HwlY; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Mjv1wOyW"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ViA3HwlY" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66T4cJU21153568 for ; Wed, 29 Jul 2026 07:06:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 0OUBm1wl/4W/uyUJqKNXcBjQ/DSKUZnbvbwlpTjWvcM=; b=Mjv1wOyWnFk/+5+G B/vIP2NNnvtgeD6gNYkjDrHF5ANhV+8F4dc8IZJkAVd1PY9KjSRdm+M4f0QWiiu4 zhU9HS7BkxDp7htc30m4tKu/3xoiY1XJvKkYzyKgtkpcK3iHzeW2hf8VCqMLaegs b3c8JVg1WxjLmyE5bwA2w6MmnBbw91Z38ZW3NZoDpNMRtYmIMtIZ24ce/mnGUDt+ xD0ebUJ9ZuIzZ1WQk/WTdpaKNZBxDiUU1c+WWAIq03wnGEqwRuz3V9KcpICNuBKo 1b5erltXPrx5qEgqPhRC3vcV51cY7Q8IgVE0u4zp9XIVGYKnpHREcEXiiKFSCZSf /kJpQg== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fq108tmv7-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 29 Jul 2026 07:06:11 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-38e54b6556aso716866a91.2 for ; Wed, 29 Jul 2026 00:06:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1785308770; x=1785913570; darn=vger.kernel.org; h=content-transfer-encoding:content-type:in-reply-to:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to :content-type; bh=0OUBm1wl/4W/uyUJqKNXcBjQ/DSKUZnbvbwlpTjWvcM=; b=ViA3HwlYR4e+9iXhJL3vFt9zOxGQiWea3zgXVMhjJcIqSMLAdutcVsY6QmzRrM6jId mzNn1ipx8I6C5IysZclqvJMuvENniXXE/Y9MzuOZmleW/lz9YKFgYYyfR5Nm7XjRdYfx /xLZEbsi5CrAnm1FJqn+NV6FSKgs6iEmBksbBX4UAi4aN5K2esWJDfEtGmfXT5e7BL/t 4ykRH/qtjXoMEhn3xYlJjdMJ1V9ui10HIxfU0AIyX2yNbzCGnx68yv03C+rWIHsLp5qF f5wiolZZI9MyvntuxTbvSXSL809uiVPvR7lmQMuHIed3fVlT928MCgudhf46W6CHxlDi HkKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785308770; x=1785913570; h=content-transfer-encoding:content-type:in-reply-to:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=0OUBm1wl/4W/uyUJqKNXcBjQ/DSKUZnbvbwlpTjWvcM=; b=NZsQjJsRCJVBQzw1cdhR2Hfq3fHQhm9jsSHXc5SIuratts3aghAIukbq0o9aQFWMa+ Pp4uQdODJ8Le7Frp2nMarR5EqxYQcZ+hsEZxBLMYlMpA/pDLpATEbFJ+hSyKSIGfgin3 u8CgmrLrUyo/HjiQrLySv/q/H8cwESbc129GP3CdVXACKFgbW0Vp2C32egAvfkz7fOCp PIWe77tJXWTz5oZ4U9T5XDsXlxEILAUS+A81nSViaCi7jASC3SFuYzH127rTlD1V1Jc6 jtctz5BuKhHqKRFlvkpzgnK5UQkTDkq4hLk1ZQ/RiUzXRr6qUXPTSFHA28xCqYcYfs47 nJyg== X-Forwarded-Encrypted: i=1; AHgh+Ron/3B86KD0O1nCcCHRQQvrtRAikPsTVtphxJAqQhQzkSO9mDjQdRsM/0uOX02q2ioj0hTEJr3j2m7gaSk=@vger.kernel.org X-Gm-Message-State: AOJu0Yyw/EjWe77bGJc36l1BkABQgktB+Oj0PF6Mn/uzh4wydj0lnQ7e tpfxTR9UTTtg/PRsogJeqF1ZJ6iRm6DbOYmZtw06KOcIdRwC4SnARosJj/dtLHEZKcpFKXs3+Nq 4dJR7dTcOInKo+pjpzAFKScIBtd90GLQ64dEPYtDXV1/ctPJL7cdeQuODEqtpTdFxSA== X-Gm-Gg: AR+sD13s9O/22DmX49AbCWg8JYzFB4R47zx24aketVJkbUkW6iittOGyVOlXut/nuZw T3ZiFwmzxveh6mUSOKWADnds7uQTZ7xym9mNYbZOW7VjBRAg0cz5KxO4jEgPGKuwr9nQ3fcUlsU 0Fvyq6XEHvI631D/rOc+s2lJKSQ5xpdp1RYrkwqJC91FzSClAjB0HjxF7li+/xFo8g3JvwP55fn MynhFxXzwBVphIkxnfHMFOlDO5YizMzzRFKrfB5xBhqgugCtnXKiHEhuiizUrmh8dTDeFFFtfqm T+F3NoWtJz2Tr9qrP/Z65eZPJQPVigawJC663XQkOvrG6mgGDgSkzhT+r7yFM4iYLOd+Qwza1Tz x2QGBqrjLVxWTlpz8BMBdGW5GDrmQlfFtUw== X-Received: by 2002:a17:90b:3a4c:b0:37f:e326:6559 with SMTP id 98e67ed59e1d1-38f6a438830mr6228986a91.22.1785308770294; Wed, 29 Jul 2026 00:06:10 -0700 (PDT) X-Received: by 2002:a17:90b:3a4c:b0:37f:e326:6559 with SMTP id 98e67ed59e1d1-38f6a438830mr6228940a91.22.1785308769668; Wed, 29 Jul 2026 00:06:09 -0700 (PDT) Received: from [192.168.1.86] ([65.181.12.101]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f80717ec5sm450542a91.0.2026.07.29.00.06.04 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 29 Jul 2026 00:06:09 -0700 (PDT) Message-ID: Date: Wed, 29 Jul 2026 17:06:02 +1000 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 3/6] tee: qcomtee: Allow object invokes from kernel clients To: Harshal Dev , Jens Wiklander , Jens Wiklander , Sumit Garg , Bjorn Andersson , Konrad Dybcio Cc: Basant Kumar , Apurupa Pattapu , Arun Kumar Neelakantam , op-tee@lists.trustedfirmware.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org References: <20260722-qcom_uefisecapp_migrate_qcomtee-v2-0-b8a8fcbe4211@oss.qualcomm.com> <20260722-qcom_uefisecapp_migrate_qcomtee-v2-3-b8a8fcbe4211@oss.qualcomm.com> Content-Language: en-US From: Amirreza Zarrabi In-Reply-To: <20260722-qcom_uefisecapp_migrate_qcomtee-v2-3-b8a8fcbe4211@oss.qualcomm.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Proofpoint-ORIG-GUID: y9TZm-KG2pXDSw-PFkzirNL7xWvSaR3i X-Authority-Analysis: v=2.4 cv=fufsol4f c=1 sm=1 tr=0 ts=6a69a663 cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=1tOsOel+q48EdXbnVOFv2g==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=Xs04euXehvGDb6oPuSgA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-GUID: y9TZm-KG2pXDSw-PFkzirNL7xWvSaR3i X-Proofpoint-Spam-Info: AW1haW4tMjYwNzI5MDA1NSBTYWx0ZWRfX3dzs+hKcqWbc vGvaC+H4Uk4UnV4/vSWQXDJiRTKUhRFx3h9gKhIqeWRyQ33fAAf146ChrGNrYLxDVsSxgzHR4O0 DDtgmrVvV9tErmrbb+vJ4PXZqh0nBjQ= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzI5MDA1NSBTYWx0ZWRfX9DBrdf56N06w L9gjAWcyUwxUmkFFcnhFOozUErHb5TGaXjtULF8y2OqlOCsfPW315ayPlbw8f6l6cKqNq+0aEGA GtqOc5Q/PIstTGfzJVu0BOOxIqrUgQYfLU3LFlFhggVND9CxLD2HiJY+EMi0rJD29ffwE8fmHWv SFWBct+QvzgHLt/SqRfi8aPdvfqN2qSiih9c4ktOoHyIfkl7d0aJMruJINlcUQc7melU12S0Cpb HF8DEyJ5idxUBb2g2YN5vj+PHBvLQjQNwU+ByvPjbprAdzvDSqh7/OitW1sI0LgqlJ61vidWAxd MpROG119HTsqDbvpD1QXVk7ab7ZPX76Ga083d3/B/Hui7HP77MYEvekAGKfT69EfXxVJfgG9MUx yoctJg4L8cOngxcW7lXECeJpC5nO6FV+LfM57itDTOEupAuJj4dc1rxIFVtgnfnj4m2+vR4s9FA aWX0KyvjoVPkG+biu9Q== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-29_02,2026-07-28_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 impostorscore=0 adultscore=0 clxscore=1015 suspectscore=0 priorityscore=1501 spamscore=0 phishscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607290055 Hi Harshal, On 7/22/2026 4:59 PM, Harshal Dev wrote: > From: Amirreza Zarrabi > > QCOMTEE currently treats UBUF parameters as userspace addresses and > applies userspace restrictions when invoking the root object. This is > not suitable for object invocation requests issued by kernel clients. > > Use the kernel_ctx flag to distinguish kernel client requests from > userspace requests. For kernel contexts, do not mark UBUF parameters as > user addresses, and allow permitted root-object operations to proceed > without applying the userspace-only checks. > > This allows in-kernel users of tee_client_object_invoke_func() to issue > object invocation requests through the qcomtee backend. > > Co-developed-by: Harshal Dev > Signed-off-by: Harshal Dev > Signed-off-by: Amirreza Zarrabi > --- > drivers/tee/qcomtee/call.c | 34 +++++++++++++++++++++++----------- > drivers/tee/qcomtee/qcomtee_object.h | 5 +++-- > include/linux/tee_drv.h | 5 ++++- > 3 files changed, 30 insertions(+), 14 deletions(-) > > diff --git a/drivers/tee/qcomtee/call.c b/drivers/tee/qcomtee/call.c > index 03d33b118f6d..c1bba5fbfa3e 100644 > --- a/drivers/tee/qcomtee/call.c > +++ b/drivers/tee/qcomtee/call.c > @@ -202,7 +202,7 @@ int qcomtee_objref_from_arg(struct tee_param *param, struct qcomtee_arg *arg, > */ > static int qcomtee_params_to_args(struct qcomtee_arg *u, > struct tee_param *params, int num_params, > - struct tee_context *ctx) > + struct qcomtee_object_invoke_ctx *oic) > { > int i; > > @@ -210,8 +210,14 @@ static int qcomtee_params_to_args(struct qcomtee_arg *u, > switch (params[i].attr) { > case TEE_IOCTL_PARAM_ATTR_TYPE_UBUF_INPUT: > case TEE_IOCTL_PARAM_ATTR_TYPE_UBUF_OUTPUT: > - u[i].flags = QCOMTEE_ARG_FLAGS_UADDR; > - u[i].b.uaddr = params[i].u.ubuf.uaddr; > + u[i].flags = oic->kernel_ctx ? 0 : > + QCOMTEE_ARG_FLAGS_UADDR; > + > + if (u[i].flags && QCOMTEE_ARG_FLAGS_UADDR) > + u[i].b.uaddr = params[i].u.ubuf.uaddr; > + else > + u[i].b.addr = params[i].u.ubuf.addr; > + it is & not &&. Rather than ?:, can you have single if and update both flags and addr/uaddr. - Amir > u[i].b.size = params[i].u.ubuf.size; > > if (params[i].attr == > @@ -223,7 +229,7 @@ static int qcomtee_params_to_args(struct qcomtee_arg *u, > break; > case TEE_IOCTL_PARAM_ATTR_TYPE_OBJREF_INPUT: > u[i].type = QCOMTEE_ARG_TYPE_IO; > - if (qcomtee_objref_to_arg(&u[i], ¶ms[i], ctx)) > + if (qcomtee_objref_to_arg(&u[i], ¶ms[i], oic->ctx)) > goto out_failed; > > break; > @@ -270,7 +276,7 @@ static int qcomtee_params_to_args(struct qcomtee_arg *u, > */ > static int qcomtee_params_from_args(struct tee_param *params, > struct qcomtee_arg *u, int num_params, > - struct tee_context *ctx) > + struct qcomtee_object_invoke_ctx *oic) > { > int i, np; > > @@ -288,7 +294,8 @@ static int qcomtee_params_from_args(struct tee_param *params, > break; > case QCOMTEE_ARG_TYPE_OO: > /* TEE_IOCTL_PARAM_ATTR_TYPE_OBJREF_OUTPUT */ > - if (qcomtee_objref_from_arg(¶ms[np], &u[np], ctx)) > + if (qcomtee_objref_from_arg(¶ms[np], &u[np], > + oic->ctx)) > goto out_failed; > > break; > @@ -304,7 +311,7 @@ static int qcomtee_params_from_args(struct tee_param *params, > /* Undo qcomtee_objref_from_arg(). */ > for (i = 0; i < np; i++) { > if (params[i].attr == TEE_IOCTL_PARAM_ATTR_TYPE_OBJREF_OUTPUT) > - qcomtee_context_del_qtee_object(¶ms[i], ctx); > + qcomtee_context_del_qtee_object(¶ms[i], oic->ctx); > } > > /* Release any IO and OO objects not processed. */ > @@ -357,7 +364,8 @@ static int qcomtee_params_check(struct tee_param *params, int num_params) > } > > /* Check if an operation on ROOT_QCOMTEE_OBJECT from userspace is permitted. */ > -static int qcomtee_root_object_check(u32 op, struct tee_param *params, > +static int qcomtee_root_object_check(struct qcomtee_object_invoke_ctx *oic, > + u32 op, struct tee_param *params, > int num_params) > { > /* Some privileged operations recognized by QTEE. */ > @@ -366,6 +374,9 @@ static int qcomtee_root_object_check(u32 op, struct tee_param *params, > op == QCOMTEE_ROOT_OP_ADCI_SHUTDOWN) > return -EINVAL; > > + if (oic->kernel_ctx) > + return 0; > + > /* > * QCOMTEE_ROOT_OP_REG_WITH_CREDENTIALS is to register with QTEE > * by passing a credential object as input OBJREF. TEE_OBJREF_NULL as a > @@ -429,7 +440,8 @@ static int qcomtee_object_invoke(struct tee_context *ctx, > /* Get an object to invoke. */ > if (arg->id == TEE_OBJREF_NULL) { > /* Use ROOT if TEE_OBJREF_NULL is invoked. */ > - if (qcomtee_root_object_check(arg->op, params, arg->num_params)) > + if (qcomtee_root_object_check(oic, arg->op, params, > + arg->num_params)) > return -EINVAL; > > object = ROOT_QCOMTEE_OBJECT; > @@ -437,7 +449,7 @@ static int qcomtee_object_invoke(struct tee_context *ctx, > return -EINVAL; > } > > - ret = qcomtee_params_to_args(u, params, arg->num_params, ctx); > + ret = qcomtee_params_to_args(u, params, arg->num_params, oic); > if (ret) > goto out; > > @@ -455,7 +467,7 @@ static int qcomtee_object_invoke(struct tee_context *ctx, > > if (!result) { > /* Assume service is UNAVAIL if unable to process the result. */ > - if (qcomtee_params_from_args(params, u, arg->num_params, ctx)) > + if (qcomtee_params_from_args(params, u, arg->num_params, oic)) > result = QCOMTEE_MSG_ERROR_UNAVAIL; > } else { > /* > diff --git a/drivers/tee/qcomtee/qcomtee_object.h b/drivers/tee/qcomtee/qcomtee_object.h > index 2528d07e4576..7bd6e23b038c 100644 > --- a/drivers/tee/qcomtee/qcomtee_object.h > +++ b/drivers/tee/qcomtee/qcomtee_object.h > @@ -112,8 +112,9 @@ struct qcomtee_buffer { > * @b: address and size if the type of argument is a buffer. > * @o: object instance if the type of argument is an object. > * > - * &qcomtee_arg.flags only accepts %QCOMTEE_ARG_FLAGS_UADDR for now, which > - * states that &qcomtee_arg.b contains a userspace address in uaddr. > ++ * If %QCOMTEE_ARG_FLAGS_UADDR is set in &qcomtee_arg.flags then it implies > ++ * that &qcomtee_arg.b contains a userspace address in uaddr. > ++ * Otherwise, &qcomtee_arg.b contains a kernel address in addr. > */ > struct qcomtee_arg { > enum qcomtee_arg_type type; > diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h > index ca99c6b747a8..71d0536db60e 100644 > --- a/include/linux/tee_drv.h > +++ b/include/linux/tee_drv.h > @@ -83,7 +83,10 @@ struct tee_param_memref { > }; > > struct tee_param_ubuf { > - void __user *uaddr; > + union { > + void *addr; > + void __user *uaddr; > + }; > size_t size; > }; > >