From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754872AbdK2Mtc (ORCPT ); Wed, 29 Nov 2017 07:49:32 -0500 Received: from mail-he1eur01on0058.outbound.protection.outlook.com ([104.47.0.58]:26240 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751958AbdK2MtZ (ORCPT ); Wed, 29 Nov 2017 07:49:25 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Volodymyr_Babchuk@epam.com; 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: [RESEND PATCH v2 05/14] tee: optee: Update protocol definitions Date: Wed, 29 Nov 2017 14:48:29 +0200 Message-Id: <1511959718-5421-6-git-send-email-volodymyr_babchuk@epam.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1511959718-5421-1-git-send-email-volodymyr_babchuk@epam.com> References: <1507923164-12796-1-git-send-email-volodymyr_babchuk@epam.com> <1511959718-5421-1-git-send-email-volodymyr_babchuk@epam.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [85.223.209.56] X-ClientProxiedBy: AM5PR0502CA0001.eurprd05.prod.outlook.com (2603:10a6:203:91::11) To VI1PR03MB1773.eurprd03.prod.outlook.com (2a01:111:e400:7bdd::7) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: be26fc07-ab16-44c8-4464-08d537279c5d X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(4534020)(4602075)(7168020)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603270);SRVR:VI1PR03MB1773; X-Microsoft-Exchange-Diagnostics: 1;VI1PR03MB1773;3:+outFEoHhIlXQi+pGRrkNh2TV3qtD0eN/EuXYH5IpDgB3gQ5KX1CwSh+QP4dr/xPseGBiiQf+AQH8tBAI9uO656D5PfMFnmn+68Ql1pNlw1CqZkX0E5LBKSjGzan1dC4tXoKqINVgNiGWb7tL70QaeKg5uXHSri1duJdom5stuvb+Z76V74Jo590QK+nYQLEVjn+dSDHU44LcHYgwbRe4Zyxy2x3KDPd0dXm8CXfXUs9isOvnLyVYqq0IIi81R5r;25:V+YYQqYJetfX69KIlAEdSDFbt4I73e75HOkuFjHnGhm7aHl+HWdJIK4Eeh1Z6AvulE84GhlcbUHJkNb4WRGzFujleqy//f6tyVM7BNnu37xn3MIUsEoVsf+fo3Ybi6BliDK5jCWbp8nTYYexQ3Fp7BTc+4wj67gQ4Ej60bfAZAIsRlAhR/Ypily7OCQldoDyFo4t36rOoM8aSbcdJPgJsP1cRhwdHJQkSIsJwc70sBZZKIGJW6yp3sViPIPwAN16pj/6oyyV7ltbN0/k4vdoQ60udcERsIPldg6XQBJIOpLGTw/UV9aAy21ASuuJ9VhVaDa2wO817lFORrg1FrgeUxvgoyhc6/FCfKRT3GR0yhc=;31:4vSOH0/LPiTpXozR1ZBXEIn2wnS81tlKaq9JQ7zvE1r0jFcgeuXSYNCoqJzG85XBdeINkUAc9taxemwg6SMIMJYCCM88tuGyGvsY+zaYHqnDQeeklYb7UNt36AHd9Mtvln7/lph2wDIbMT4EH6pZpaBW87Y0/iEgOTYmU8nMdAMcAS599mYmF318A4wk62rqZpsVfHa4W5r+7HfbWpPCRR2z7qsxtH/ru9h+xoDXopY= X-MS-TrafficTypeDiagnostic: VI1PR03MB1773: X-Microsoft-Exchange-Diagnostics: 1;VI1PR03MB1773;20:c5HRKZH81Ksdh4LGBV0vF/SQUJj9xOPV5rUdtFVbZxiQeUHVjq26HQH991P1qbPt5NwfvKCIL/d5QAf62dvPuUapB/yHsQXR/MynVkNBOXitS6HnZrWSwjNlVKbKZcSKeNEVPXEIk5AkPpWSaNs8oKfaE4p2Kzq1EEoyX8MVXFQtOvWkW/0sJRGldr1BeGg4D6CshRjd+fcIodDkHAOyCNYYSXmSamrq6GGFnNY39bb/b2+16dx4tihUPzwPTt6jgXKw9AwkhQBP5esxbVSh/9JLHLjKUsaoSWh7MkIwvIp7BVgW6wdILDzVyMQi0rl59Ai6xC7okjz7rD9Po1wscillZTMpkR+kB65taQocesLKc4BI4NFlU3Meh5ZOoCYaCaatx6sLx4K2Eg7wRcZgQUVd2wLo8EYMZFREJhuWK6AeZpbTJ3UV7dtY7YisENTn7zqSEF+mqwEceBErRpJDhpcC2hgmfvgj49MxPNNcc5bLtHwYDHxNwVOiW31IYoa1;4:9/j/WESXEAbm9gBmCRDpBbV841EN28D1vBPh4NUCl5XG5iLkTSH/p2ILd9FQ15qy6sG/nHweNnNOzQxpC6sm3k6h+YIkj0NzrZgVqQvKw1Ue8oZoa9IBh4CPZeLfDJWWQ8DHUMEAnRtgcGd7uSaZjH8dCCarXShWtgEW5KZo9SUTOzrHfy7FgotbBczG0xBg505zO4UnocnNefHcGinkTViZPP0r3G+skHRCE1MF/pl79MPqJnOSeFoscbn+pLvQlgLMgPpi6HIKgYYeWCA72g== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(2401047)(8121501046)(5005006)(93006095)(93001095)(3231022)(3002001)(10201501046)(6041248)(20161123564025)(20161123562025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123558100)(6072148)(201708071742011);SRVR:VI1PR03MB1773;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:VI1PR03MB1773; X-Forefront-PRVS: 05066DEDBB X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(376002)(346002)(366004)(189002)(199003)(42186006)(53936002)(316002)(4326008)(107886003)(189998001)(16586007)(105586002)(50226002)(6116002)(33646002)(3846002)(106356001)(48376002)(50466002)(76176999)(50986999)(101416001)(86362001)(5660300001)(39060400002)(36756003)(8936002)(6666003)(2950100002)(47776003)(6916009)(66066001)(72206003)(55236003)(81156014)(478600001)(81166006)(97736004)(80792005)(68736007)(2906002)(305945005)(51416003)(122856001)(7736002)(8676002)(52116002)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR03MB1773;H:EPUAKYIW2556.kyiv.epam.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;VI1PR03MB1773;23:tUSJud14o5dCC4k0yo/BmxHgIkYLemPZOtDk3gLKR?= =?us-ascii?Q?spkODP8Wa59rFPYA+noiRawMriv0/Q0HljIKT2iF+xAD0WOZICCCdGlfO8HF?= =?us-ascii?Q?3gYasOwmM+G3EX5e5xm/zTnR1Pny5zBOwNejKVOUEYoo6900R/GkY0ziXGvi?= =?us-ascii?Q?u3AMYXGnUuf9b+gm+TJI5VB9uecuSbyokqKrfisTlSKEdoobWS7qLa92bPAw?= =?us-ascii?Q?5A9wOZpRM2NjSFSpDTvLRM/j8Wjds2YOwQHArmJ1Q6aX8ROZ2KZ+OzWfYGHl?= =?us-ascii?Q?BgKkRW/Me0QpvnUz3sl8ZDtntZqoIqXz8s1Yhm0mYXRGdBQK7ZQ8vCvoFSxn?= =?us-ascii?Q?T6RFMPmc6/MTLN+ObwQE0LsEtNw7kkdxcOnCD7cLt0SvBBedmCArIeFQeMLX?= =?us-ascii?Q?meaBJW8nqoVwmM4jxe3R31yKd6KdjUwtQnhg2NLkxmEnf0qVzIhFyLbK/H4a?= =?us-ascii?Q?91m5qSD5NzUVbit6Sn2zd1hu16Hrm84BTpV8BGLCtYdKD+7JI8sPjcAZT5k6?= =?us-ascii?Q?5CuJeyKmHj4bUJIAMN5fyuj0JMELPDyqlFyonRRDCnzE6+QHMzk3BR2CZa1H?= =?us-ascii?Q?oZx3KtitXBAtiLhNaErPPAW7lImo3SI7mdc7Uu9mGwxhE3GmaodgX/NVNTk8?= =?us-ascii?Q?P1GBGJPTUrvhMG6nykKYWEQOd9C4aKFeeaQ25DeZyY/+h/QKBQ1aPE8BgK17?= =?us-ascii?Q?evhAnx7+4R1dFtjHqASQLhYvfRkmwMd/viIs+uGfWL6nlnZnKkCAqCbnvYi/?= =?us-ascii?Q?vD1Mj+Ol4MbUSMkO+j0IUv3vfLDyfhE8R5Od6jE2VXNXpneEJsfMrWRZRaai?= =?us-ascii?Q?yNHGde8bteZ2TirqOXN+gX9Z18UiEYO9KiWOgdrGzsRWJLIIuKPCZdu3NQdW?= =?us-ascii?Q?UtlWBZzzBsLp/yHzxKbhQVhAUilqTpMf2akCwEoS5qMFasO3IpqZixUhTowM?= =?us-ascii?Q?4NE9raDDLxC9gtvkeRiLsiQScpdi7wFJfmrojUQuj7p5wSFYvpZzVjmaQ8TG?= =?us-ascii?Q?DdSkqyDLxUo/m6dkAPcj+IaXMRxNikYLhNRu1zX0/NcLyrb2lRfjymYAzlPw?= =?us-ascii?Q?5as43d4flURcIvZfPcZrIvWXBtUkvK2TNrqVHlDadg51dhAVSnlhXNhN/5BV?= =?us-ascii?Q?DSYJtbyZMgyUyKjQfqBIMWXAf+TiHiUzC6By+0Z7lh1aeq3s+AQPA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR03MB1773;6:5eaKGDo6zNUqWE3Q61QFxfSAZ4uuoKS+QNYaz5VzNWEahHGrj7Wh1zPyK33PxNRy06KxreqsLdy4qyFvaZIMX95gSAAUl3x76EpD3J3YwRs/MlsrIntU4LCf5t+MsSOTvF/nAKqjZP46MCdWneiHuOoM16xNKU1uZ5ClUWtOCT3+YX97uRSPU8/8ZGlkjlOF2xaET+EEJ0xOhFxzGDpExhofWaXR9r8UvtZrKiQXja5T1ijR8TPsxTbi29C4IZ+3txusFzOwOax4Pd4asMFV2f9suX5V8qv0zjD7MasyguDmdkAq7hWzllUqqZLU1QtM9OJiRnUk5Crye4oHNvIv/t4TarCe70N8Qv0VR7wbkmc=;5:Mb5+2N3U1P7C8vymSEaHdbWbfOB0eggqJ/Yx8XvMKVi9pymHPMvYG/YfvLldalcXtRlJkXRRJPGMbAoZotuh6sGv1N1zUVeHc/dBrlO8zQMnwaUmbUXiXoX3TpubkUsPZoWzAMChwOtEqGAH2i1uIgDibQMNKMJk1EA/XAJhy0c=;24:HIQCCBVsAKjtOo67gU2LUa+Z8M2w4RJY19D3sLtZ9zEktcHweuxqtUb03Yf4bZv7BrbRPpJnrTiWfcnqbeHBWRK4L64rTu4ZBrrzEWiePPo=;7:tp+ofnoE5jDX3hwMmGa3ep1pIARdN0q8FwgWKW3rBaGRmPJnYPcMibmojGr3MUgl6aWVi1w01o5/NoDamcXpjweQ1TqQtMnGCeEYlMt5qGIjvNzb13B9xM41Ve8lxTPB8AO/eWTrpcOO/erGG/rlfeEvIIHn9sX9mQcbLNbS/TqZ4XuIn6weOgIKQPFZigwsNPqayuvm7DXd5//N1mCeNMxvh70QupEHIaV3FI4eN8uHAD2p8H4YTuU4EczRs5oa SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: epam.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Nov 2017 12:49:20.4403 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: be26fc07-ab16-44c8-4464-08d537279c5d X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b41b72d0-4e9f-4c26-8a69-f949f367c91d X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR03MB1773 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Volodymyr Babchuk There were changes in REE<->OP-TEE ABI recently. Now ABI allows us to pass non-contiguous memory buffers as list of pages to OP-TEE. This can be achieved by using new parameter attribute OPTEE_MSG_ATTR_NONCONTIG. OP-TEE also is able to use all non-secure RAM for shared buffers. This new capability is enabled with OPTEE_SMC_SEC_CAP_DYNAMIC_SHM flag. This patch adds necessary definitions to the protocol definition files at Linux side. Signed-off-by: Volodymyr Babchuk --- drivers/tee/optee/optee_msg.h | 38 ++++++++++++++++++++++++++++++++------ drivers/tee/optee/optee_smc.h | 7 +++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/drivers/tee/optee/optee_msg.h b/drivers/tee/optee/optee_msg.h index dd7a06e..3050490 100644 --- a/drivers/tee/optee/optee_msg.h +++ b/drivers/tee/optee/optee_msg.h @@ -67,11 +67,32 @@ #define OPTEE_MSG_ATTR_META BIT(8) /* - * The temporary shared memory object is not physically contigous and this - * temp memref is followed by another fragment until the last temp memref - * that doesn't have this bit set. + * Pointer to a list of pages used to register user-defined SHM buffer. + * Used with OPTEE_MSG_ATTR_TYPE_TMEM_*. + * buf_ptr should point to the beginning of the buffer. Buffer will contain + * list of page addresses. OP-TEE core can reconstruct contiguous buffer from + * that page addresses list. Page addresses are stored as 64 bit values. + * Last entry on a page should point to the next page of buffer. + * Every entry in buffer should point to a 4k page beginning (12 least + * significant bits must be equal to zero). + * + * 12 least significant bints of optee_msg_param.u.tmem.buf_ptr should hold page + * offset of the user buffer. + * + * So, entries should be placed like members of this structure: + * + * struct page_data { + * uint64_t pages_array[OPTEE_MSG_NONCONTIG_PAGE_SIZE/sizeof(uint64_t) - 1]; + * uint64_t next_page_data; + * }; + * + * Structure is designed to exactly fit into the page size + * OPTEE_MSG_NONCONTIG_PAGE_SIZE which is a standard 4KB page. + * + * The size of 4KB is chosen because this is the smallest page size for ARM + * architectures. If REE uses larger pages, it should divide them to 4KB ones. */ -#define OPTEE_MSG_ATTR_FRAGMENT BIT(9) +#define OPTEE_MSG_ATTR_NONCONTIG BIT(9) /* * Memory attributes for caching passed with temp memrefs. The actual value @@ -94,6 +115,11 @@ #define OPTEE_MSG_LOGIN_APPLICATION_USER 0x00000005 #define OPTEE_MSG_LOGIN_APPLICATION_GROUP 0x00000006 +/* + * Page size used in non-contiguous buffer entries + */ +#define OPTEE_MSG_NONCONTIG_PAGE_SIZE 4096 + /** * struct optee_msg_param_tmem - temporary memory reference parameter * @buf_ptr: Address of the buffer @@ -145,8 +171,8 @@ struct optee_msg_param_value { * * @attr & OPTEE_MSG_ATTR_TYPE_MASK indicates if tmem, rmem or value is used in * the union. OPTEE_MSG_ATTR_TYPE_VALUE_* indicates value, - * OPTEE_MSG_ATTR_TYPE_TMEM_* indicates tmem and - * OPTEE_MSG_ATTR_TYPE_RMEM_* indicates rmem. + * OPTEE_MSG_ATTR_TYPE_TMEM_* indicates @tmem and + * OPTEE_MSG_ATTR_TYPE_RMEM_* indicates @rmem, * OPTEE_MSG_ATTR_TYPE_NONE indicates that none of the members are used. */ struct optee_msg_param { diff --git a/drivers/tee/optee/optee_smc.h b/drivers/tee/optee/optee_smc.h index 069c8e1..7cd3272 100644 --- a/drivers/tee/optee/optee_smc.h +++ b/drivers/tee/optee/optee_smc.h @@ -222,6 +222,13 @@ struct optee_smc_get_shm_config_result { #define OPTEE_SMC_SEC_CAP_HAVE_RESERVED_SHM BIT(0) /* Secure world can communicate via previously unregistered shared memory */ #define OPTEE_SMC_SEC_CAP_UNREGISTERED_SHM BIT(1) + +/* + * Secure world supports commands "register/unregister shared memory", + * secure world accepts command buffers located in any parts of non-secure RAM + */ +#define OPTEE_SMC_SEC_CAP_DYNAMIC_SHM BIT(2) + #define OPTEE_SMC_FUNCID_EXCHANGE_CAPABILITIES 9 #define OPTEE_SMC_EXCHANGE_CAPABILITIES \ OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_EXCHANGE_CAPABILITIES) -- 2.7.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: volodymyr_babchuk@epam.com (Volodymyr Babchuk) Date: Wed, 29 Nov 2017 14:48:29 +0200 Subject: [RESEND PATCH v2 05/14] tee: optee: Update protocol definitions In-Reply-To: <1511959718-5421-1-git-send-email-volodymyr_babchuk@epam.com> References: <1507923164-12796-1-git-send-email-volodymyr_babchuk@epam.com> <1511959718-5421-1-git-send-email-volodymyr_babchuk@epam.com> Message-ID: <1511959718-5421-6-git-send-email-volodymyr_babchuk@epam.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org From: Volodymyr Babchuk There were changes in REE<->OP-TEE ABI recently. Now ABI allows us to pass non-contiguous memory buffers as list of pages to OP-TEE. This can be achieved by using new parameter attribute OPTEE_MSG_ATTR_NONCONTIG. OP-TEE also is able to use all non-secure RAM for shared buffers. This new capability is enabled with OPTEE_SMC_SEC_CAP_DYNAMIC_SHM flag. This patch adds necessary definitions to the protocol definition files at Linux side. Signed-off-by: Volodymyr Babchuk --- drivers/tee/optee/optee_msg.h | 38 ++++++++++++++++++++++++++++++++------ drivers/tee/optee/optee_smc.h | 7 +++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/drivers/tee/optee/optee_msg.h b/drivers/tee/optee/optee_msg.h index dd7a06e..3050490 100644 --- a/drivers/tee/optee/optee_msg.h +++ b/drivers/tee/optee/optee_msg.h @@ -67,11 +67,32 @@ #define OPTEE_MSG_ATTR_META BIT(8) /* - * The temporary shared memory object is not physically contigous and this - * temp memref is followed by another fragment until the last temp memref - * that doesn't have this bit set. + * Pointer to a list of pages used to register user-defined SHM buffer. + * Used with OPTEE_MSG_ATTR_TYPE_TMEM_*. + * buf_ptr should point to the beginning of the buffer. Buffer will contain + * list of page addresses. OP-TEE core can reconstruct contiguous buffer from + * that page addresses list. Page addresses are stored as 64 bit values. + * Last entry on a page should point to the next page of buffer. + * Every entry in buffer should point to a 4k page beginning (12 least + * significant bits must be equal to zero). + * + * 12 least significant bints of optee_msg_param.u.tmem.buf_ptr should hold page + * offset of the user buffer. + * + * So, entries should be placed like members of this structure: + * + * struct page_data { + * uint64_t pages_array[OPTEE_MSG_NONCONTIG_PAGE_SIZE/sizeof(uint64_t) - 1]; + * uint64_t next_page_data; + * }; + * + * Structure is designed to exactly fit into the page size + * OPTEE_MSG_NONCONTIG_PAGE_SIZE which is a standard 4KB page. + * + * The size of 4KB is chosen because this is the smallest page size for ARM + * architectures. If REE uses larger pages, it should divide them to 4KB ones. */ -#define OPTEE_MSG_ATTR_FRAGMENT BIT(9) +#define OPTEE_MSG_ATTR_NONCONTIG BIT(9) /* * Memory attributes for caching passed with temp memrefs. The actual value @@ -94,6 +115,11 @@ #define OPTEE_MSG_LOGIN_APPLICATION_USER 0x00000005 #define OPTEE_MSG_LOGIN_APPLICATION_GROUP 0x00000006 +/* + * Page size used in non-contiguous buffer entries + */ +#define OPTEE_MSG_NONCONTIG_PAGE_SIZE 4096 + /** * struct optee_msg_param_tmem - temporary memory reference parameter * @buf_ptr: Address of the buffer @@ -145,8 +171,8 @@ struct optee_msg_param_value { * * @attr & OPTEE_MSG_ATTR_TYPE_MASK indicates if tmem, rmem or value is used in * the union. OPTEE_MSG_ATTR_TYPE_VALUE_* indicates value, - * OPTEE_MSG_ATTR_TYPE_TMEM_* indicates tmem and - * OPTEE_MSG_ATTR_TYPE_RMEM_* indicates rmem. + * OPTEE_MSG_ATTR_TYPE_TMEM_* indicates @tmem and + * OPTEE_MSG_ATTR_TYPE_RMEM_* indicates @rmem, * OPTEE_MSG_ATTR_TYPE_NONE indicates that none of the members are used. */ struct optee_msg_param { diff --git a/drivers/tee/optee/optee_smc.h b/drivers/tee/optee/optee_smc.h index 069c8e1..7cd3272 100644 --- a/drivers/tee/optee/optee_smc.h +++ b/drivers/tee/optee/optee_smc.h @@ -222,6 +222,13 @@ struct optee_smc_get_shm_config_result { #define OPTEE_SMC_SEC_CAP_HAVE_RESERVED_SHM BIT(0) /* Secure world can communicate via previously unregistered shared memory */ #define OPTEE_SMC_SEC_CAP_UNREGISTERED_SHM BIT(1) + +/* + * Secure world supports commands "register/unregister shared memory", + * secure world accepts command buffers located in any parts of non-secure RAM + */ +#define OPTEE_SMC_SEC_CAP_DYNAMIC_SHM BIT(2) + #define OPTEE_SMC_FUNCID_EXCHANGE_CAPABILITIES 9 #define OPTEE_SMC_EXCHANGE_CAPABILITIES \ OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_EXCHANGE_CAPABILITIES) -- 2.7.4