@@ -97,13 +97,72 @@ int optee_from_msg_param(struct tee_param *params, size_t num_params,
97
97
return rc ;
98
98
}
99
99
break ;
100
+ case OPTEE_MSG_ATTR_TYPE_RMEM_INPUT :
101
+ case OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT :
102
+ case OPTEE_MSG_ATTR_TYPE_RMEM_INOUT :
103
+ p -> attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT +
104
+ attr - OPTEE_MSG_ATTR_TYPE_RMEM_INPUT ;
105
+ p -> u .memref .size = mp -> u .rmem .size ;
106
+ shm = (struct tee_shm * )(unsigned long )
107
+ mp -> u .rmem .shm_ref ;
108
+
109
+ if (!shm ) {
110
+ p -> u .memref .shm_offs = 0 ;
111
+ p -> u .memref .shm = NULL ;
112
+ break ;
113
+ }
114
+ p -> u .memref .shm_offs = mp -> u .rmem .offs ;
115
+ p -> u .memref .shm = shm ;
116
+
117
+ break ;
118
+
100
119
default :
101
120
return - EINVAL ;
102
121
}
103
122
}
104
123
return 0 ;
105
124
}
106
125
126
+ static int to_msg_param_tmp_mem (struct optee_msg_param * mp ,
127
+ const struct tee_param * p )
128
+ {
129
+ int rc ;
130
+ phys_addr_t pa ;
131
+
132
+ mp -> attr = OPTEE_MSG_ATTR_TYPE_TMEM_INPUT + p -> attr -
133
+ TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT ;
134
+
135
+ mp -> u .tmem .shm_ref = (unsigned long )p -> u .memref .shm ;
136
+ mp -> u .tmem .size = p -> u .memref .size ;
137
+
138
+ if (!p -> u .memref .shm ) {
139
+ mp -> u .tmem .buf_ptr = 0 ;
140
+ return 0 ;
141
+ }
142
+
143
+ rc = tee_shm_get_pa (p -> u .memref .shm , p -> u .memref .shm_offs , & pa );
144
+ if (rc )
145
+ return rc ;
146
+
147
+ mp -> u .tmem .buf_ptr = pa ;
148
+ mp -> attr |= OPTEE_MSG_ATTR_CACHE_PREDEFINED <<
149
+ OPTEE_MSG_ATTR_CACHE_SHIFT ;
150
+
151
+ return 0 ;
152
+ }
153
+
154
+ static int to_msg_param_reg_mem (struct optee_msg_param * mp ,
155
+ const struct tee_param * p )
156
+ {
157
+ mp -> attr = OPTEE_MSG_ATTR_TYPE_RMEM_INPUT + p -> attr -
158
+ TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT ;
159
+
160
+ mp -> u .rmem .shm_ref = (unsigned long )p -> u .memref .shm ;
161
+ mp -> u .rmem .size = p -> u .memref .size ;
162
+ mp -> u .rmem .offs = p -> u .memref .shm_offs ;
163
+ return 0 ;
164
+ }
165
+
107
166
/**
108
167
* optee_to_msg_param() - convert from struct tee_params to OPTEE_MSG parameters
109
168
* @msg_params: OPTEE_MSG parameters
@@ -116,7 +175,6 @@ int optee_to_msg_param(struct optee_msg_param *msg_params, size_t num_params,
116
175
{
117
176
int rc ;
118
177
size_t n ;
119
- phys_addr_t pa ;
120
178
121
179
for (n = 0 ; n < num_params ; n ++ ) {
122
180
const struct tee_param * p = params + n ;
@@ -139,22 +197,12 @@ int optee_to_msg_param(struct optee_msg_param *msg_params, size_t num_params,
139
197
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT :
140
198
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT :
141
199
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT :
142
- mp -> attr = OPTEE_MSG_ATTR_TYPE_TMEM_INPUT +
143
- p -> attr -
144
- TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT ;
145
- mp -> u .tmem .shm_ref = (unsigned long )p -> u .memref .shm ;
146
- mp -> u .tmem .size = p -> u .memref .size ;
147
- if (!p -> u .memref .shm ) {
148
- mp -> u .tmem .buf_ptr = 0 ;
149
- break ;
150
- }
151
- rc = tee_shm_get_pa (p -> u .memref .shm ,
152
- p -> u .memref .shm_offs , & pa );
200
+ if (tee_shm_is_registered (p -> u .memref .shm ))
201
+ rc = to_msg_param_reg_mem (mp , p );
202
+ else
203
+ rc = to_msg_param_tmp_mem (mp , p );
153
204
if (rc )
154
205
return rc ;
155
- mp -> u .tmem .buf_ptr = pa ;
156
- mp -> attr |= OPTEE_MSG_ATTR_CACHE_PREDEFINED <<
157
- OPTEE_MSG_ATTR_CACHE_SHIFT ;
158
206
break ;
159
207
default :
160
208
return - EINVAL ;
0 commit comments