FreeCalypso > hg > fc-tourmaline
comparison src/cs/riviera/rvm/rvm_api.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:23:26 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4e78acac3d88 |
---|---|
1 /** | |
2 * | |
3 * @file rvm_api.c | |
4 * | |
5 * This file contains interface functions. | |
6 * | |
7 * @author Cristian Livadiotti (c-livadiotti@ti.com) | |
8 * @version 0.2 | |
9 * | |
10 */ | |
11 | |
12 /* | |
13 * Revision History: | |
14 * | |
15 * 06/04/2000 Cristian Livadiotti Create. | |
16 * 10/22/2001 David Lamy-Charrier Update for new Riviera 1.6. | |
17 * | |
18 * (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved | |
19 */ | |
20 | |
21 | |
22 #ifndef _WINDOWS | |
23 #include "config/rv.cfg" | |
24 #endif | |
25 | |
26 #include "rvf/rvf_env.h" | |
27 | |
28 #include "rvm/rvm_gen.h" | |
29 #include "rvm/rvm_api.h" | |
30 #include "rvm/rvm_i.h" | |
31 #include "rvm/rvm_use_id_list.h" | |
32 | |
33 #include <string.h> | |
34 | |
35 extern T_RVM_KNOWN_SWE * rvm_swe_array; | |
36 | |
37 | |
38 /******************************************************************************* | |
39 ** Function rvm_start_environment | |
40 ** | |
41 ** Description Start the RV manager. | |
42 ** | |
43 *******************************************************************************/ | |
44 T_RVM_RETURN rvm_start_environment() | |
45 { T_RVF_BUFFER * rvm_stack; | |
46 | |
47 /* initialize the RVM */ | |
48 if ( rvm_init() == FALSE) | |
49 { return RVM_INTERNAL_ERR; | |
50 } | |
51 | |
52 /* start the RV manager task */ | |
53 | |
54 if ( rvf_get_buf( rvm_stack_mem_bank, RVM_STACK_SIZE, &rvm_stack) == RVF_RED ) | |
55 { return RVM_MEMORY_ERR; | |
56 } | |
57 | |
58 if ( rvf_create_task( rvm_task, RVM_TASK_ID, "RVM", rvm_stack, RVM_STACK_SIZE, RVM_PRIORITY, RVM_TASK, DEFAULT_TIME_SLICING, RUNNING) | |
59 != RVF_OK ) | |
60 { return RVM_INTERNAL_ERR; | |
61 } | |
62 | |
63 return RVM_OK; | |
64 } | |
65 | |
66 | |
67 /******************************************************************************* | |
68 ** | |
69 ** Function rvm_start_swe | |
70 ** | |
71 ** Description Called by an application to start the specified SWE | |
72 ** | |
73 ** Parameters: USE_ID of the SWE to start. | |
74 ** return path for asynchronous response | |
75 ** | |
76 ** Returns T_RVM_RETURN: RVM_OK if everything is ok, | |
77 ** RVM_INVALID_PARAMETER if the SWE USE_ID is unknown | |
78 ** RVM_NOT_READY if the get_info function has not been specified in the database | |
79 ** or the SWE has been already started. | |
80 ** RVM_MEMORY_ERR if there is not enough memory in the RVM memory bank. | |
81 ** RVM_INTERNAL_ERR if the RVM task has not been created. | |
82 ** | |
83 *******************************************************************************/ | |
84 T_RVM_RETURN rvm_start_swe (T_RVM_USE_ID swe_use_id, T_RV_RETURN_PATH return_path) | |
85 { | |
86 T_RVM_MSG *msg; | |
87 T_RVM_RETURN rvm_status; | |
88 UINT8 num_swe; | |
89 | |
90 /* Check Application is "startable" */ | |
91 if ((rvm_status = rvm_check_application (swe_use_id, &num_swe, RVM_START_APPLI)) != RVM_OK) | |
92 { | |
93 rvf_send_trace("RVM_task: rvm_start_swe() this appli cannot be started", 54, (UINT32)rvm_status, RV_TRACE_LEVEL_WARNING, RVM_USE_ID ); | |
94 return rvm_status; | |
95 } | |
96 | |
97 /* build a msg */ | |
98 if (rvf_get_buf( rvm_mem_bank, sizeof(T_RVM_MSG), (void **)&msg) == RVF_RED ) | |
99 { | |
100 rvf_send_trace("RVM_task: No memory", 19, NULL_PARAM, RV_TRACE_LEVEL_WARNING, RVM_USE_ID ); | |
101 return RVM_MEMORY_ERR; | |
102 } | |
103 | |
104 msg->header.msg_id = RVM_START_APPLI; | |
105 msg->header.src_addr_id = return_path.addr_id; | |
106 // msg->header.callback_func = return_path.callback_func; | |
107 msg->rp.callback_func = return_path.callback_func; | |
108 msg->swe_num = num_swe; | |
109 | |
110 rvf_send_trace("RVM: SWE START REQUEST", 22, rvm_swe_array[num_swe].swe_use_id, RV_TRACE_LEVEL_DEBUG_LOW, RVM_USE_ID ); | |
111 | |
112 /* and send it to the RVM task to be treated by the RVM task */ | |
113 /* Note: task_id is used as the destination addr_id. This is only */ | |
114 /* true in the case of mailbox zero. Then task_id==addr_id */ | |
115 if ( rvf_send_msg( RVM_TASK_ID, msg) != RVF_OK) | |
116 { rvf_free_buf( msg); | |
117 return RVM_INTERNAL_ERR; | |
118 } | |
119 | |
120 return RVM_OK; | |
121 } | |
122 | |
123 /******************************************************************************* | |
124 ** | |
125 ** Function rvm_stop_swe | |
126 ** | |
127 ** Description Called by an application to stop the specified SWE. | |
128 ** | |
129 ** Parameters: USE_ID of the SWE to start. | |
130 ** return path for asynchronous response | |
131 ** | |
132 ** Returns T_RVM_RETURN: RVM_OK if everything is ok, | |
133 ** RVM_INVALID_PARAMETER if the USE_ID is unknown | |
134 ** RVM_NOT_READY if the get_info function has not been specified in the database | |
135 ** or the SWE is not running. | |
136 ** RVM_MEMORY_ERR if there is not enough memory in the RVM memory bank. | |
137 ** RVM_INTERNAL_ERR if the RVM task has not been created. | |
138 ** | |
139 ** RV2 ADDITIONAL NOTES: This now creates a RVM_STOP_MSG instead of a RVM_STOP_APPLI message. | |
140 ** both are supported in the RVM-FSM, hence the legacy concept may be reverted to easily | |
141 *******************************************************************************/ | |
142 T_RVM_RETURN rvm_stop_swe (T_RVM_USE_ID swe_use_id, T_RV_RETURN_PATH return_path) | |
143 { | |
144 T_RVM_STOP_MSG *msg; | |
145 T_RVM_RETURN rvm_status; | |
146 UINT8 num_swe; | |
147 | |
148 /* | |
149 ** Check Application is "stopable" | |
150 */ | |
151 if ((rvm_status = rvm_check_application (swe_use_id, &num_swe, RVM_STOP_APPLI)) != RVM_OK) | |
152 return rvm_status; | |
153 | |
154 /* build a msg */ | |
155 if (rvf_get_buf( rvm_mem_bank, sizeof(T_RVM_STOP_MSG), (void **)&msg) == RVF_RED ) | |
156 { return RVM_MEMORY_ERR; | |
157 } | |
158 | |
159 msg->header.msg_id = RVM_STOP_MSG; | |
160 msg->header.src_addr_id = return_path.addr_id; | |
161 // msg->header.callback_func = return_path.callback_func; | |
162 msg->rp.callback_func = return_path.callback_func; | |
163 msg->swe_num = num_swe; | |
164 msg->status = SWE_RUNNING; | |
165 | |
166 /* and send it to the rve mailbox to be treated by the RVM task */ | |
167 if ( rvf_send_msg( RVM_TASK_ID, msg) != RVF_OK) | |
168 { rvf_free_buf( msg); | |
169 return RVM_INTERNAL_ERR; | |
170 } | |
171 | |
172 return RVM_OK; | |
173 } | |
174 | |
175 // NOTE: this may be used to enable the terminator to uncondionally | |
176 // kill the Entity. Mainly, spoofing RVM. | |
177 T_RVM_RETURN rvm_kill_immediate (T_RVM_USE_ID swe_use_id, T_RV_RETURN_PATH return_path){ | |
178 T_RVM_STOP_MSG *msg; | |
179 T_RVM_RETURN rvm_status; | |
180 UINT8 num_swe; | |
181 | |
182 /* | |
183 ** Check Application is "stopable" | |
184 */ | |
185 if ((rvm_status = rvm_check_application (swe_use_id, &num_swe, RVM_STOP_APPLI)) != RVM_OK) | |
186 return rvm_status; | |
187 | |
188 /* build a msg */ | |
189 if (rvf_get_buf( rvm_mem_bank, sizeof(T_RVM_STOP_MSG), (void **)&msg) == RVF_RED ) | |
190 { return RVM_MEMORY_ERR; | |
191 } | |
192 | |
193 msg->header.msg_id = RVM_STOP_MSG; | |
194 msg->header.src_addr_id = return_path.addr_id; | |
195 // msg->header.callback_func = return_path.callback_func; | |
196 msg->rp.callback_func = return_path.callback_func; | |
197 msg->swe_num = num_swe; | |
198 msg->status = SWE_STOPPING; | |
199 | |
200 /* and send it to the rve mailbox to be treated by the RVM task */ | |
201 if ( rvf_send_msg( RVM_TASK_ID, msg) != RVF_OK) | |
202 { rvf_free_buf( msg); | |
203 return RVM_INTERNAL_ERR; | |
204 } | |
205 | |
206 return RVM_OK; | |
207 } | |
208 | |
209 T_RVM_RETURN rvm_swe_stopped(T_RV_HDR* p_msg) { | |
210 T_RVM_STOP_MSG *msg=(T_RVM_STOP_MSG*)p_msg; | |
211 | |
212 msg->status = SWE_STOPPING; | |
213 | |
214 if ( rvf_send_msg( RVM_TASK_ID, msg) != RVF_OK) { | |
215 rvf_free_buf( msg); | |
216 return RVM_INTERNAL_ERR; | |
217 } | |
218 return RVM_OK; | |
219 } | |
220 | |
221 /******************************************************************************* | |
222 ** | |
223 ** Function rvm_snd_msg_to_upper | |
224 ** | |
225 ** Description Called during processing to report to MMI the result of an | |
226 ** action. | |
227 ** | |
228 ** Parameters: name of the application to start. | |
229 ** return path for asynchronous response | |
230 ** | |
231 ** Returns T_RVM_RETURN: RVM_OK if everything is ok, | |
232 ** RVM_INVALID_PARAMETER if the appli name is unknown | |
233 ** RVM_NOT_READY if the get_info function has not been specified in the database | |
234 ** or the application has been already started. | |
235 ** RVM_MEMORY_ERR if there is not enough memory in the RVM memory bank. | |
236 ** RVM_INTERNAL_ERR if the RVM task has not been created. | |
237 ** | |
238 *******************************************************************************/ | |
239 T_RVM_RETURN rvm_snd_msg_to_upper (T_RVM_APPLI_ACTION action, | |
240 T_RVM_RETURN result, | |
241 UINT8 swe_num, | |
242 T_RV_RETURN_PATH return_path) | |
243 { | |
244 T_RVM_APPLI_RESULT *msg; | |
245 | |
246 | |
247 /* build a msg */ | |
248 if (rvf_get_buf( rvm_mem_bank, sizeof(T_RVM_APPLI_RESULT), (void **)&msg) == RVF_RED ) | |
249 { return RVM_MEMORY_ERR; | |
250 } | |
251 | |
252 msg->header.msg_id = RVM_EVT_TO_APPLI; | |
253 msg->header.src_addr_id = RVM_TASK_ID; | |
254 // msg->header.callback_func = return_path.callback_func; | |
255 msg->rp.callback_func = return_path.callback_func; | |
256 msg->result = result; | |
257 msg->action = action; | |
258 msg->swe_index = swe_num; | |
259 | |
260 memcpy(msg->swe_name, rvm_swe_array[swe_num].swe_name, RVM_NAME_MAX_LEN); | |
261 | |
262 /* and send it to the rve mailbox to be treated by the RVM task */ | |
263 if (return_path.callback_func) | |
264 { | |
265 return_path.callback_func ((void*) msg); | |
266 } | |
267 else | |
268 { | |
269 if ( rvf_send_msg(return_path.addr_id, (void*)msg) != RVF_OK) | |
270 { rvf_free_buf( msg); | |
271 return RVM_INTERNAL_ERR; | |
272 } | |
273 } | |
274 | |
275 return RVM_OK; | |
276 } | |
277 | |
278 | |
279 | |
280 /******************************************************************************* | |
281 ** | |
282 ** Function rvm_get_swe_information | |
283 ** | |
284 ** Description Called by a SWE to know information about another SWE. | |
285 ** | |
286 ** Parameters In: name of the swe we want to get information about. | |
287 ** | |
288 ** Parameters Out: State of the SWE. | |
289 ** | |
290 ** Returns T_RVM_RETURN: RVM_OK if everything is ok, | |
291 ** RVM_INVALID_PARAMETER if the SWE use_id is unknown | |
292 ** RVM_NOT_READY if the | |
293 ** RVM_MEMORY_ERR if there is not enough memory in the RVM memory bank. | |
294 ** RVM_INTERNAL_ERR if the RVM task has not been created. | |
295 ** | |
296 *******************************************************************************/ | |
297 T_RVM_RETURN rvm_get_swe_information (T_RVM_USE_ID swe_id, | |
298 T_RV_RETURN_PATH * return_path) | |
299 { | |
300 UINT8 swe_index; | |
301 | |
302 if (rvm_get_swe_index(&swe_index, swe_id) != RVM_OK) | |
303 { | |
304 | |
305 RVM_TRACE_WARNING_PARAM("RVM API: Get SWE Information of an unknown SWE, use_id:", swe_id); | |
306 return RVM_INVALID_PARAMETER; | |
307 } | |
308 | |
309 if (return_path != NULL) | |
310 { | |
311 (*return_path).callback_func = rvm_swe_array[swe_index].swe_return_path.callback_func; | |
312 (*return_path).addr_id = rvm_swe_array[swe_index].swe_addr_id; | |
313 } | |
314 | |
315 return RVM_OK; | |
316 } | |
317 |