Received: by 10.223.164.221 with SMTP id h29csp1145114wrb; Fri, 13 Oct 2017 12:36:38 -0700 (PDT) X-Google-Smtp-Source: AOwi7QALfCYmXrMmvX6ELsjLH3Zjrn0RR0Zgh09M0pEVvtM2TiZ7Mzej2CnZILi2FV5RmgsppgY4 X-Received: by 10.84.218.79 with SMTP id f15mr2245538plm.145.1507923398626; Fri, 13 Oct 2017 12:36:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1507923398; cv=none; d=google.com; s=arc-20160816; b=E9Y9//XepexBT+3QjP2/opeqvZ9w9hwlQ+j0phYNLytf/zLGqDqA8hcbzQy2HsR5qV ddRAjqf4XE1CShKdhpDzKJLbKlGQe67he6RUGlx72wBwnVrJ8aawAhHaDckfSUU+fo7P 1kvjesiOgnGZZyt/Fk3e/wvTV7isva0gZBtiAOS7zUXoGV4As4GyVw8/VsRhR+LAZDMy hTIdaG8BDmRHoaZScavydTaxgQ4UaEP0wmE6v4CV6wRxcI6CpDmARXlOSyMlTYV7cxta 9iARwN4zFHaXhf475PjafmdixD8dUF7IAymxYHmeWWPoG9Fq2NlgDYp/ZKrp2EF9ISVU Zwbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:spamdiagnosticmetadata :spamdiagnosticoutput:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature:arc-authentication-results; bh=q9nwIqaHJvcK9yuhl01FtilUlnOKS5koNxDeiD/hGuo=; b=KDagei9P75q9aypTYQQ/wO7SdeoXEWaBJKeWrrJiLcfGClEJle7RZrA3bAKpn3fCE6 To6wpjK885W1+SwOT7+YIbKjs0OXy5Fp3UjS4SnwWMWnOr/R+6RQzSlpIg2czreMHfaN qb3O/ru9Qs1Z1Et6OI0WHwjryTzPqgSw6PjiJ4k+lxKRVCAh/+fImOb5J5D6M0LACNQf AdBBUtnkj8ZyTrvyPQgQLVSAwfraCJZCex/86u4fwr7Uj6UPM/jUtmVUcyptqzFkmsXx nSokdi/c9kXkUf+jK/xjCLtDvz7uJg+t+UdA+sTuiOOBSegefEsc7Bg3c0cNlbBZdJG/ DzuA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@EPAM.onmicrosoft.com header.s=selector1-epam-com header.b=WoiX9sDc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j6si1003550pll.26.2017.10.13.12.36.24; Fri, 13 Oct 2017 12:36:38 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@EPAM.onmicrosoft.com header.s=selector1-epam-com header.b=WoiX9sDc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753613AbdJMTeR (ORCPT + 99 others); Fri, 13 Oct 2017 15:34:17 -0400 Received: from mail-eopbgr00066.outbound.protection.outlook.com ([40.107.0.66]:25451 "EHLO EUR02-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753593AbdJMTeO (ORCPT ); Fri, 13 Oct 2017 15:34:14 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=EPAM.onmicrosoft.com; s=selector1-epam-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=q9nwIqaHJvcK9yuhl01FtilUlnOKS5koNxDeiD/hGuo=; b=WoiX9sDcLQ4n3IsL7oJuLyTlFSSfqKaxYfK7d+BA8dSn0QLZ4rU3M8opha1yASAghwnVsJNdvy6I+Jtp10M7yddQY/e1l3IB/m9FfIN/KQnQR7/sBGTVJ35QWVwJ6xCF3MHyoHu0AkoQ8yGxZu7MzqpJGFJu4cgkIEqAvpsHye8= Received: from EPUAKYIW2556.kyiv.epam.com (85.223.209.52) by DB6PR0301MB2133.eurprd03.prod.outlook.com (2603:10a6:4:46::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Fri, 13 Oct 2017 19:34:10 +0000 Received: by EPUAKYIW2556.kyiv.epam.com (sSMTP sendmail emulation); Fri, 13 Oct 2017 22:34:06 +0300 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 , volodymyr_babchuk@epam.com Subject: [PATCH v1 09/14] tee: optee: add registered buffers handling into RPC calls Date: Fri, 13 Oct 2017 22:32:39 +0300 Message-Id: <1507923164-12796-10-git-send-email-volodymyr_babchuk@epam.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1507923164-12796-1-git-send-email-volodymyr_babchuk@epam.com> References: <1506621851-6929-1-git-send-email-volodymyr_babchuk@epam.com> <1507923164-12796-1-git-send-email-volodymyr_babchuk@epam.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [85.223.209.52] X-ClientProxiedBy: DB6P193CA0018.EURP193.PROD.OUTLOOK.COM (2603:10a6:6:29::28) To DB6PR0301MB2133.eurprd03.prod.outlook.com (2603:10a6:4:46::15) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0981bd83-1cf6-4d6a-f0bb-08d5127160cb X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075);SRVR:DB6PR0301MB2133; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0301MB2133;3:PAN2QkxKQjhZM1fB1F2hvQDyVXQ3VRAJNUCgN8iT621LYTwfOQ2cmtJce2ohgGJ9s3Izv6tVnZqwdaukbn4xVqqjJrfLH6v3d46Vme0NM7g5ntbNIaYkbpODNW8lllPIDZSvJGf3u/DYihTTwvRb8+PYYukjBfLBpZjrSJag8EKcNhw5FR3qDHtEhAz4oblckIjSfcxvEMXc42qQqRzMGLMT1AZOHekYfQv3fIU5rLKz5a3dk055J1/yhMp7oqDt;25:I2ZKF7I8pvGXiGdjg/vCXy618Xqqf84LMjUqx76ESVpOA6inMjCplyLE1WedHA0zvBagz+othdU5jEeiB2PSDkPbMqho/5Uk6NW44o772kyrch3Y7wn1kQ/vPP0+daz2ebspwVHhclBIYw5B5yf/ORQvpMVMQT3W57KECIyasHPmryskuM4DUtPVswFAor0a5yYeE+NgVifI1r9pKvDzUyRhakJHcQR4wabIIXEB2gEjdtWMDaZFxeRoLBhAjd3v0l16jmBQ3DxVPoGhu+oH0u1KJUTJG19cETPQMeFzFuvfOkfaRL8KPoGvP0qdURvenGfSuP1l2np8ReTGShrMaQ==;31:GAjtiRJO/vT6B9rNzlH8L98RqmLFrwhVqj8jlW0PPHI3GlyiuMGPLWO//j6kFYX/HrAqkvU+iqPhEy8V7pxmCQlx0zGXEs5JkEDMR+d4ssWfhW8TXH+5mHyvNalxIJZJFApH/oI+jQ0mgtBzQm6xNK3J6Qv1C66fGtj7MKgb0bd0UTRRTIRBuTcJEahrvLGG7Gsr/w0v+eXv2IPHN2gjHTy6f5SjGxtqkbuU/B2glys= X-MS-TrafficTypeDiagnostic: DB6PR0301MB2133: Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Volodymyr_Babchuk@epam.com; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0301MB2133;20:CZBVp0czg3/Fxfvbz59Gr9xjctZaQF2vzjk1cpFWybR9vELzGszHz3sZuHNI6yj7FpPDj8l8PmHcmcJcTN1LDe4sTFJRw+m9NKRCafSiW001wbjuIwP7kYecbg5Kz4Nhz+FtMn+WqaTMAQ+uG1US8+r/uBNoqHfA5SM9wYwvstWiaB4glwV7AvJ6WkILHgo0sOA5b0NQWHdUl8EjLtnzzhVHSmdY8+yXfZhTx1TlHnBADoOTbZpeBrcrGWqCArmj2XsZYOQ4y+Q3IxdgiGEYVr3nWahpc68A6jvATwq12c93gzxFArTxMT1Ihz//T0du2V9ljTrh8Mwr14xnpgOmR7nLr2f6mQ+HJcZlhJACzmqITmZ/C0v5s6lWU0TzXOnEL6BURp9Ee7DkAc1sckgAZLgiDJ138kv1aPvDIjcOCaGfhfQrDOoKr86KR7ZB980RJ198DgT1MFS8VwKzQ9HGChn4pyK+cDBW/QSaW5gIVuF85GzDCF6HD/1dtu80+/IY;4:8fkvSBM7gwkdJnbpmW0BggCMIH4mL1Ysvez0M/oD7fXVp6wFaqPVoK60XaPTxIbuyQ3C9FtLk3XpSv7tHIxHyf5fUxviklPgfrEvKmaUR1OQZ3N/lE0wffEBRWPx7yi16yJbB38sEKM29AbTu8ZgYtt5EmXrYzM0URk3F7LjuwO2aDh0wn/kLgMePDjLRIrhD1jaoTAUj2fP0EpQspIN3vvX5ry6ejLH4I9MMwHeoO8YdhBBAPM8qJkpE/66Us3k X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(93006095)(93001095)(100000703101)(100105400095)(3002001)(10201501046)(6041248)(20161123564025)(20161123555025)(20161123558100)(20161123562025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(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: 04599F3534 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(346002)(376002)(199003)(189002)(8936002)(305945005)(81166006)(3846002)(7736002)(6116002)(2950100002)(6916009)(33646002)(2906002)(5003940100001)(8676002)(106356001)(105586002)(81156014)(86362001)(189998001)(5660300001)(42186006)(16586007)(316002)(66066001)(6666003)(36756003)(101416001)(72206003)(478600001)(50466002)(50986999)(76176999)(48376002)(47776003)(68736007)(122856001)(50226002)(80792005)(39060400002)(97736004)(107886003)(4326008)(53936002);DIR:OUT;SFP:1101;SCL:1;SRVR:DB6PR0301MB2133;H:EPUAKYIW2556.kyiv.epam.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; Received-SPF: None (protection.outlook.com: epam.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0301MB2133;23:BZySCOrGU5hSay/pl/DJz0A0tTHBfNTajSE65QQ?= =?us-ascii?Q?MU/g7dncWuCsBE7BWY5BWB/iCbZPKPUCWR4LDD09JF/HXzk5rGevWqi2QgpK?= =?us-ascii?Q?1X1JLcUfp4Q6+XN8huMVDY/fYYOFOfRVA7j9DIzq7AB7tD7dSPtKPGvPLoHM?= =?us-ascii?Q?/wqinQifxqB7WjIuGUNMIluDU4z7B7RHyFnmUymCOQJYa2wVKWAsMqS5nG12?= =?us-ascii?Q?pxLzVJGiFG6wITIhpxUJWJ66XmgWMBCTjoBk50ixKZc0h9ftpWODsbGF+l9e?= =?us-ascii?Q?n+uXEp7mPK8/f8aWtgcOytRLTcbVpcA3CN2djUYLSwEmL8eEEGFXRvZ+imXG?= =?us-ascii?Q?ZPI8dtT58Ka3wcuZCxtNZYN/ltOkk8heyxFd0zuMJpfD93E6v/veEDf+RZTy?= =?us-ascii?Q?4NpXSZzRbWHWESAr+dJE3uM3ooVTSIgz+JaH+d4xE6tzOB3ehvhNket4C6ro?= =?us-ascii?Q?0IWcjHefPwkMyVQ8kVIWwh9yYEbJ3aMqbyjf+FZc+n9mkMkeCWZpqXeWo73R?= =?us-ascii?Q?WtWlfKC7sXmgQWdwA4eJTrDZFKapM9gVXAeVn2x2+DWrTr7DUE003qFXfqbp?= =?us-ascii?Q?tpWxjw5bdA0oNiLkgJi5qf5SalN1eyIwyFwprokQz4Ql4A0AVRu+SpPDDjnm?= =?us-ascii?Q?bTjFrOunGptFh0CjZrs8ahr89vyihh8EpXBZtjr+KSwdjDrXsemoXJSbz9qI?= =?us-ascii?Q?fdo7q47n3YqiBatP8hS8m3ErDcMbAt+V6nbZera+hcnA5SH2ebmOYEUeXmW9?= =?us-ascii?Q?+6ss6fX/fLNaHQ/Fm5XKWMKGVIQribm5jdRWhb19qvIifDvIWsP12YHZ3Gg3?= =?us-ascii?Q?bGJd9Aa4gxyTqP7G7ZEYiCoZlCGTNEs59GKyQOt7eMVL/R4Ab7owDWdgXIBu?= =?us-ascii?Q?iiUhIaIaWQfN+J6w7XbsW8vOdVFnQXFCdOh403nFsRdrPlvBz9Ewkk8x9G7j?= =?us-ascii?Q?J9FK4nVJTKK8a5BHgO6aJ82IXQP2C53T8JMN2WXzLca+We62RDnUZ5PgPwn7?= =?us-ascii?Q?F0tcjYm0XQ3jIqCto3lM2kiTp4kMYmWNjdE8kNM0Nvtwd+C7l3lEfXzpFcPL?= =?us-ascii?Q?HnY/fu6Vwr5e0i2sZPSLHwzlJ/xaq+z/XBXtm3IAchlvvpUDIXQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0301MB2133;6:89XbwcH5Wj+hAWpTgSN/iTzcKb2EdEWyeY2qmFXq+AY6uChVcNr7xwQC4kOWCNrD/hzpO4PZjL9tYcZ6jSIFahRnz58hw0xJHCHnHoywoBAFFNyPhYZM10qj8qlDTe3l5HUcSSHtPFMs9ZB+AEc1hPt8s5hakW7iBfGqo9joR2O+ZKzrarBMCoWodLBrJuioKsrNIDsRoN9N24EdhsyULy2ESOwwHcNm5tQVzkC9i5TxYLpz7mWMuzna6Qj81JbGxA3A/ne5645pQyhssq6atbNJR29fX4JBCw1pcSt1EBtUspmuUuaaSZJipIIBmMNUS972ja/7IKSztdAW0WsQnQ==;5:8ttQPG93flL+oSPcXyn11aC8FqHFr0QtSotKXdg7joSDObpY6DcChnrLcBl6exF0wcNh0jgV0DvpESHsyjWMglO6fgYiaKvkKZRKBestT2JRteJbbWzk8CW5q5w6EJ9+YgLqU/Lq+8UeKpyzY1XH0uOlH+b1apEn8aaUyrMbox0=;24:3iMegoSHa7Fm3NnWmn+mOfq1nFN413T/GS/migckU00IPDomPKPlrlIqmbLSaFV2Yzesdxbc3J3mYW8jsA+Ev+QSANAKqNglcKL6fps/Cag=;7:5DnBb8v63NA0mQxgLxjIWuSTsJN/yi0Er0QKuubCnmwZ5J4ekETJ6ORuf1dVq7A3oaJ83TO3l7ljhL7XYxFf+D/PEJyxefjEXdbeDMVW/yV2AJeTBauKfg0e6AlkTwxQMFmV7eschClVdRSLdotzcLNEm+29WnlD+Z6++kopn7y9Vs2bubaXZm/OjHPPwkkvZnwVsiHGnvjf/7fPbGNWq8SqDDFIa6yV722Q7cePfd8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: epam.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2017 19:34:10.2219 (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 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Volodymyr Babchuk With latest changes to OP-TEE we can use any buffers as a shared memory. Thus, it is possible for supplicant to provide part of own memory when OP-TEE asks to allocate a shared buffer. This patch adds support for such feature into RPC handling code. Now when OP-TEE asks supplicant to allocate shared buffer, supplicant can use TEE_IOC_SHM_REGISTER to provide such buffer. RPC handler is aware of this, so it will pass list of allocated pages to OP-TEE. Signed-off-by: Volodymyr Babchuk --- * free_pages_array() and friends were renamed to free_pages_list() --- drivers/tee/optee/call.c | 19 +++++++++- drivers/tee/optee/core.c | 2 + drivers/tee/optee/optee_private.h | 15 +++++++- drivers/tee/optee/rpc.c | 77 ++++++++++++++++++++++++++++++++++----- 4 files changed, 102 insertions(+), 11 deletions(-) diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c index a22f5f0..ed5e82d 100644 --- a/drivers/tee/optee/call.c +++ b/drivers/tee/optee/call.c @@ -136,6 +136,7 @@ u32 optee_do_call_with_arg(struct tee_context *ctx, phys_addr_t parg) struct optee *optee = tee_get_drvdata(ctx->teedev); struct optee_call_waiter w; struct optee_rpc_param param = { }; + struct optee_call_ctx call_ctx = { }; u32 ret; param.a0 = OPTEE_SMC_CALL_WITH_ARG; @@ -160,13 +161,14 @@ u32 optee_do_call_with_arg(struct tee_context *ctx, phys_addr_t parg) param.a1 = res.a1; param.a2 = res.a2; param.a3 = res.a3; - optee_handle_rpc(ctx, ¶m); + optee_handle_rpc(ctx, ¶m, &call_ctx); } else { ret = res.a0; break; } } + optee_rpc_finalize_call(&call_ctx); /* * We're done with our thread in secure world, if there's any * thread waiters wake up one. @@ -602,3 +604,18 @@ int optee_shm_unregister(struct tee_context *ctx, struct tee_shm *shm) tee_shm_free(shm_arg); return rc; } + +int optee_shm_register_supp(struct tee_context *ctx, struct tee_shm *shm, + struct page **pages, size_t num_pages) +{ + /* + * We don't want to register supplicant memory in OP-TEE. + * Instead information about it will be passed in RPC code. + */ + return 0; +} + +int optee_shm_unregister_supp(struct tee_context *ctx, struct tee_shm *shm) +{ + return 0; +} diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index 3729ebb..d22433c 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -331,6 +331,8 @@ static const struct tee_driver_ops optee_supp_ops = { .release = optee_release, .supp_recv = optee_supp_recv, .supp_send = optee_supp_send, + .shm_register = optee_shm_register_supp, + .shm_unregister = optee_shm_unregister_supp, }; static const struct tee_desc optee_supp_desc = { diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h index d7bc77d..61a0052 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -130,7 +130,16 @@ struct optee_rpc_param { u32 a7; }; -void optee_handle_rpc(struct tee_context *ctx, struct optee_rpc_param *param); +/* Holds context that is preserved during one STD call */ +struct optee_call_ctx { + /* information about pages list used in last allocation */ + void *pages_list; + size_t num_entries; +}; + +void optee_handle_rpc(struct tee_context *ctx, struct optee_rpc_param *param, + struct optee_call_ctx *call_ctx); +void optee_rpc_finalize_call(struct optee_call_ctx *call_ctx); void optee_wait_queue_init(struct optee_wait_queue *wq); void optee_wait_queue_exit(struct optee_wait_queue *wq); @@ -164,6 +173,10 @@ int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm, struct page **pages, size_t num_pages); int optee_shm_unregister(struct tee_context *ctx, struct tee_shm *shm); +int optee_shm_register_supp(struct tee_context *ctx, struct tee_shm *shm, + struct page **pages, size_t num_pages); +int optee_shm_unregister_supp(struct tee_context *ctx, struct tee_shm *shm); + int optee_from_msg_param(struct tee_param *params, size_t num_params, const struct optee_msg_param *msg_params); int optee_to_msg_param(struct optee_msg_param *msg_params, size_t num_params, diff --git a/drivers/tee/optee/rpc.c b/drivers/tee/optee/rpc.c index cef417f..7bd18e3 100644 --- a/drivers/tee/optee/rpc.c +++ b/drivers/tee/optee/rpc.c @@ -200,7 +200,8 @@ static struct tee_shm *cmd_alloc_suppl(struct tee_context *ctx, size_t sz) } static void handle_rpc_func_cmd_shm_alloc(struct tee_context *ctx, - struct optee_msg_arg *arg) + struct optee_msg_arg *arg, + struct optee_call_ctx *call_ctx) { phys_addr_t pa; struct tee_shm *shm; @@ -245,10 +246,49 @@ static void handle_rpc_func_cmd_shm_alloc(struct tee_context *ctx, goto bad; } - arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT; - arg->params[0].u.tmem.buf_ptr = pa; - arg->params[0].u.tmem.size = sz; - arg->params[0].u.tmem.shm_ref = (unsigned long)shm; + sz = tee_shm_get_size(shm); + + if (tee_shm_is_registered(shm)) { + struct page **pages; + u64 *pages_list; + size_t page_num; + + pages = tee_shm_get_pages(shm, &page_num); + if (!pages || !page_num) { + arg->ret = TEEC_ERROR_OUT_OF_MEMORY; + goto bad; + } + + pages_list = optee_allocate_pages_list(page_num); + if (!pages_list) { + arg->ret = TEEC_ERROR_OUT_OF_MEMORY; + goto bad; + } + + call_ctx->pages_list = pages_list; + call_ctx->num_entries = page_num; + + arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT | + OPTEE_MSG_ATTR_NONCONTIG; + /* + * In the least bits of u.tmem.buf_ptr we store buffer offset + * from 4k page, as described in OP-TEE ABI. + */ + arg->params[0].u.tmem.buf_ptr = virt_to_phys(pages_list) | + (tee_shm_get_page_offset(shm) & + (OPTEE_MSG_NONCONTIG_PAGE_SIZE - 1)); + arg->params[0].u.tmem.size = tee_shm_get_size(shm); + arg->params[0].u.tmem.shm_ref = (unsigned long)shm; + + optee_fill_pages_list(pages_list, pages, page_num, + tee_shm_get_page_offset(shm)); + } else { + arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT; + arg->params[0].u.tmem.buf_ptr = pa; + arg->params[0].u.tmem.size = sz; + arg->params[0].u.tmem.shm_ref = (unsigned long)shm; + } + arg->ret = TEEC_SUCCESS; return; bad: @@ -307,8 +347,24 @@ static void handle_rpc_func_cmd_shm_free(struct tee_context *ctx, arg->ret = TEEC_SUCCESS; } +static void free_pages_list(struct optee_call_ctx *call_ctx) +{ + if (call_ctx->pages_list) { + optee_free_pages_list(call_ctx->pages_list, + call_ctx->num_entries); + call_ctx->pages_list = NULL; + call_ctx->num_entries = 0; + } +} + +void optee_rpc_finalize_call(struct optee_call_ctx *call_ctx) +{ + free_pages_list(call_ctx); +} + static void handle_rpc_func_cmd(struct tee_context *ctx, struct optee *optee, - struct tee_shm *shm) + struct tee_shm *shm, + struct optee_call_ctx *call_ctx) { struct optee_msg_arg *arg; @@ -329,7 +385,8 @@ static void handle_rpc_func_cmd(struct tee_context *ctx, struct optee *optee, handle_rpc_func_cmd_wait(arg); break; case OPTEE_MSG_RPC_CMD_SHM_ALLOC: - handle_rpc_func_cmd_shm_alloc(ctx, arg); + free_pages_list(call_ctx); + handle_rpc_func_cmd_shm_alloc(ctx, arg, call_ctx); break; case OPTEE_MSG_RPC_CMD_SHM_FREE: handle_rpc_func_cmd_shm_free(ctx, arg); @@ -343,10 +400,12 @@ static void handle_rpc_func_cmd(struct tee_context *ctx, struct optee *optee, * optee_handle_rpc() - handle RPC from secure world * @ctx: context doing the RPC * @param: value of registers for the RPC + * @call_ctx: call context. Preserved during one OP-TEE invocation * * Result of RPC is written back into @param. */ -void optee_handle_rpc(struct tee_context *ctx, struct optee_rpc_param *param) +void optee_handle_rpc(struct tee_context *ctx, struct optee_rpc_param *param, + struct optee_call_ctx *call_ctx) { struct tee_device *teedev = ctx->teedev; struct optee *optee = tee_get_drvdata(teedev); @@ -381,7 +440,7 @@ void optee_handle_rpc(struct tee_context *ctx, struct optee_rpc_param *param) break; case OPTEE_SMC_RPC_FUNC_CMD: shm = reg_pair_to_ptr(param->a1, param->a2); - handle_rpc_func_cmd(ctx, optee, shm); + handle_rpc_func_cmd(ctx, optee, shm, call_ctx); break; default: pr_warn("Unknown RPC func 0x%x\n", -- 2.7.4 From 1579807681650156014@xxx Thu Sep 28 18:06:50 +0000 2017 X-GM-THRID: 1579807681650156014 X-Gmail-Labels: Inbox,Category Forums