xref: /optee_os/core/kernel/msg_param.c (revision 50f243138c228046a9313eac7d530b6f001db115)
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