Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752258AbdI1SFd (ORCPT ); Thu, 28 Sep 2017 14:05:33 -0400 Received: from mail-eopbgr10063.outbound.protection.outlook.com ([40.107.1.63]:42640 "EHLO EUR02-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750902AbdI1SF3 (ORCPT ); Thu, 28 Sep 2017 14:05:29 -0400 From: Volodymyr Babchuk To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, tee-dev@lists.linaro.org, Jens Wiklander Cc: Volodymyr Babchuk Subject: [PATCH v1 08/14] tee: optee: add registered shared parameters handling Date: Thu, 28 Sep 2017 21:04:05 +0300 Message-Id: <1506621851-6929-9-git-send-email-volodymyr_babchuk@epam.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1506621851-6929-1-git-send-email-volodymyr_babchuk@epam.com> References: <1506621851-6929-1-git-send-email-volodymyr_babchuk@epam.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [85.223.209.59] X-ClientProxiedBy: AM5PR0201CA0016.eurprd02.prod.outlook.com (2603:10a6:203:3d::26) To DB6PR0301MB2133.eurprd03.prod.outlook.com (2603:10a6:4:46::15) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a3553c6c-3a15-4604-3e6e-08d5069b7ef3 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075);SRVR:DB6PR0301MB2133; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0301MB2133;3:BBPl88bfGuzGVdeHNAa0kKDp/p61WpAqU7CauzBrtvazCb6YhtGcXIryYX+ERX85oNw4DfFxIgLHaS/NNxXXYmGaAlem5c2VfY/140Pi5MqkZ26jlEe00UNDxTYGibtsBHpkgRD3JD23YE0gPb5ArOW77v/SEoei6W8WdwS+JGbeE3yVOAq75xlHm+AkRCCOuueQoUiCOM/O+PM9h9PadMfsSDfbb+Z5ySYWGevy09wVoLbUezmagM3X0T0FS65t;25:p7KLwFWY5A+wV3KhBy3bg+M0Rhl3plpEsNYXOo3+xMjfY0xzcj5rmnzLtdjU2BpqJ0jeZAu2fYa5IhjYcRS6WOp+E1oR0z63P5MnSg7iGgC2Ng5Z5DLyjI6Pg0H5i95ompJtwnfCc2BSKH6oDXnCDwT3OjTDCcNWK7+uYGgzkX10bcZ6Xe2NjiEvK5kfJrFAsNjLXQ3N3WoS9g6CKQE/CFyzEBbmMIb2C/peOcUHkePCzCfWKeASdxJobECBAoCsdk30d3zFPfTlmn6x5Dh/i+yoX0onAkqPUVb/hHpf6Hr8DCaIBMKtW4XUDU7V7pDN3ET8mcPuCDpKCxfdnCSSQA==;31:fvEvKBoBc1a8c5ag4FXF6dtU5rQSXXPASML4caSMo52KFs5+a7CS++8rdt6J49yOaK4biAm9f4JQ54lnBGcWjF4ZRnDtETo4CnFHNKKyBZkiSUpK/Kfs8RSyKudgW6bTEnGD9gg84OYCGx3Br8tjahJ32PUJ8o46nOJCgq/FjbhzJoHIV6AHfCqwRBVBXfgyrqL9SXpoewb46PDsGN0Z5/hIUKGgBDjytvuO3RpUgzk= X-MS-TrafficTypeDiagnostic: DB6PR0301MB2133: Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Volodymyr_Babchuk@epam.com; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0301MB2133;20:oQD8xtCV72vk+ZxDvKkStcoRJ1LFjju3uhviTcN0inA4fW/+cB6a9T/qcBxG+b8FH0a/f8x8PtFfoldfFHBDx4az9kqHlOZrlIFUtglGTrL1G+2GGK/8GYt24sUoxV4zUYDcR9e66KZ/clNYo1IRAcYpnq2f3CaQggVZZwqU8DtlF4vLkjxYI3ZbB4EijLdCg4I1+tmz33X+CLN4iBVCWR4N3i481NW38U5/SMC0aIQfkBfhjo6AxdVLgMZDYABrq+IOWYEgNzHOQDLiw9mID6DfS7iFVjC0rpXnFzsVyLYKQpZTUPXFiMxMgpe9vDwxBQUpzR6liUPUk6Djv4SJU/1Vn4nmH2z8WEHRl3IzQpbWMJHSQf1Xplg4JzHiiIJa8seIdv+fpt1EBtUJHy232+dctrI+0BApvNsP3BjPhLj2I6NUQ4mKOBQF3KAN1GN5xMfY1fw7QUAjJQHJOvnrplVmDwOBGStrxATmlv+Zf69mMiVItseNQ7jAqPC0div0;4:fecuMQ8A4vdrar1mcZttR1LTEUCA+hf/LAwVurDN0ajlDoktyDA+S7hl62N2Hhop4tDwN1IakZ+MX8XR4/rM9FFKSRbYZ+qyB2vpqPpSJSGTCwflHXjqcm78/NDnCyIecwWPsmL1CcPPUbcPAkwmqZmlWOdr1GcpbIRDMmQKHQ62L4CCxWGS3QGD6zda7POgpzglLyMlj4uejbzmh+hCbYKB7jO6Imng6bvNuNQ8vQJoYlGyrxoVweWky6c0+GOeRt7KfWZAa64MgJ1X6WLK5yV5P5m5LNUBOGoIxcrxP7o= X-Exchange-Antispam-Report-Test: UriScan:(278428928389397); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(100000703101)(100105400095)(3002001)(6041248)(20161123564025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123560025)(20161123562025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:DB6PR0301MB2133;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:DB6PR0301MB2133; X-Forefront-PRVS: 0444EB1997 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(376002)(346002)(199003)(189002)(2906002)(6666003)(86362001)(72206003)(33646002)(189998001)(8936002)(106356001)(478600001)(50466002)(105586002)(316002)(42186006)(5003940100001)(36756003)(66066001)(2950100002)(6916009)(47776003)(16586007)(48376002)(6116002)(4326008)(39060400002)(7736002)(8676002)(68736007)(81156014)(81166006)(50986999)(53936002)(3846002)(101416001)(97736004)(76176999)(80792005)(305945005)(122856001)(5660300001)(50226002);DIR:OUT;SFP:1101;SCL:1;SRVR:DB6PR0301MB2133;H:EPUAKYIW2556.kyiv.epam.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0301MB2133;23:pDoVRsOH8yjX+nn4D2IDOT/v5Yzg4At48ffXxWW?= =?us-ascii?Q?LRa3srX8BwouGvsfFDI5s6Hirr3ouC2I0WrFRh3dooxHT5Qb4LQUSzkTQjp8?= =?us-ascii?Q?hD0dbhc/kb1oBs3+HGRjgGfxWMynhd1MyEgQyfqy1I/AbEFv+jhRZWsebIuw?= =?us-ascii?Q?lcTbDT6wePhmKpGn5hlBsueyESWDvI1Ix4XjEaaiD0uie3yMcsM/e61qmGkd?= =?us-ascii?Q?xQUOieWiru206oKwI+6hbNY+Cqjt9xpkIWOcTRb2kwJaXJ6Rs3tku+wBrl6x?= =?us-ascii?Q?3/cEzQKj2mtJpSKQ/Q15/ulyGk2gLptLbxRLzUCTyXGrnXqy8ZyY4Pnz0I0r?= =?us-ascii?Q?gVNU49UVpR7cDE6XVNQh53Y025q2ejG9rxL4xhJHrIyYbF+z34Skr3o5HfHG?= =?us-ascii?Q?VKNs0fz3DFRPtzrK6P8Wwuq+P/gv0EDYZSXybq1s9kPAtByiH1LmYTrFBYCV?= =?us-ascii?Q?SXog6n8ix8P5u1K8nAugJl1hrKz+fGNC6zG1ftsv24GLorIklHIO22v5/b77?= =?us-ascii?Q?BawexrNatfh6EdvyaUiLmuUlT92KeTX8FsEJnnjp7VFihYNBN0DRgGnUMIs7?= =?us-ascii?Q?S/Yd3ZtnknUK6erO8BE3Zcnz6AXuxPajFq5AfgFo3e6YPB/jG2t3uW/GAi7z?= =?us-ascii?Q?mtQwJyUGFxLtRFAmeM8F9knrdyVvBbLJEiif8H0MHqo9jeHHeGn6fN9LkkK1?= =?us-ascii?Q?a9ajxYrbH7jrVldYH1spkNDSVAijluo2PmlC1NPqZjGVn5OhyBOLOCUBsa56?= =?us-ascii?Q?OXaVmibTPBnW1GdvEKuYtVecjNAoINiutebUh/5tmN6ePzRv4kTCbFR2e2XG?= =?us-ascii?Q?4JIpEACpjMsm6j6Vop+ef+HXMZXneHalAh239JHcKhUahZZ/fV/V2x6wo9IN?= =?us-ascii?Q?VRw+UBgOWVHjHz9cgsM3qDIj0tpsE0SUV3aQQcZBfSNOr3aU698hwrue23Zk?= =?us-ascii?Q?znAekzKgBhLeYoxU7GXsCYs3fgY0x4uUTlSXZvYg9TUYrgAuG+aH+ZIC4Pem?= =?us-ascii?Q?18ElRmzqugLJ+dbI2JeackYBTDzWnKP/EKGufw0NV98Xv2i1xzeAXyL9jkZD?= =?us-ascii?Q?PzB60WIBYA3XCKUZP0LD9c/oq0AaV?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0301MB2133;6:H9JOcXlJzirW4uOTfYNcMcOF0g1TFUbP2uuEI8QsKjpMb5Pych2x612Tq3v7F58vVDG4CqagSQ7DO7v5PZjw1/lJblesTzT/Hd9AShDLxYPrNbRCCBb2E6516HZqajpeS+Q4Js13kIgFFGm2qxIC3/x6OgWKMjRFy6tvcqKiXDLuHh2wDMQQil63p4sk6z/y5gJl7uA2WNjkZbN2PcUgCQuTtkGGPjItQEWyv/MzwAGwLiBYI4TbnSH+kzFoc4UT2/gRjqWfOI/bHAlIfmmqgzLTL0h7zNaqpQygA8rg7jE14nDN+G9bsQP1uY4KzssLLDSo4NQU/ahurO7kp0qT8A==;5:wAHO8jjiQ7Zv0sEAsXtOU8L0S1a0UbqKi4CG47q/8aXvRVEB3df+Z2zDb/8QlmiTZwfO1snMuFyfU816bsTCYpiTnuszHxE4UPBs49evuDn1cdtjzPafPUaAKoGvS7/9brGGy/8ESDXQ5GvxcJzI2A==;24:U1ufAvJBYU87q18bN33kn+ldIhoZFG9npe0VFNcAOgPzze/JI/xRut4jE2ZeYmGAIpJybs5gyUnfI/rksG9cefZz4kRQ+u2rkcezPwGrwrM=;7:DEgE3eBeaOuCiZIA0ysfT9CO0HlCuru7zit4Wr5FJ0SkD1PL2FMYYNV6Gv1biAgxkyZ6SkPSPtj2VhbJu15PniWWaYjDFdeDsHEDjqyhZCDd99KmhJfZKzrmwqHWpA+ig1NcBfdzs+ZLgrHF4CIznhmCFPd1a2+glMcnsus8toJAKojULvTIzHU2cWmVddgTHWWQvfiBfEIjx7tVM8HbwNAFbFUx8Z1jSORa+nolJ5Y= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: epam.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Sep 2017 18:05:25.7673 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b41b72d0-4e9f-4c26-8a69-f949f367c91d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0301MB2133 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3924 Lines: 135 From: Volodymyr Babchuk Now, when client applications can register own shared buffers in OP-TEE, we need to extend ABI for parameter passing to/from OP-TEE. So, if OP-TEE core detects that parameter belongs to registered shared memory, it will use corresponding parameter attribute. Signed-off-by: Volodymyr Babchuk --- drivers/tee/optee/core.c | 86 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 15 deletions(-) diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index 4d448bf..a962f60 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -97,6 +97,33 @@ int optee_from_msg_param(struct tee_param *params, size_t num_params, return rc; } break; + case OPTEE_MSG_ATTR_TYPE_RMEM_INPUT: + case OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT: + case OPTEE_MSG_ATTR_TYPE_RMEM_INOUT: + p->attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT + + attr - OPTEE_MSG_ATTR_TYPE_RMEM_INPUT; + p->u.memref.size = mp->u.rmem.size; + shm = (struct tee_shm *)(unsigned long) + mp->u.rmem.shm_ref; + + if (!shm) { + p->u.memref.shm_offs = 0; + p->u.memref.shm = NULL; + break; + } + p->u.memref.shm_offs = mp->u.rmem.offs; + p->u.memref.shm = shm; + + /* Check that the memref is covered by the shm object */ + if (p->u.memref.size) { + size_t o = p->u.memref.shm_offs + + p->u.memref.size; + + if (o > tee_shm_get_size(shm)) + return -EINVAL; + } + break; + default: return -EINVAL; } @@ -104,6 +131,46 @@ int optee_from_msg_param(struct tee_param *params, size_t num_params, return 0; } +static int to_msg_param_tmp_mem(struct optee_msg_param *mp, + const struct tee_param *p) +{ + int rc; + phys_addr_t pa; + + mp->attr = OPTEE_MSG_ATTR_TYPE_TMEM_INPUT + p->attr - + TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT; + + mp->u.tmem.shm_ref = (unsigned long)p->u.memref.shm; + mp->u.tmem.size = p->u.memref.size; + + if (!p->u.memref.shm) { + mp->u.tmem.buf_ptr = 0; + return 0; + } + + rc = tee_shm_get_pa(p->u.memref.shm, p->u.memref.shm_offs, &pa); + if (rc) + return rc; + + mp->u.tmem.buf_ptr = pa; + mp->attr |= OPTEE_MSG_ATTR_CACHE_PREDEFINED << + OPTEE_MSG_ATTR_CACHE_SHIFT; + + return 0; +} + +static int to_msg_param_reg_mem(struct optee_msg_param *mp, + const struct tee_param *p) +{ + mp->attr = OPTEE_MSG_ATTR_TYPE_RMEM_INPUT + p->attr - + TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT; + + mp->u.rmem.shm_ref = (unsigned long)p->u.memref.shm; + mp->u.rmem.size = p->u.memref.size; + mp->u.rmem.offs = p->u.memref.shm_offs; + return 0; +} + /** * optee_to_msg_param() - convert from struct tee_params to OPTEE_MSG parameters * @msg_params: OPTEE_MSG parameters @@ -116,7 +183,6 @@ int optee_to_msg_param(struct optee_msg_param *msg_params, size_t num_params, { int rc; size_t n; - phys_addr_t pa; for (n = 0; n < num_params; n++) { const struct tee_param *p = params + n; @@ -139,22 +205,12 @@ int optee_to_msg_param(struct optee_msg_param *msg_params, size_t num_params, case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT: case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT: case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT: - mp->attr = OPTEE_MSG_ATTR_TYPE_TMEM_INPUT + - p->attr - - TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT; - mp->u.tmem.shm_ref = (unsigned long)p->u.memref.shm; - mp->u.tmem.size = p->u.memref.size; - if (!p->u.memref.shm) { - mp->u.tmem.buf_ptr = 0; - break; - } - rc = tee_shm_get_pa(p->u.memref.shm, - p->u.memref.shm_offs, &pa); + if (tee_shm_is_registered(p->u.memref.shm)) + rc = to_msg_param_reg_mem(mp, p); + else + rc = to_msg_param_tmp_mem(mp, p); if (rc) return rc; - mp->u.tmem.buf_ptr = pa; - mp->attr |= OPTEE_MSG_ATTR_CACHE_PREDEFINED << - OPTEE_MSG_ATTR_CACHE_SHIFT; break; default: return -EINVAL; -- 2.7.4