FreeCalypso > hg > fc-magnetite
view src/gpf3/frame/vsi_trc.c @ 701:35e7f9d0379f
targets: add TARGET_HAS_BUZZER to c11x, c139 and dsample
This new target config preprocessor symbol was introduced in Tourmaline
in connection with the new approach to playing buzzer melodies via PWT,
properly omitting the responsible code on targets where BU output
controls the vibrator instead. That code is not present in Magnetite
and we have no plans to backport it here, but target header files
should be kept consistent between the two trees, especially given
that we plan to support FC Venus target in Magnetite.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 26 Mar 2022 19:51:34 +0000 |
parents | c41a534f33c6 |
children |
line wrap: on
line source
/* +------------------------------------------------------------------------------ | File: vsi_trc.c +------------------------------------------------------------------------------ | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : This Module defines the virtual system interface part | for the tracing functionality. +----------------------------------------------------------------------------- */ #ifndef __VSI_TRC_C__ #define __VSI_TRC_C__ #endif #undef TEST_EXT_TRACE /*==== LINT =======================================================*/ /*lint -emacro(506,va_start) Constant value Boolean */ /*lint -emacro(506,va_arg) Constant value Boolean */ /*lint -emacro(718,va_start) Symbol 'Symbol' undeclared, assumed to return int */ /*lint -emacro(522,va_arg) Warning -- Expected void type, assignment, increment or decrement */ /*lint -emacro(10,va_arg) Error -- Expecting '(' */ /*lint -emacro(516,va_arg) Warning -- 'Symbol _va_argref()' has arg. type conflict (arg. no. 1 -- basic) */ /*lint -e661 */ /*lint -e662 */ /*==== INCLUDES ===================================================*/ #ifndef _VXWORKS_ #include <stdarg.h> #endif #include <stdio.h> #include <string.h> #include "typedefs.h" #include "vsi.h" #include "os.h" #include "tools.h" #include "frame.h" #include "frm_defs.h" #include "frm_types.h" #include "frm_glob.h" #include "p_frame.h" #ifndef _TOOLS_ #include "tstdriver.h" #endif /*==== TYPES ======================================================*/ typedef struct { unsigned int magic_nr; void (*trace_error)(const char * const format, va_list varpars); void (*trace_assert)(const char * const format, va_list varpars); } T_EXT_TRACE; /*==== CONSTANTS ==================================================*/ #define EXT_TRACE_INITIALIZED 0xaffedead /*==== EXTERNALS ==================================================*/ /* -------------- S H A R E D - BEGIN ---------------- */ #ifdef _TOOLS_ #pragma data_seg("FRAME_SHARED") #endif /* * contains the correspnding flags for each task */ extern T_HANDLE TestGroupHandle; extern UBYTE FrameEnv; extern char TaskName[]; extern char FRM_TST_NAME[]; #ifdef _TOOLS_ extern char FRM_SYST_NAME[]; #else extern OS_HANDLE TST_Handle; extern OS_HANDLE RCV_Handle; extern int time_is_tdma_frame; extern char error_ind_dst[]; extern T_FRM_ERROR_IND *frm_error_ind; #endif /*==== VARIABLES ==================================================*/ /* this file may be compiled twice for FLASH and RAM, make sure we get the variable declarations exactly once */ #ifndef RUN_INT_RAM /* must be seen only from FLASH */ GLOBAL char TraceBuffer [ TRACE_TEXT_SIZE ]={0}; /* must be seen from RAM and FLASH */ GLOBAL OS_HANDLE trc_hCommTrace=VSI_ERROR; GLOBAL BOOL trc_LittleEndian = FALSE; /* used by the entities */ GLOBAL char EntityNameBuf[RESOURCE_NAMELEN]; GLOBAL USHORT emergeny_trace; #else /* must be seen from RAM and FLASH */ extern OS_HANDLE trc_hCommTrace; extern BOOL trc_LittleEndian; extern USHORT emergeny_trace; #endif #ifndef RUN_INT_RAM T_EXT_TRACE ext_trace_func; #else extern T_EXT_TRACE ext_trace_func; #endif #ifdef TEST_EXT_TRACE void trace_error ( const char * const format, va_list varpars ); void trace_assert ( const char * const format, va_list varpars ); #ifndef RUN_INT_RAM T_EXT_TRACE_FUNC ext_trace_functions = { trace_error, trace_assert }; #else extern T_EXT_TRACE_FUNC ext_trace_functions; #endif #endif /* TEST_EXT_TRACE */ /*==== VARIABLES ==================================================*/ #ifdef _TOOLS_ #pragma data_seg() #endif /* -------------- S H A R E D - END ---------------- */ /*==== PROTOTYPES ==================================================*/ void ext_trace_init ( void ); int int_vsi_o_ttrace ( T_HANDLE Caller, ULONG TraceClass, const char * const format, va_list varpars ); int int_vsi_o_itrace ( T_HANDLE Caller, ULONG TraceClass, ULONG index, const char * const format, va_list varpars ); int vsi_o_datasend ( T_HANDLE caller, T_HANDLE dst, char *ext_dst, T_PRIM_HEADER *prim FILE_LINE_TYPE ); U32 int_vsi_tc2trace_opc(ULONG trace_class); #ifdef _TARGET_ SHORT tst_pei_primitive (void *primitive); #endif /*==== FUNCTIONS ==================================================*/ #ifndef RUN_FLASH U32 int_vsi_tc2trace_opc(ULONG trace_class) { switch (trace_class) { case TC_FUNC: return FUNC_TRACE_OPC; case TC_EVENT: return EVENT_TRACE_OPC; case TC_PRIM: return PRIM_TRACE_OPC; case TC_STATE: return STATE_TRACE_OPC; case TC_SYSTEM: return SYSTEM_TRACE_OPC; case TC_ISIG: return ISIG_TRACE_OPC; case TC_ERROR: return ERROR_TRACE_OPC; case TC_CCD: return CCD_TRACE_OPC; case TC_TIMER: return TIMER_TRACE_OPC; case TC_PROFILER: return PROFILER_TRACE_OPC; case TC_USER1: return USER1_TRACE_OPC; case TC_USER2: return USER2_TRACE_OPC; case TC_USER3: return USER3_TRACE_OPC; case TC_USER4: return USER4_TRACE_OPC; case TC_USER5: return USER5_TRACE_OPC; case TC_USER6: return USER6_TRACE_OPC; case TC_USER7: return USER7_TRACE_OPC; case TC_USER8: return USER8_TRACE_OPC; default: return TRACE_OPC; } } #endif /* RUN_FLASH */ #ifdef _TOOLS_ /* +------------------------------------------------------------------------------ | Function : vsi_o_set_htrace +------------------------------------------------------------------------------ | Description : This function sets the module variable trc_hCommTrace | | Parameters : comhandle - the new value | | Return : none +------------------------------------------------------------------------------ */ void vsi_o_set_htrace (T_HANDLE comhandle) { trc_hCommTrace = (OS_HANDLE) comhandle; } #endif /* _TOOLS_ */ #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_trace | +--------------------------------------------------------------------+ PURPOSE : traces a dynamic string */ LOCAL int vsi_o_trace ( T_HANDLE Caller, T_PRIM_HEADER *prim, ULONG suspend ) { T_S_HEADER *s_hdr; LONG Status; OS_QDATA QMsg; BOOL AlarmTrace = FALSE; s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset); if ( TracesAborted[Caller] ) { #ifdef _TOOLS_ /* * Only needed for _TOOLS_ because Nucleus provides at least 52 Bytes in the partition */ os_DeallocatePartition ( Caller, (T_VOID_STRUCT*)prim ); Status = os_AllocatePartition ( Caller, (T_VOID_STRUCT**)&prim, 80, suspend, TestGroupHandle ); #endif sprintf ((char*)P2D(prim),"Trc Abort: %d !",TracesAborted[Caller]+1 ); prim->len = strlen ((char*)P2D(prim)) + sizeof(T_PRIM_HEADER); prim->sh_offset = S_HDR_OFFSET(prim->len); s_hdr = (T_S_HEADER*)((ULONG*)prim + prim->sh_offset); AlarmTrace = TRUE; } s_hdr->snd[0] = (char)Caller; if ( Caller ) s_hdr->snd[0] |= (char)HANDLE_BIT; s_hdr->org_rcv[0] = 0; #ifdef _TOOLS_ get_local_time (&s_hdr->time); #else if ( time_is_tdma_frame == 1 ) { os_GetTime(Caller,&s_hdr->time); s_hdr->time |= TIME_IS_TDMA; } else { os_GetTime(Caller,&s_hdr->time); s_hdr->time &= ~TIME_IS_TDMA; } #endif QMsg.flags = 0; QMsg.data16 = MSG_PRIMITIVE; QMsg.data32 = 0; QMsg.ptr = (T_VOID_STRUCT*)prim; #ifdef _TOOLS_ QMsg.len = ALIGN(prim->len) + sizeof(T_S_HEADER); #endif os_GetTime ( 0, &QMsg.time ); #ifndef _TOOLS_ if ( trc_hCommTrace == VSI_ERROR ) if ( (trc_hCommTrace = vsi_c_open ( TST_Handle, FRM_TST_NAME ) ) == OS_ERROR ) { os_DeallocatePartition ( Caller, (T_VOID_STRUCT*)prim ); return VSI_ERROR; } #else if ( trc_hCommTrace == VSI_ERROR ) { if ( FrameEnv == ENV_TOOLS ) { os_DeallocatePartition ( Caller, (T_VOID_STRUCT*)prim ); return VSI_ERROR; } else { if ( os_OpenQueue ( NO_TASK, FRM_TST_NAME, &trc_hCommTrace ) == OS_ERROR ) { os_DeallocatePartition ( Caller, (T_VOID_STRUCT*)prim ); return VSI_ERROR; } } } if ( FrameEnv == ENV_TOOLS ) { s_hdr->snd[0] = '~'; if ( os_GetTaskName ( Caller, Caller, &s_hdr->snd[1] ) == OS_ERROR ) { char Sender[RESOURCE_NAMELEN]; char *ptr = (char*)P2D(prim); unsigned int NameLen; if ( *ptr == '~') { NameLen = GetNextToken ((char*)(ptr), Sender,"~"); InsertString(Sender, &s_hdr->snd[1], 4); prim->len -= 2+NameLen; memcpy ( ptr, ptr+2+NameLen, prim->len-sizeof(T_PRIM_HEADER) ); QMsg.len = ALIGN(prim->len) + sizeof(T_S_HEADER); } else InsertString(FRM_SYST_NAME, &s_hdr->snd[1], 4); } } #endif /* _TOOLS_ */ QMsg.e_id = trc_hCommTrace; #ifndef _TOOLS_ if ( Caller == TST_Handle || Caller == RCV_Handle ) { tst_drv_write ( Caller, 0, NULL, (char*)P2D(prim) ); os_DeallocatePartition ( Caller, (T_VOID_STRUCT*)prim ); return VSI_OK; } #ifndef _TARGET_ else /* * for the PC Simulation SuspendTrace[0] is != 0. To avoid that the system traces * sent with caller NO_TASK block the system if the caller was TST, the Caller * is set to the real caller here. This has no consequence on the caller name * displayed in PCO because this is already formated into the header. */ { if ( Caller == NO_TASK ) { Caller = e_running[os_MyHandle()]; } } #endif #endif QMsg.e_id = trc_hCommTrace; #ifdef _TOOLS_ Status = os_SendToQueue ( NO_TASK, trc_hCommTrace, MSG_TRACE_PRIO, suspend, &QMsg ); #else Status = os_SendToQueue ( NO_TASK, pf_TaskTable[trc_hCommTrace].QueueHandle, MSG_TRACE_PRIO, suspend, &QMsg ); #endif if ( Status == OS_OK || Status == OS_WAITED ) { TracesAborted[Caller] = 0; if ( AlarmTrace ) return VSI_ERROR; else return VSI_OK; } else { /* * No queue space available -> free partition */ os_DeallocatePartition ( Caller, (T_VOID_STRUCT*)prim ); TracesAborted[Caller]++; } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_COM | | STATE : code ROUTINE : vsi_o_primsend | +--------------------------------------------------------------------+ PURPOSE : traces a data segment as a primitive */ int vsi_o_primsend ( T_HANDLE caller, unsigned int mask, T_HANDLE dst, char *ext_dst, unsigned int opc, void *ptr, unsigned int len FILE_LINE_TYPE ) { int alloc_size; T_PRIM_HEADER *prim; T_HANDLE e_handle; if ( caller != 0 ) e_handle = caller; else e_handle = e_running[os_MyHandle()]; if ( (e_handle >= 0) && (TraceMask[e_handle] & mask) ) { if ( opc != 0 ) { alloc_size = len + sizeof(T_PRIM_HEADER); if ( alloc_size < (int)MaxPrimPartSize ) { prim = (T_PRIM_HEADER*)vsi_c_new ( 0, alloc_size, opc FILE_LINE ); memcpy((char*)P2D(prim), ptr, len); /* if primitive is FRM_WARNING_IND -> free */ if ( opc == FRM_WARNING_IND ) { PFREE(ptr); } } else { vsi_o_ttrace ( caller, TC_SYSTEM, "SYSTEM WARNING: Binary trace too long -> discarded in %s(%d)" FILE_LINE ); return VSI_ERROR; } } else { prim = D2P(ptr); } if ( vsi_o_datasend ( e_handle, dst, ext_dst, prim FILE_LINE ) == VSI_ERROR ) { vsi_c_free ( 0, (T_VOID_STRUCT**)&prim FILE_LINE ); } } return VSI_OK; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_COM | | STATE : code ROUTINE : vsi_o_sdusend | +--------------------------------------------------------------------+ PURPOSE : traces an SDU as a primitive */ int vsi_o_sdusend ( T_HANDLE caller, T_HANDLE dst, char *ext_dst, int opc, char ent, char dir, char type, void *ptr, unsigned int len FILE_LINE_TYPE ) { T_PRIM_HEADER *prim; T_HANDLE e_handle; int alloc_size; if ( caller != 0 ) e_handle = caller; else e_handle = e_running[os_MyHandle()]; if ( (e_handle >= 0) && (TraceMask[e_handle] & TC_SDU) ) { if ( opc != 0 ) { alloc_size = len + sizeof(T_PRIM_HEADER) + sizeof(T_SDU_TRACE); if ( alloc_size < (int)MaxPrimPartSize ) { prim = (T_PRIM_HEADER*)vsi_c_new ( 0, alloc_size, opc FILE_LINE ); ((T_SDU_TRACE*)(P2D(prim)))->entity = ent; ((T_SDU_TRACE*)(P2D(prim)))->dir = dir; ((T_SDU_TRACE*)(P2D(prim)))->type = type; ((T_SDU_TRACE*)(P2D(prim)))->align1 = 0; memcpy(((char*)P2D(prim))+sizeof(T_SDU_TRACE), ptr, len); if ( vsi_o_datasend ( e_handle, dst, ext_dst, prim FILE_LINE ) == VSI_ERROR ) { vsi_c_free ( 0, (T_VOID_STRUCT**)&prim FILE_LINE ); } } else { vsi_o_ttrace ( caller, TC_SYSTEM, "SYSTEM WARNING: Binary trace too long -> discarded in %s(%d)" FILE_LINE ); } } } return VSI_OK; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_COM | | STATE : code ROUTINE : vsi_o_datasend | +--------------------------------------------------------------------+ PURPOSE : traces an already allocated primitive */ int vsi_o_datasend ( T_HANDLE caller, T_HANDLE dst, char *ext_dst, T_PRIM_HEADER *prim FILE_LINE_TYPE ) { int alloc_size; T_PRIM_HEADER *carrier; T_S_HEADER *s_hdr; LONG status; OS_QDATA DMsg; unsigned int i; ULONG suspend; suspend = get_suspend_state(caller,CHECK_TRC_SUSPEND); /* allocate carrier */ alloc_size = S_ALLOC_SIZE(4 + 1); status = os_AllocatePartition ( caller, (T_VOID_STRUCT**)&carrier, alloc_size, suspend, TestGroupHandle ); if ( status == OS_OK || status == OS_WAITED || status == OS_ALLOCATED_BIGGER ) { DMsg.data16 = MSG_PRIMITIVE; DMsg.data32 = prim->opc; #ifdef _TOOLS_ DMsg.len = alloc_size; #endif DMsg.ptr = (T_VOID_STRUCT*)carrier; carrier->opc = prim->opc; carrier->len = alloc_size; carrier->sh_offset = S_HDR_OFFSET(alloc_size - sizeof(T_S_HEADER)); s_hdr = (T_S_HEADER*)((ULONG*)carrier + carrier->sh_offset); if ( dst != 0 ) { if ( vsi_e_name ( caller, dst, TaskName ) == VSI_OK ) { /* set org_rcv */ for (i = 0; TaskName[i] && i < sizeof (s_hdr->rcv); i++) s_hdr->org_rcv[i] = TaskName[i]; if (i < sizeof s_hdr->rcv) s_hdr->org_rcv[i] = 0; } else { s_hdr->org_rcv[0] = 0; } } else { s_hdr->org_rcv[0] = 0; } strncpy (s_hdr->rcv, ext_dst, RESOURCE_NAMELEN); s_hdr->rcv[RESOURCE_NAMELEN-1] = 0; if ( caller != 0 ) { if ( vsi_e_name ( caller, caller, TaskName ) == VSI_OK ) { /* set snd */ for (i = 0; TaskName[i] && i < sizeof (s_hdr->snd); i++) s_hdr->snd[i] = TaskName[i]; if (i < sizeof s_hdr->snd) s_hdr->snd[i] = 0; } } else { if ( pf_TaskTable[caller].Name[0] != 0 ) { s_hdr->snd[0] = (char)(caller | HANDLE_BIT); } else { s_hdr->rcv[0] = 0; } } os_GetTime(0,&s_hdr->time); ((T_PRIM_X*)(carrier))->prim_ptr = prim; DMsg.e_id = trc_hCommTrace; } else { TracesAborted[caller]++; return VSI_ERROR; } #ifdef MEMORY_SUPERVISION vsi_ppm_send ( caller, pf_TaskTable[trc_hCommTrace].QueueHandle, prim FILE_LINE_MACRO ); #endif /* MEMORY_SUPERVISION */ if ( os_SendToQueue ( caller, pf_TaskTable[trc_hCommTrace].QueueHandle, OS_NORMAL, suspend, &DMsg ) == OS_TIMEOUT ) { os_DeallocatePartition ( caller, (T_VOID_STRUCT*)carrier ); TracesAborted[caller]++; return VSI_ERROR; } return VSI_OK; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_COM | | STATE : code ROUTINE : vsi_o_memtrace | +--------------------------------------------------------------------+ PURPOSE : check if PS already started */ int vsi_o_memtrace ( T_HANDLE caller, void *ptr, unsigned int len ) { T_PRIM_HEADER *prim; T_HANDLE e_handle; LONG status; unsigned int i; ULONG suspend; if ( caller != 0 ) e_handle = caller; else e_handle = e_running[os_MyHandle()]; if ( (e_handle >= 0) && (TraceMask[e_handle] & TC_DATA) ) { suspend = get_suspend_state(e_handle,CHECK_TRC_SUSPEND); status = os_AllocatePartition ( e_handle, (T_VOID_STRUCT**)&prim, S_ALLOC_SIZE(len)*3, suspend, TestGroupHandle ); if ( status == OS_OK || status == OS_WAITED || status == OS_ALLOCATED_BIGGER ) { unsigned char *dst_ptr = (unsigned char*)P2D(prim); unsigned char *src_ptr = (unsigned char*)ptr; for ( i = 0; i < len; i++, src_ptr++ ) { if (*src_ptr>>4 > 9) *dst_ptr++ = (*src_ptr>>4) + ('A'-10); else *dst_ptr++ = (*src_ptr>>4) +'0'; if ((*src_ptr&0xf) > 9) *dst_ptr++ = (*src_ptr&0xf) + ('A'-10); else *dst_ptr++ = (*src_ptr&0xf) +'0'; *dst_ptr++ = 0x20; } prim->opc = int_vsi_tc2trace_opc(TC_DATA); prim->len = 3*len + sizeof(T_PRIM_HEADER); prim->sh_offset = S_HDR_OFFSET(prim->len); return ( vsi_o_trace ( e_handle, prim, suspend ) ); } TracesAborted[e_handle]++; return VSI_ERROR; } return VSI_OK; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_func_ttrace | +--------------------------------------------------------------------+ PURPOSE : traces a function name */ int vsi_o_func_ttrace ( const char * const format, ... ) { va_list varpars; T_HANDLE Caller; Caller = e_running[os_MyHandle()]; if ( (Caller >= 0) && (TraceMask[Caller] & TC_FUNC) ) { va_start (varpars, format); return int_vsi_o_ttrace ( Caller, TC_FUNC, format, varpars ); } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_event_ttrace | +--------------------------------------------------------------------+ PURPOSE : traces an event */ int vsi_o_event_ttrace ( const char * const format, ... ) { va_list varpars; T_HANDLE Caller; Caller = e_running[os_MyHandle()]; if ( (Caller >= 0) && (TraceMask[Caller] & TC_EVENT) ) { va_start (varpars, format); return int_vsi_o_ttrace ( Caller, TC_EVENT, format, varpars ); } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_error_ttrace | +--------------------------------------------------------------------+ PURPOSE : traces an error */ int vsi_o_error_ttrace ( const char * const format, ... ) { va_list varpars; T_HANDLE Caller; Caller = e_running[os_MyHandle()]; if ( (Caller >= 0) && (TraceMask[Caller] & TC_ERROR) ) { va_start (varpars, format); int_vsi_o_ttrace ( Caller, TC_ERROR, format, varpars ); vsi_o_ttrace ( NO_TASK, TC_ERROR, "TRACE ERROR in %s", pf_TaskTable[Caller].Name ); if ( ext_trace_func.trace_error != NULL ) { ext_trace_func.trace_error ( format, varpars ); } return VSI_OK; } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_state_ttrace | +--------------------------------------------------------------------+ PURPOSE : traces a dynamic string */ int vsi_o_state_ttrace ( const char * const format, ... ) { va_list varpars; T_HANDLE Caller; Caller = e_running[os_MyHandle()]; if ( (Caller >= 0) && (TraceMask[Caller] & TC_STATE) ) { va_start (varpars, format); return int_vsi_o_ttrace ( Caller, TC_STATE, format, varpars ); } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_class_ttrace | +--------------------------------------------------------------------+ PURPOSE : traces a dynamic string */ int vsi_o_class_ttrace ( ULONG trace_class, const char * const format, ... ) { va_list varpars; T_HANDLE Caller; Caller = e_running[os_MyHandle()]; if ( (Caller >= 0) && (TraceMask[Caller] & trace_class) ) { va_start (varpars, format); return int_vsi_o_ttrace ( Caller, trace_class, format, varpars ); } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_ttrace | +--------------------------------------------------------------------+ PURPOSE : traces a dynamic string */ int vsi_o_ttrace ( T_HANDLE Caller, ULONG TraceClass, const char * const format, ... ) { va_list varpars; if ( (Caller >= 0) && (TraceMask[Caller] & TraceClass) ) { va_start (varpars, format); return int_vsi_o_ttrace ( Caller, TraceClass, format, varpars ); } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : int_vsi_o_ttrace | +--------------------------------------------------------------------+ PURPOSE : traces a dynamic string */ int int_vsi_o_ttrace ( T_HANDLE Caller, ULONG TraceClass, const char * const format, va_list varpars ) { T_PRIM_HEADER *prim; LONG Status; ULONG suspend; unsigned int offset = 0; unsigned int num; suspend = get_suspend_state(Caller,CHECK_TRC_SUSPEND); Status = os_AllocatePartition ( Caller, (T_VOID_STRUCT**)&prim, TextTracePartitionSize, suspend, TestGroupHandle ); if ( Status == OS_OK || Status == OS_WAITED || Status == OS_ALLOCATED_BIGGER ) { #if 0 /* be activated when PCO can handle this */ if ( TraceClass == TC_ERROR ) { *((char*)(P2D(prim))) = '#'; offset = 1; } #endif #ifdef _TOOLS_ int trc_length = TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER) - 1; trc_length &= ~0x03; num = offset + (unsigned int)_vsnprintf ((char*)(P2D(prim)) + offset, trc_length, format, varpars) + 1; /* + 1 for terminating 0 */ #else num = offset + (unsigned int)vsprintf ((char*)(P2D(prim)) + offset, format, varpars) + 1; /* + 1 for terminating 0 */ #endif va_end (varpars); if ( num + sizeof(T_S_HEADER) + sizeof(T_PRIM_HEADER) >= TextTracePartitionSize ) { sprintf ( (char*)(P2D(prim))+60, "... %s trace too long", pf_TaskTable[Caller].Name ); vsi_o_assert ( NO_TASK, OS_SYST_ERR_STR_TOO_LONG, __FILE__, __LINE__,(char*)(P2D(prim))); } prim->opc = int_vsi_tc2trace_opc(TraceClass); prim->len = strlen((char*)P2D(prim)) + sizeof(T_PRIM_HEADER); prim->sh_offset = S_HDR_OFFSET(prim->len); return ( vsi_o_trace ( Caller, prim, suspend ) ); } if ( FrameEnv == ENV_STACK ) { TracesAborted[Caller]++; } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_func_itrace | +--------------------------------------------------------------------+ PURPOSE : traces a function name */ int vsi_o_func_itrace ( ULONG index, const char * const format, ... ) { va_list varpars; T_HANDLE Caller; Caller = e_running[os_MyHandle()]; if ( (Caller >= 0) && (TraceMask[Caller] & TC_FUNC) ) { va_start (varpars, format); return int_vsi_o_itrace ( Caller, TC_FUNC, index, format, varpars ); } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_event_itrace | +--------------------------------------------------------------------+ PURPOSE : traces an event */ int vsi_o_event_itrace ( ULONG index, const char * const format, ... ) { va_list varpars; T_HANDLE Caller; Caller = e_running[os_MyHandle()]; if ( (Caller >= 0) && (TraceMask[Caller] & TC_EVENT) ) { va_start (varpars, format); return int_vsi_o_itrace ( Caller, TC_EVENT, index, format, varpars ); } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_error_itrace | +--------------------------------------------------------------------+ PURPOSE : traces an error */ int vsi_o_error_itrace ( ULONG index, const char * const format, ... ) { va_list varpars; T_HANDLE Caller; Caller = e_running[os_MyHandle()]; if ( (Caller >= 0) && (TraceMask[Caller] & TC_ERROR) ) { va_start (varpars, format); int_vsi_o_itrace ( Caller, TC_ERROR, index, format, varpars ); os_GetTaskName ( Caller, Caller, TaskName ); vsi_o_ttrace ( NO_TASK, TC_ERROR, "TRACE ERROR in %s", pf_TaskTable[Caller].Name ); return VSI_OK; } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_state_itrace | +--------------------------------------------------------------------+ PURPOSE : traces a dynamic string */ int vsi_o_state_itrace ( ULONG index, const char * const format, ... ) { va_list varpars; T_HANDLE Caller; Caller = e_running[os_MyHandle()]; if ( (Caller >= 0) && (TraceMask[Caller] & TC_STATE) ) { va_start (varpars, format); return int_vsi_o_itrace ( Caller, TC_STATE, index, format, varpars ); } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_class_itrace | +--------------------------------------------------------------------+ PURPOSE : traces a dynamic string */ int vsi_o_class_itrace ( ULONG trace_class, ULONG Index, const char * const format, ... ) { va_list varpars; T_HANDLE Caller; Caller = e_running[os_MyHandle()]; if ( (Caller >= 0) && (TraceMask[Caller] & trace_class) ) { va_start (varpars, format); return int_vsi_o_itrace ( Caller, trace_class, Index, format, varpars ); } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_ttrace | +--------------------------------------------------------------------+ PURPOSE : traces a dynamic string */ int vsi_o_itrace ( T_HANDLE Caller, ULONG TraceClass, ULONG Index, const char * const format, ... ) { va_list varpars; if ( (Caller >= 0) && (TraceMask[Caller] & TraceClass) ) { va_start (varpars, format); return int_vsi_o_itrace ( Caller, TraceClass, Index, format, varpars ); } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : int_vsi_o_itrace | +--------------------------------------------------------------------+ PURPOSE : traces a dynamic string */ int int_vsi_o_itrace ( T_HANDLE Caller, ULONG TraceClass, ULONG index, const char * const format, va_list varpars ) { T_PRIM_HEADER *prim; LONG Status; ULONG suspend; unsigned int offset = 0; unsigned int paramCount; unsigned int i; /* * the offset is calculated prior to the actual write operation * to avoid writing beyond the allocated size * * all write operation are addressed relatively to the precalculated * offset e.g. *(&Prim->Data + offset - 5) */ if ( (Caller >= 0) && (TraceMask[Caller] & TraceClass) ) { suspend = get_suspend_state(Caller,CHECK_TRC_SUSPEND); Status = os_AllocatePartition ( Caller, (T_VOID_STRUCT**)&prim, (ULONG)TextTracePartitionSize, suspend, TestGroupHandle ); if ( Status == OS_OK || Status == OS_WAITED || Status == OS_ALLOCATED_BIGGER ) { /* * the index preceded by % */ #if 0 /* be activated when PCO can handle this */ if ( TraceClass == TC_ERROR ) { *((char*)(P2D(prim))) = '#'; offset = 1; } #endif offset += 5; if(offset <= TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER)) { *((char*)(P2D(prim)) + offset - 5) = '%'; if(trc_LittleEndian) { *((char*)(P2D(prim)) + offset - 4) = *((char *)&index); *((char*)(P2D(prim)) + offset - 3) = *(((char *)&index)+1); *((char*)(P2D(prim)) + offset - 2) = *(((char *)&index)+2); *((char*)(P2D(prim)) + offset - 1) = *(((char *)&index)+3); } else { *((char*)(P2D(prim)) + offset - 4) = *(((char *)&index)+3); *((char*)(P2D(prim)) + offset - 3) = *(((char *)&index)+2); *((char*)(P2D(prim)) + offset - 2) = *(((char *)&index)+1); *((char*)(P2D(prim)) + offset - 1) = *((char *)&index); } } /* * parse the format string */ paramCount = strlen(format); for (i=0; i<paramCount; i++) { switch(*(format+i)) { case 'c': /* one byte */ offset+=1; if(offset <= TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER)) *((char*)(P2D(prim)) + offset - 1) = *((char *)varpars); va_arg(varpars, char); break; case 'i': /* four bytes */ case 'p': case '*': offset+=4; if(offset <= TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER)) { if(trc_LittleEndian) { *((char*)(P2D(prim)) + offset - 4) = *((char *)varpars); *((char*)(P2D(prim)) + offset - 3) = *(((char *)varpars)+1); *((char*)(P2D(prim)) + offset - 2) = *(((char *)varpars)+2); *((char*)(P2D(prim)) + offset - 1) = *(((char *)varpars)+3); } else { *((char*)(P2D(prim)) + offset - 4) = *(((char *)varpars)+3); *((char*)(P2D(prim)) + offset - 3) = *(((char *)varpars)+2); *((char*)(P2D(prim)) + offset - 2) = *(((char *)varpars)+1); *((char*)(P2D(prim)) + offset - 1) = *((char *)varpars); } } va_arg(varpars, int); break; case 'd': /* eigth bytes */ offset += 8; /* * TI and Microsoft represent double values differently * Double Host representation (address incressing from byte 1 to 8) layout Microsoft TMS470x SEEEEEEE byte 8 byte 4 EEMMMMMM byte 7 byte 3 MMMMMMMM byte 6 byte 2 MMMMMMMM byte 5 byte 1 MMMMMMMM byte 4 byte 8 MMMMMMMM byte 3 byte 7 MMMMMMMM byte 2 byte 6 MMMMMMMM byte 1 byte 5 S - sign bit E - exponent bits M - mantissa bits * * double */ if(offset <= TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER)) { #ifdef _TARGET_ /* TI TMS470 Compiler */ *((char*)(P2D(prim)) + offset - 4) = *((char *)varpars); *((char*)(P2D(prim)) + offset - 3) = *(((char *)varpars)+1); *((char*)(P2D(prim)) + offset - 2) = *(((char *)varpars)+2); *((char*)(P2D(prim)) + offset - 1) = *(((char *)varpars)+3); *((char*)(P2D(prim)) + offset - 8) = *(((char *)varpars)+4); *((char*)(P2D(prim)) + offset - 7) = *(((char *)varpars)+5); *((char*)(P2D(prim)) + offset - 6) = *(((char *)varpars)+6); *((char*)(P2D(prim)) + offset - 5) = *(((char *)varpars)+7); #else /* * This should work as well, since no reordering is done. * Don't believe the VC5/6 manual which states a complete * different byte order :( * */ /* PC- Simulation */ *((char*)(P2D(prim)) + offset - 8) = *((char *)varpars); *((char*)(P2D(prim)) + offset - 7) = *(((char *)varpars)+1); *((char*)(P2D(prim)) + offset - 6) = *(((char *)varpars)+2); *((char*)(P2D(prim)) + offset - 5) = *(((char *)varpars)+3); *((char*)(P2D(prim)) + offset - 4) = *(((char *)varpars)+4); *((char*)(P2D(prim)) + offset - 3) = *(((char *)varpars)+5); *((char*)(P2D(prim)) + offset - 2) = *(((char *)varpars)+6); *((char*)(P2D(prim)) + offset - 1) = *(((char *)varpars)+7); #endif /* _TARGET_ */ } va_arg(varpars, double); break; case 's': /* a string of bytes */ { /* * copy the string including the terminating NULL */ unsigned int len = strlen(*((char **)varpars)) + 1; offset += len; if(offset <= TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER)) { memcpy((char*)(P2D(prim)) + offset - len, *((char **)varpars), len); } va_arg(varpars, char **); } break; default: /* unknown type */ vsi_o_assert ( NO_TASK, OS_SYST_ERR_STR_TOO_LONG, __FILE__, __LINE__, "Unknown Trace Format" ); break; } } va_end (varpars); /* * if the amount of trace data was bigger than the allocated * size - discard the trace and send an error trace instead */ if (offset > TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER)) { unsigned int n = (unsigned int)sprintf ((char*)P2D(prim),"ERROR: Compressed trace (index %d) too long (%d bytes). Trace discarded !!!",index, offset); prim->len = n + sizeof(T_PRIM_HEADER); } else { prim->len = offset + sizeof(T_PRIM_HEADER); } prim->opc = int_vsi_tc2trace_opc(TraceClass); prim->sh_offset = S_HDR_OFFSET(prim->len); return ( vsi_o_trace ( Caller, prim, suspend ) ); } if ( FrameEnv == ENV_STACK ) { TracesAborted[Caller]++; } } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_ptrace | +--------------------------------------------------------------------+ PURPOSE : traces a primitive opc and direction */ int vsi_o_ptrace ( T_HANDLE Caller, ULONG opc, UBYTE dir ) { T_PRIM_HEADER *prim; ULONG suspend; LONG Status; ULONG size; int opc_len; if ( (Caller >= 0) && (TraceMask[Caller] & TC_PRIM) #ifdef _TOOLS_ && (SAP_NR(opc)!=TRACE_SAP) && (opc!=TRACE_OPC) #endif ) { suspend = get_suspend_state(Caller,CHECK_TRC_SUSPEND); size = S_ALLOC_SIZE(PTRACE_LEN_OPC32); Status = os_AllocatePartition ( Caller, (T_VOID_STRUCT**)&prim, size, suspend, TestGroupHandle ); if ( Status == OS_OK || Status == OS_WAITED || Status == OS_ALLOCATED_BIGGER ) { prim->opc = int_vsi_tc2trace_opc(TC_PRIM); if ( dir ) strcpy ( (char*)P2D(prim),"$---OUT:$p0x123456789" ); else strcpy ( (char*)P2D(prim),"$--- IN:$p0x123456789" ); if ( OPC32BIT(opc) ) { opc_len = CHARS_FOR_32BIT; prim->len = PTRACE_LEN_OPC32; } else { opc_len = CHARS_FOR_16BIT; prim->len = PTRACE_LEN_OPC16; } prim->len = prim->len + sizeof(T_PRIM_HEADER); HexToASCII ( opc, (char*)P2D(prim) + 12, opc_len ); strcpy (((char*)P2D(prim) + 12 + opc_len), "$" ); prim->sh_offset = S_HDR_OFFSET(prim->len); return ( vsi_o_trace ( Caller, prim, suspend ) ); } TracesAborted[Caller]++; } return VSI_ERROR; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_strace | +--------------------------------------------------------------------+ PURPOSE : traces a state and state transition */ int vsi_o_strace (T_HANDLE Caller, const char *const machine, const char *const curstate, const char *const newstate) { T_PRIM_HEADER *prim; LONG Status; ULONG size; ULONG suspend; if ( (Caller >= 0) && (TraceMask[Caller] & TC_STATE) ) { suspend = get_suspend_state(Caller,CHECK_TRC_SUSPEND); size = S_ALLOC_SIZE(STRACE_LEN); Status = os_AllocatePartition ( Caller, (T_VOID_STRUCT**)&prim, size, suspend, TestGroupHandle ); if ( Status == OS_OK || Status == OS_WAITED || Status == OS_ALLOCATED_BIGGER ) { strcpy ( (char *)P2D(prim), machine ); strcat ( (char *)P2D(prim), ":" ); strcat ( (char *)P2D(prim), curstate ); if ( newstate != NULL ) { strcat ( (char *)P2D(prim), " -> " ); strcat ( (char *)P2D(prim), newstate ); } prim->opc = int_vsi_tc2trace_opc(TC_STATE); prim->len = strlen((char*)P2D(prim)) + sizeof(T_PRIM_HEADER); prim->sh_offset = S_HDR_OFFSET(prim->len); return ( vsi_o_trace ( Caller, prim, suspend ) ); } TracesAborted[Caller]++; } return VSI_ERROR; } #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_o_assert | +--------------------------------------------------------------------+ PURPOSE : assert */ /*lint -esym(715,cause) suppress Info -- Symbol 'cause' not referenced */ int vsi_o_assert (T_HANDLE Caller, USHORT cause, const char *file, int line, const char * const format,...) { va_list varpars; #ifdef _TARGET_ OS_QDATA Msg; while ( os_ReceiveFromQueue( Caller, pf_TaskTable[trc_hCommTrace].QueueHandle, &Msg, OS_NO_SUSPEND ) == OS_OK ) { tst_pei_primitive (Msg.ptr); } #endif strcpy ( TraceBuffer, "SYSTEM ERROR: " ); va_start (varpars, format); vsprintf (TraceBuffer+strlen("SYSTEM ERROR: "), format, varpars); va_end (varpars); sprintf (TraceBuffer+strlen(TraceBuffer), ", %s(%d)", file, line ); #ifdef _TOOLS_ vsi_o_ttrace ( NO_TASK, TC_SYSTEM, TraceBuffer ); #else if ( cause & OS_SYST_ERR ) emergeny_trace = 1; tst_drv_write ( NO_TASK, 0, NULL, TraceBuffer ); if ( error_ind_dst[0] != 0 ) { frm_error_ind->error_code = cause; strncpy ((char*)frm_error_ind->error_string, TraceBuffer, FRM_PRIM_STR_SIZE); frm_error_ind->error_string[FRM_PRIM_STR_SIZE-1] = 0; tst_drv_write ( NO_TASK, FRM_ERROR_IND, error_ind_dst, (char*)frm_error_ind ); } #endif #if defined _NUCLEUS_ && !defined _TARGET_ printf ("%s\n",TraceBuffer); printf ( "Task %s suspended\n", pf_TaskTable[Caller].Name ); #endif if ( ext_trace_func.trace_assert != NULL ) { /* in case of OS_SYST_ERR_QUEUE_FULL we should not to send the trace to ACI, because ACI will probably no longer be scheduled. in case of OS_SYST_ERR_NO_PARTITION the PALLOC in ACI fails and will probably hide the root cause of the problem. */ if ( cause != OS_SYST_ERR_QUEUE_FULL && cause != OS_SYST_ERR_NO_PARTITION ) { ext_trace_func.trace_assert ( format, varpars ); os_SuspendTask ( Caller, 1000 ); } } #ifdef _NUCLEUS_ os_SystemError ( os_MyHandle(), cause, TraceBuffer ); #endif return VSI_OK; } #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_settracemask | +--------------------------------------------------------------------+ PURPOSE : set trace mask */ int vsi_settracemask ( T_HANDLE Caller, T_HANDLE Handle, ULONG Mask ) { if ( Handle == 0 || pf_TaskTable[Handle].Name[0] != 0 ) { TraceMask[Handle] = Mask; TraceMask[0] |= TC_SYSTEM; return VSI_OK; } else return VSI_ERROR; } #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_gettracemask | +--------------------------------------------------------------------+ PURPOSE : get trace mask */ int vsi_gettracemask ( T_HANDLE Caller, T_HANDLE Handle, ULONG *Mask ) { if ( Handle == 0 || pf_TaskTable[Handle].Name[0] != 0 ) { *Mask = TraceMask[Handle]; return VSI_OK; } else return VSI_ERROR; } #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_trcsuspend | +--------------------------------------------------------------------+ PURPOSE : set suspend for traces */ int vsi_trcsuspend ( T_HANDLE Caller, T_HANDLE Handle, ULONG Suspend ) { /* SuspendTrace[Handle] = Suspend; */ return VSI_OK; } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : vsi_trc_free | +--------------------------------------------------------------------+ PURPOSE : monitor test interface partition allocation */ int vsi_trc_free ( T_HANDLE Caller, T_VOID_STRUCT **Prim ) { if ( os_DeallocatePartition ( Caller, *Prim ) != OS_ERROR ) { *Prim = NULL; return VSI_OK; } return VSI_ERROR; } #endif #ifndef RUN_INT_RAM /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : InitializeTestpools | +--------------------------------------------------------------------+ PURPOSE : initialize supervision, write index to each partition. */ void InitializeTrace ( void ) { USHORT i; ULONG ByteOrder; /* * test the byte order */ ByteOrder = 0x11223344; if(*((char *) &ByteOrder) == 0x44) trc_LittleEndian = TRUE; else if (*((char *) &ByteOrder) == 0x11) trc_LittleEndian = FALSE; else vsi_o_assert ( NO_TASK, OS_SYST_ERR_STR_TOO_LONG, __FILE__, __LINE__, "Unknown Byte Order" ); emergeny_trace = 0; trc_hCommTrace = VSI_ERROR;; for ( i = 0; i <= MaxEntities; i++ ) { TracesAborted[i] = 0; #ifdef _TARGET_ TraceMask[i] = TC_SYSTEM|TC_ERROR; #else /* _TARGET_ */ TraceMask[i] = 0xffffffff & ~TC_CCD; #endif /* _TARGET_ */ } #ifdef _TARGET_ #endif ext_trace_func.magic_nr = 0; ext_trace_init(); } #endif #ifndef RUN_FLASH /* +--------------------------------------------------------------------+ | PROJECT : GSM-Frame (8415) MODULE : VSI_TRC | | STATE : code ROUTINE : get_suspend_state | +--------------------------------------------------------------------+ PURPOSE : check if suspend is allowed. */ ULONG get_suspend_state ( T_HANDLE caller, int type ) { if ( caller != 0 ) { #ifdef _TARGET_ if ( type == CHECK_TRC_SUSPEND ) { if ( pf_TaskTable[caller].Flags & TRC_NO_SUSPEND ) { return OS_NO_SUSPEND; } else { return OS_SUSPEND; } } else if ( type == CHECK_PRIM_SUSPEND ) { if ( pf_TaskTable[caller].Flags & PRIM_NO_SUSPEND ) { return OS_NO_SUSPEND; } else { return OS_SUSPEND; } } else { return OS_NO_SUSPEND; } #else /* It is checked if the caller is a SYSTEM_PROCESS to ensure that TST and RCV do not block while tracing to avoid a deadlock. */ if ( pf_TaskTable[caller].Flags & SYSTEM_PROCESS ) return OS_NO_SUSPEND; else return OS_SUSPEND; #endif } else { #ifdef _TARGET_ return OS_NO_SUSPEND; #else return OS_SUSPEND; #endif } } #endif /* ------------------------------------------------------------------------- External Trace functions ----------------------------------------------------------------------------*/ #ifdef TEST_EXT_TRACE #ifndef RUN_INT_RAM void trace_error ( const char * const format, va_list varpars ) { #ifndef _TARGET_ char buf[99]; vsprintf (buf, format, varpars); printf ("%s\n",buf); #endif } #endif #ifndef RUN_INT_RAM void trace_assert ( const char * const format, va_list varpars ) { #ifndef _TARGET_ char buf[99]; vsprintf (buf, format, varpars); printf ("%s\n",buf); #endif } #endif #endif /* TEST_EXT_TRACE */ #ifndef RUN_INT_RAM /* +------------------------------------------------------------------------------ | Function : ext_trace_register +------------------------------------------------------------------------------ | Description : register the external trace functions. | | Parameters : func - pointer to API function pointer table | | Return : void +------------------------------------------------------------------------------ */ void vsi_ext_trace_register ( T_EXT_TRACE_FUNC * func ) { ext_trace_func.trace_error = func->trace_error; ext_trace_func.trace_assert = func->trace_assert; ext_trace_func.magic_nr = EXT_TRACE_INITIALIZED; } #endif #ifndef RUN_INT_RAM /* +------------------------------------------------------------------------------ | Function : ext_trace_init +------------------------------------------------------------------------------ | Description : initialize external trace function pointer table. | | Parameters : void | | Return : void +------------------------------------------------------------------------------ */ void ext_trace_init ( void ) { #ifdef TEST_EXT_TRACE vsi_ext_trace_register ( &ext_trace_functions ); #endif if ( ext_trace_func.magic_nr != EXT_TRACE_INITIALIZED ) { ext_trace_func.trace_error = NULL; ext_trace_func.trace_assert = NULL; } } #endif