1*50f24313SVolodymyr Babchuk /* 2*50f24313SVolodymyr Babchuk * Copyright (c) 2017, EPAM Systems 3*50f24313SVolodymyr Babchuk * All rights reserved. 4*50f24313SVolodymyr Babchuk * 5*50f24313SVolodymyr Babchuk * Redistribution and use in source and binary forms, with or without 6*50f24313SVolodymyr Babchuk * modification, are permitted provided that the following conditions are met: 7*50f24313SVolodymyr Babchuk * 8*50f24313SVolodymyr Babchuk * 1. Redistributions of source code must retain the above copyright notice, 9*50f24313SVolodymyr Babchuk * this list of conditions and the following disclaimer. 10*50f24313SVolodymyr Babchuk * 11*50f24313SVolodymyr Babchuk * 2. Redistributions in binary form must reproduce the above copyright notice, 12*50f24313SVolodymyr Babchuk * this list of conditions and the following disclaimer in the documentation 13*50f24313SVolodymyr Babchuk * and/or other materials provided with the distribution. 14*50f24313SVolodymyr Babchuk * 15*50f24313SVolodymyr Babchuk * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16*50f24313SVolodymyr Babchuk * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*50f24313SVolodymyr Babchuk * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*50f24313SVolodymyr Babchuk * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 19*50f24313SVolodymyr Babchuk * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20*50f24313SVolodymyr Babchuk * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21*50f24313SVolodymyr Babchuk * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22*50f24313SVolodymyr Babchuk * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23*50f24313SVolodymyr Babchuk * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24*50f24313SVolodymyr Babchuk * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25*50f24313SVolodymyr Babchuk * POSSIBILITY OF SUCH DAMAGE. 26*50f24313SVolodymyr Babchuk */ 27*50f24313SVolodymyr Babchuk 28*50f24313SVolodymyr Babchuk #include <optee_msg.h> 29*50f24313SVolodymyr Babchuk #include <stdio.h> 30*50f24313SVolodymyr Babchuk #include <types_ext.h> 31*50f24313SVolodymyr Babchuk #include <kernel/msg_param.h> 32*50f24313SVolodymyr Babchuk #include <mm/mobj.h> 33*50f24313SVolodymyr Babchuk 34*50f24313SVolodymyr Babchuk bool msg_param_init_memparam(struct optee_msg_param *param, struct mobj *mobj, 35*50f24313SVolodymyr Babchuk size_t offset, size_t size, 36*50f24313SVolodymyr Babchuk uint64_t cookie, enum msg_param_mem_dir dir) 37*50f24313SVolodymyr Babchuk { 38*50f24313SVolodymyr Babchuk if (mobj_matches(mobj, CORE_MEM_REG_SHM)) { 39*50f24313SVolodymyr Babchuk /* Registered SHM mobj */ 40*50f24313SVolodymyr Babchuk switch (dir) { 41*50f24313SVolodymyr Babchuk case MSG_PARAM_MEM_DIR_IN: 42*50f24313SVolodymyr Babchuk param->attr = OPTEE_MSG_ATTR_TYPE_RMEM_INPUT; 43*50f24313SVolodymyr Babchuk break; 44*50f24313SVolodymyr Babchuk case MSG_PARAM_MEM_DIR_OUT: 45*50f24313SVolodymyr Babchuk param->attr = OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT; 46*50f24313SVolodymyr Babchuk break; 47*50f24313SVolodymyr Babchuk case MSG_PARAM_MEM_DIR_INOUT: 48*50f24313SVolodymyr Babchuk param->attr = OPTEE_MSG_ATTR_TYPE_RMEM_INOUT; 49*50f24313SVolodymyr Babchuk break; 50*50f24313SVolodymyr Babchuk default: 51*50f24313SVolodymyr Babchuk return false; 52*50f24313SVolodymyr Babchuk } 53*50f24313SVolodymyr Babchuk 54*50f24313SVolodymyr Babchuk param->u.rmem.size = size; 55*50f24313SVolodymyr Babchuk param->u.rmem.offs = offset; 56*50f24313SVolodymyr Babchuk param->u.rmem.shm_ref = cookie; 57*50f24313SVolodymyr Babchuk } else if (mobj_matches(mobj, CORE_MEM_NSEC_SHM)) { 58*50f24313SVolodymyr Babchuk /* MOBJ from from predefined pool */ 59*50f24313SVolodymyr Babchuk paddr_t pa; 60*50f24313SVolodymyr Babchuk 61*50f24313SVolodymyr Babchuk if (mobj_get_pa(mobj, 0, 0, &pa) != TEE_SUCCESS) 62*50f24313SVolodymyr Babchuk return false; 63*50f24313SVolodymyr Babchuk 64*50f24313SVolodymyr Babchuk switch (dir) { 65*50f24313SVolodymyr Babchuk case MSG_PARAM_MEM_DIR_IN: 66*50f24313SVolodymyr Babchuk param->attr = OPTEE_MSG_ATTR_TYPE_TMEM_INPUT; 67*50f24313SVolodymyr Babchuk break; 68*50f24313SVolodymyr Babchuk case MSG_PARAM_MEM_DIR_OUT: 69*50f24313SVolodymyr Babchuk param->attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT; 70*50f24313SVolodymyr Babchuk break; 71*50f24313SVolodymyr Babchuk case MSG_PARAM_MEM_DIR_INOUT: 72*50f24313SVolodymyr Babchuk param->attr = OPTEE_MSG_ATTR_TYPE_TMEM_INOUT; 73*50f24313SVolodymyr Babchuk break; 74*50f24313SVolodymyr Babchuk default: 75*50f24313SVolodymyr Babchuk return false; 76*50f24313SVolodymyr Babchuk } 77*50f24313SVolodymyr Babchuk 78*50f24313SVolodymyr Babchuk param->u.tmem.buf_ptr = pa + offset; 79*50f24313SVolodymyr Babchuk param->u.tmem.shm_ref = cookie; 80*50f24313SVolodymyr Babchuk param->u.tmem.size = size; 81*50f24313SVolodymyr Babchuk } else 82*50f24313SVolodymyr Babchuk return false; 83*50f24313SVolodymyr Babchuk return true; 84*50f24313SVolodymyr Babchuk } 85