FreeCalypso > hg > fc-tourmaline
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/riviera/rvm/rvm_api.c Fri Oct 16 06:23:26 2020 +0000 @@ -0,0 +1,317 @@ +/** + * + * @file rvm_api.c + * + * This file contains interface functions. + * + * @author Cristian Livadiotti (c-livadiotti@ti.com) + * @version 0.2 + * + */ + +/* + * Revision History: + * + * 06/04/2000 Cristian Livadiotti Create. + * 10/22/2001 David Lamy-Charrier Update for new Riviera 1.6. + * + * (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved + */ + + +#ifndef _WINDOWS + #include "config/rv.cfg" +#endif + +#include "rvf/rvf_env.h" + +#include "rvm/rvm_gen.h" +#include "rvm/rvm_api.h" +#include "rvm/rvm_i.h" +#include "rvm/rvm_use_id_list.h" + +#include <string.h> + +extern T_RVM_KNOWN_SWE * rvm_swe_array; + + +/******************************************************************************* +** Function rvm_start_environment +** +** Description Start the RV manager. +** +*******************************************************************************/ +T_RVM_RETURN rvm_start_environment() +{ T_RVF_BUFFER * rvm_stack; + + /* initialize the RVM */ + if ( rvm_init() == FALSE) + { return RVM_INTERNAL_ERR; + } + + /* start the RV manager task */ + + if ( rvf_get_buf( rvm_stack_mem_bank, RVM_STACK_SIZE, &rvm_stack) == RVF_RED ) + { return RVM_MEMORY_ERR; + } + + if ( rvf_create_task( rvm_task, RVM_TASK_ID, "RVM", rvm_stack, RVM_STACK_SIZE, RVM_PRIORITY, RVM_TASK, DEFAULT_TIME_SLICING, RUNNING) + != RVF_OK ) + { return RVM_INTERNAL_ERR; + } + + return RVM_OK; +} + + +/******************************************************************************* +** +** Function rvm_start_swe +** +** Description Called by an application to start the specified SWE +** +** Parameters: USE_ID of the SWE to start. +** return path for asynchronous response +** +** Returns T_RVM_RETURN: RVM_OK if everything is ok, +** RVM_INVALID_PARAMETER if the SWE USE_ID is unknown +** RVM_NOT_READY if the get_info function has not been specified in the database +** or the SWE has been already started. +** RVM_MEMORY_ERR if there is not enough memory in the RVM memory bank. +** RVM_INTERNAL_ERR if the RVM task has not been created. +** +*******************************************************************************/ +T_RVM_RETURN rvm_start_swe (T_RVM_USE_ID swe_use_id, T_RV_RETURN_PATH return_path) +{ + T_RVM_MSG *msg; + T_RVM_RETURN rvm_status; + UINT8 num_swe; + + /* Check Application is "startable" */ + if ((rvm_status = rvm_check_application (swe_use_id, &num_swe, RVM_START_APPLI)) != RVM_OK) + { + rvf_send_trace("RVM_task: rvm_start_swe() this appli cannot be started", 54, (UINT32)rvm_status, RV_TRACE_LEVEL_WARNING, RVM_USE_ID ); + return rvm_status; + } + + /* build a msg */ + if (rvf_get_buf( rvm_mem_bank, sizeof(T_RVM_MSG), (void **)&msg) == RVF_RED ) + { + rvf_send_trace("RVM_task: No memory", 19, NULL_PARAM, RV_TRACE_LEVEL_WARNING, RVM_USE_ID ); + return RVM_MEMORY_ERR; + } + + msg->header.msg_id = RVM_START_APPLI; + msg->header.src_addr_id = return_path.addr_id; +// msg->header.callback_func = return_path.callback_func; + msg->rp.callback_func = return_path.callback_func; + msg->swe_num = num_swe; + + rvf_send_trace("RVM: SWE START REQUEST", 22, rvm_swe_array[num_swe].swe_use_id, RV_TRACE_LEVEL_DEBUG_LOW, RVM_USE_ID ); + + /* and send it to the RVM task to be treated by the RVM task */ + /* Note: task_id is used as the destination addr_id. This is only */ + /* true in the case of mailbox zero. Then task_id==addr_id */ + if ( rvf_send_msg( RVM_TASK_ID, msg) != RVF_OK) + { rvf_free_buf( msg); + return RVM_INTERNAL_ERR; + } + + return RVM_OK; +} + +/******************************************************************************* +** +** Function rvm_stop_swe +** +** Description Called by an application to stop the specified SWE. +** +** Parameters: USE_ID of the SWE to start. +** return path for asynchronous response +** +** Returns T_RVM_RETURN: RVM_OK if everything is ok, +** RVM_INVALID_PARAMETER if the USE_ID is unknown +** RVM_NOT_READY if the get_info function has not been specified in the database +** or the SWE is not running. +** RVM_MEMORY_ERR if there is not enough memory in the RVM memory bank. +** RVM_INTERNAL_ERR if the RVM task has not been created. +** +** RV2 ADDITIONAL NOTES: This now creates a RVM_STOP_MSG instead of a RVM_STOP_APPLI message. +** both are supported in the RVM-FSM, hence the legacy concept may be reverted to easily +*******************************************************************************/ +T_RVM_RETURN rvm_stop_swe (T_RVM_USE_ID swe_use_id, T_RV_RETURN_PATH return_path) +{ + T_RVM_STOP_MSG *msg; + T_RVM_RETURN rvm_status; + UINT8 num_swe; + + /* + ** Check Application is "stopable" + */ + if ((rvm_status = rvm_check_application (swe_use_id, &num_swe, RVM_STOP_APPLI)) != RVM_OK) + return rvm_status; + + /* build a msg */ + if (rvf_get_buf( rvm_mem_bank, sizeof(T_RVM_STOP_MSG), (void **)&msg) == RVF_RED ) + { return RVM_MEMORY_ERR; + } + + msg->header.msg_id = RVM_STOP_MSG; + msg->header.src_addr_id = return_path.addr_id; +// msg->header.callback_func = return_path.callback_func; + msg->rp.callback_func = return_path.callback_func; + msg->swe_num = num_swe; + msg->status = SWE_RUNNING; + + /* and send it to the rve mailbox to be treated by the RVM task */ + if ( rvf_send_msg( RVM_TASK_ID, msg) != RVF_OK) + { rvf_free_buf( msg); + return RVM_INTERNAL_ERR; + } + + return RVM_OK; +} + +// NOTE: this may be used to enable the terminator to uncondionally +// kill the Entity. Mainly, spoofing RVM. +T_RVM_RETURN rvm_kill_immediate (T_RVM_USE_ID swe_use_id, T_RV_RETURN_PATH return_path){ + T_RVM_STOP_MSG *msg; + T_RVM_RETURN rvm_status; + UINT8 num_swe; + + /* + ** Check Application is "stopable" + */ + if ((rvm_status = rvm_check_application (swe_use_id, &num_swe, RVM_STOP_APPLI)) != RVM_OK) + return rvm_status; + + /* build a msg */ + if (rvf_get_buf( rvm_mem_bank, sizeof(T_RVM_STOP_MSG), (void **)&msg) == RVF_RED ) + { return RVM_MEMORY_ERR; + } + + msg->header.msg_id = RVM_STOP_MSG; + msg->header.src_addr_id = return_path.addr_id; +// msg->header.callback_func = return_path.callback_func; + msg->rp.callback_func = return_path.callback_func; + msg->swe_num = num_swe; + msg->status = SWE_STOPPING; + + /* and send it to the rve mailbox to be treated by the RVM task */ + if ( rvf_send_msg( RVM_TASK_ID, msg) != RVF_OK) + { rvf_free_buf( msg); + return RVM_INTERNAL_ERR; + } + + return RVM_OK; +} + +T_RVM_RETURN rvm_swe_stopped(T_RV_HDR* p_msg) { + T_RVM_STOP_MSG *msg=(T_RVM_STOP_MSG*)p_msg; + + msg->status = SWE_STOPPING; + + if ( rvf_send_msg( RVM_TASK_ID, msg) != RVF_OK) { + rvf_free_buf( msg); + return RVM_INTERNAL_ERR; + } + return RVM_OK; +} + +/******************************************************************************* +** +** Function rvm_snd_msg_to_upper +** +** Description Called during processing to report to MMI the result of an +** action. +** +** Parameters: name of the application to start. +** return path for asynchronous response +** +** Returns T_RVM_RETURN: RVM_OK if everything is ok, +** RVM_INVALID_PARAMETER if the appli name is unknown +** RVM_NOT_READY if the get_info function has not been specified in the database +** or the application has been already started. +** RVM_MEMORY_ERR if there is not enough memory in the RVM memory bank. +** RVM_INTERNAL_ERR if the RVM task has not been created. +** +*******************************************************************************/ +T_RVM_RETURN rvm_snd_msg_to_upper (T_RVM_APPLI_ACTION action, + T_RVM_RETURN result, + UINT8 swe_num, + T_RV_RETURN_PATH return_path) +{ + T_RVM_APPLI_RESULT *msg; + + + /* build a msg */ + if (rvf_get_buf( rvm_mem_bank, sizeof(T_RVM_APPLI_RESULT), (void **)&msg) == RVF_RED ) + { return RVM_MEMORY_ERR; + } + + msg->header.msg_id = RVM_EVT_TO_APPLI; + msg->header.src_addr_id = RVM_TASK_ID; +// msg->header.callback_func = return_path.callback_func; + msg->rp.callback_func = return_path.callback_func; + msg->result = result; + msg->action = action; + msg->swe_index = swe_num; + + memcpy(msg->swe_name, rvm_swe_array[swe_num].swe_name, RVM_NAME_MAX_LEN); + + /* and send it to the rve mailbox to be treated by the RVM task */ + if (return_path.callback_func) + { + return_path.callback_func ((void*) msg); + } + else + { + if ( rvf_send_msg(return_path.addr_id, (void*)msg) != RVF_OK) + { rvf_free_buf( msg); + return RVM_INTERNAL_ERR; + } + } + + return RVM_OK; +} + + + +/******************************************************************************* +** +** Function rvm_get_swe_information +** +** Description Called by a SWE to know information about another SWE. +** +** Parameters In: name of the swe we want to get information about. +** +** Parameters Out: State of the SWE. +** +** Returns T_RVM_RETURN: RVM_OK if everything is ok, +** RVM_INVALID_PARAMETER if the SWE use_id is unknown +** RVM_NOT_READY if the +** RVM_MEMORY_ERR if there is not enough memory in the RVM memory bank. +** RVM_INTERNAL_ERR if the RVM task has not been created. +** +*******************************************************************************/ +T_RVM_RETURN rvm_get_swe_information (T_RVM_USE_ID swe_id, + T_RV_RETURN_PATH * return_path) +{ + UINT8 swe_index; + + if (rvm_get_swe_index(&swe_index, swe_id) != RVM_OK) + { + + RVM_TRACE_WARNING_PARAM("RVM API: Get SWE Information of an unknown SWE, use_id:", swe_id); + return RVM_INVALID_PARAMETER; + } + + if (return_path != NULL) + { + (*return_path).callback_func = rvm_swe_array[swe_index].swe_return_path.callback_func; + (*return_path).addr_id = rvm_swe_array[swe_index].swe_addr_id; + } + + return RVM_OK; +} +