diff gsm-fw/gpf/frame/frame.c @ 316:79080922d8e4

GPF: FRAME C sources and include files imported from LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Thu, 10 Apr 2014 04:06:05 +0000
parents
children 06ee56829697
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/gpf/frame/frame.c	Thu Apr 10 04:06:05 2014 +0000
@@ -0,0 +1,1470 @@
+/* 
++------------------------------------------------------------------------------
+|  File:       frame.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 Modul defines the general frame functionality.
++----------------------------------------------------------------------------- 
+*/ 
+
+
+#ifndef __FRAME_C__
+#define __FRAME_C__
+#endif
+
+/*==== INCLUDES ===================================================*/
+
+#include <stdarg.h>
+#include "typedefs.h"
+#include "string.h"
+#include "stdio.h"
+
+#include "glob_defs.h"
+#include "os.h"
+#include "vsi.h"
+#include "pei.h"
+#include "frame.h"
+#include "tools.h"
+#include "gdi.h"
+#include "frm_defs.h"
+#include "frm_types.h"
+#include "frm_glob.h"
+#include "route.h"
+#include "p_frame.h"
+#include "prf_func.h"
+#ifdef _ESF_SUPPORT_
+#include "esf_func.h"
+#endif
+#include "frm_ext.h"
+
+/*==== TYPES ======================================================*/
+
+typedef struct
+{
+  char const *Name;
+  USHORT Id;
+} T_NAME_ID;
+
+/*==== CONSTANTS ==================================================*/
+
+#define RUNNING   0x01
+#undef VSI_CALLER
+#define VSI_CALLER   TaskHandle,
+
+/*==== EXTERNALS ==================================================*/
+/* -------------- S H A R E D - BEGIN ---------------- */
+#ifdef _TOOLS_
+#pragma data_seg("FRAME_SHARED") 
+#endif
+
+#if defined _NUCLEUS_ && !defined _TARGET_
+extern char TraceBuffer[];
+#endif
+
+#ifndef _TOOLS_
+extern const T_MEMORY_POOL_CONFIG memory_pool_config[];
+extern const T_FRM_PARTITION_GROUP_CONFIG partition_grp_config[];
+extern T_HANDLE MemoryPoolHandle[];
+extern OS_HANDLE PoolGroupHandle[];
+extern const T_DRV_LIST DrvList[]; 
+#ifdef MEMORY_SUPERVISION      
+extern USHORT NumberOfPPMPartitions;
+extern USHORT NumOfPPMPools;
+extern USHORT NumOfPPMGroups;
+extern USHORT NumOfPrimPools;
+extern USHORT NumOfDmemPools;
+#endif
+#endif
+
+extern T_DRV_LIST const *DriverConfigList;
+
+#ifndef _TOOLS_
+extern const T_COMPONENT_ADDRESS *ComponentTables[];
+extern const char * const frame_version_date;
+extern const char * const frame_version_time;
+extern const char * const misc_version_date;
+extern const char * const misc_version_time;
+extern const char * const tif_version_date;
+extern const char * const tif_version_time;
+#endif
+
+#ifdef _TOOLS_
+  __declspec (dllimport) T_HANDLE TST_Handle;
+#else
+  extern T_HANDLE TST_Handle;
+#endif
+
+#ifdef MEMORY_SUPERVISION
+extern int ppm_check_partition_owner;
+#endif
+
+/*==== VARIABLES ==================================================*/
+    
+#ifndef RUN_INT_RAM
+UBYTE SuppressOK=1;
+GLOBAL T_HANDLE MemPoolHandle;                                                 
+GLOBAL T_HANDLE PrimGroupHandle;
+GLOBAL T_HANDLE DmemGroupHandle;
+GLOBAL T_HANDLE TestGroupHandle;
+GLOBAL T_HANDLE LemuGroupHandle;
+GLOBAL T_HANDLE int_data_pool_handle;
+GLOBAL T_HANDLE ext_data_pool_handle;
+GLOBAL UBYTE FrameEnv=0;
+GLOBAL USHORT TestInterface = 0;
+GLOBAL USHORT NextTimerEntry = 0;
+int time_is_tdma_frame;
+char error_ind_dst[RESOURCE_NAMELEN] = {0};
+T_FRM_ERROR_IND *frm_error_ind = NULL;
+char check_desclist = FALSE;
+GLOBAL USHORT NumberOfStartedTasks = 0;
+GLOBAL USHORT NumberOfRunningTasks = 0;
+GLOBAL USHORT TooManyTasks = 0;
+
+const T_PEI_INFO DummyInfo = 
+  { 
+    "",          /* Name */
+    { 
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      NULL
+    },
+    768,        /* stack size */
+    10,         /* queue entries */
+    1,          /* priority */
+    0,          /* number of timers */
+    COPY_BY_REF /* Flags */
+ };
+
+const T_NAME_ID Resource[] =
+{
+  { "TASK",       OS_OBJTASK},
+  { "QUEUE",      OS_OBJQUEUE},
+  { "TIMER",      OS_OBJTIMER },
+  { "SEMAPHORE",  OS_OBJSEMAPHORE},
+  { "PARTITION",  OS_OBJPARTITIONGROUP},
+  { "MEMORY",     OS_OBJMEMORYPOOL},
+  { NULL,         0 }
+};
+
+#ifdef _TOOLS_
+LOCAL T_COMPONENT_ADDRESS *ComponentTables [NUM_OF_COMPONENT_TABLES+1]={0};
+typedef void T_INIT_FUNC ( void );
+T_INIT_FUNC *InitFunc;
+ULONG init_stack_time = 0;
+ULONG init_local_time = 0;
+ULONG  MaxPrimPartSize = 65536;
+USHORT TextTracePartitionSize = 260;
+#endif
+
+char TaskName [ RESOURCE_NAMELEN ];
+
+#else /* RUN_INT_RAM */
+extern USHORT TestInterface;
+extern USHORT NextTimerEntry;
+extern USHORT NumberOfStartedTasks;
+extern USHORT NumberOfRunningTasks;
+extern USHORT TooManyTasks;
+extern char TaskName[];
+extern T_HANDLE int_data_pool_handle;
+extern T_HANDLE ext_data_pool_handle;
+#endif /* RUN_INT_RAM */
+
+#ifdef _TOOLS_
+#pragma data_seg()
+#endif
+
+#ifdef _ESF_SUPPORT_
+int esf_init_func2_ready = FALSE;
+int firstTime = TRUE;
+#endif
+
+/* -------------- S H A R E D - END ---------------- */
+
+
+/*==== PROTOTYPES =================================================*/
+
+GLOBAL void pf_TaskEntry (T_HANDLE TaskHandle, ULONG Value );
+LOCAL SHORT pf_HandleMessage (T_HANDLE TaskHandle, OS_QDATA *pMsg );
+LOCAL LONG pf_CreateTask ( const T_COMPONENT_ADDRESS *Comp );
+LOCAL void pf_ProcessProtocolPrim ( T_HANDLE TaskHandle, T_VOID_STRUCT *pPrim);
+LOCAL void pf_Reset (T_HANDLE TaskHandle);
+int is_entity_in_task (T_HANDLE t_handle, char *name );
+int int_vsi_o_ttrace ( T_HANDLE Caller, ULONG TraceClass, const char * const format, va_list varpars );
+
+#ifndef _TOOLS_
+GLOBAL void InitializeApplication ( void );
+#endif
+
+/*==== LINT =======================================================*/
+
+/*lint -e522 suppress Warning -- Expected void type, assignment, increment or decrement */
+
+/*==== FUNCTIONS ==================================================*/
+
+#ifdef _TOOLS_
+/*
++------------------------------------------------------------------------------
+|  Function     :  pf_get_frameenv
++------------------------------------------------------------------------------
+|  Description  :  This function returns the current value of FrameEnv
+|
+|  Parameters   :  void
+|
+|  Return       :  FrameEnv
++------------------------------------------------------------------------------
+*/
+USHORT pf_get_frameenv (void)
+{
+  return (USHORT) FrameEnv;
+}
+
+#endif /* _TOOLS_ */
+
+#ifndef _TOOLS_
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)             MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : StartFrame          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Start the frame 
+
+*/
+SHORT StartFrame ( void )
+{
+  prf_init();
+  pf_Init(NULL);
+  pf_CreateAllEntities();
+#ifdef _ESF_SUPPORT_
+  esf_init();
+  esf_init_func1(); 
+#endif
+  pf_StartAllTasks ();
+  return ( PF_OK );
+}
+#endif
+#endif /* ndef _TOOLS_ */
+
+#if defined (_LINUX_) || (defined _SOLARIS_)
+int main ()
+{
+  (void) StartFrame ();
+  for (;;)
+  {
+    os_SuspendTask (0, 1500);
+  }
+}
+#endif
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)             MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : is_entity_in_task   |
++--------------------------------------------------------------------+
+
+  PURPOSE : Initialize the frame 
+
+*/
+int is_entity_in_task ( T_HANDLE t_handle, char *name )
+{
+int i;
+
+  for ( i = MaxEntities; i > 0; i-- )
+  {
+    if ( pf_TaskTable[i].TaskHandle == t_handle )
+    {
+      if ( !strncmp (pf_TaskTable[i].Name, name, RESOURCE_NAMELEN-1) )
+        return TRUE;
+    }
+  }
+  return FALSE;
+}
+#endif
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)             MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : pf_Init             |
++--------------------------------------------------------------------+
+
+  PURPOSE : Initialize the frame 
+
+*/
+
+/*lint -esym(715,ConfigAddress) only needed for _TOOLS_*/
+GLOBAL void pf_Init ( T_CONFIGURATION_ADDRESS *ConfigAddress)
+{
+#ifndef _TOOLS_
+const T_FRM_PARTITION_POOL_CONFIG * pool_config;
+USHORT i = 1,j = 0;
+#endif
+
+#if defined _NUCLEUS_ && !defined _TARGET_ || defined (_LINUX_)
+  printf ("FRAME VERSION: %s, %s\n",frame_version_date, frame_version_time);
+  printf ("MISC VERSION:  %s, %s\n",misc_version_date,  misc_version_time);
+  printf ("TIF VERSION:   %s, %s\n\n",tif_version_date, tif_version_time);
+#endif
+  if ( os_Initialize() == OS_ERROR )
+  {
+    vsi_o_assert ( 0, OS_SYST_ERR, __FILE__, __LINE__, "OS initialization error" );
+  }
+  
+  time_is_tdma_frame = 0;
+  TestInterface = 0;
+  NextTimerEntry = 0;
+#ifdef _TOOLS_
+  ComponentTables[RCV_ADR] = ConfigAddress->RcvAdr; 
+  ComponentTables[TST_ADR] = ConfigAddress->TstAdr; 
+  ComponentTables[END_OF_COMP_TABLE] = NULL; 
+  DriverConfigList = ConfigAddress->DrvListAdr;
+  InitFunc = ConfigAddress->InitFuncAdr;
+  FrameEnv = *ConfigAddress->FrameEnvAdr;
+#else
+  DriverConfigList = &DrvList[0];
+#endif
+
+#ifndef _TOOLS_
+
+  
+  j = 0;
+  /*
+   * create memory pools
+   */
+  while ( memory_pool_config[j].Name != NULL )
+  {
+    if ( memory_pool_config[j].Size > 1 )
+      os_CreateMemoryPool ( NO_TASK, 
+                          memory_pool_config[j].Name, 
+                          memory_pool_config[j].PoolAddress, 
+                          memory_pool_config[j].Size, 
+                          (OS_HANDLE*)MemoryPoolHandle[j] );                    
+    j++;
+  }
+
+#ifdef _NUCLEUS_
+  os_SetPoolHandles (ext_data_pool_handle, int_data_pool_handle);
+#endif
+
+  /*
+   * create partition pools
+   */
+
+  for ( i = 0; partition_grp_config[i].name != NULL; i++ )
+  {
+#ifdef MEMORY_SUPERVISION      
+//    if ( strcmp ("TEST", partition_grp_config[i].name ) )
+//    {
+      /* currently all created groups are counted to ease offset calculation for
+         partition supervision */
+      NumOfPPMGroups++;
+//    }
+#endif
+    pool_config = partition_grp_config[i].grp_config;
+    while ( pool_config->part_size && pool_config->part_num )
+    {
+      os_CreatePartitionPool ( NO_TASK, 
+                               partition_grp_config[i].name, 
+                               pool_config->mem, 
+                               (USHORT)pool_config->part_num,
+                               pool_config->part_size, 
+                               (OS_HANDLE*)PoolGroupHandle[i] );   
+#ifdef MEMORY_SUPERVISION 
+	  /* TEST pool not under partition supervision */
+      if ( strcmp ("TEST", partition_grp_config[i].name ) )
+      {
+        NumOfPPMPools++;
+        NumberOfPPMPartitions += pool_config->part_num;
+      }
+#endif
+      if ( !strcmp ("PRIM", partition_grp_config[i].name ) )
+      {
+        if ( MaxPrimPartSize < pool_config->part_size )
+        {
+          MaxPrimPartSize = pool_config->part_size;
+        }
+#ifdef MEMORY_SUPERVISION
+        NumOfPrimPools++;
+#endif
+      }
+#ifdef MEMORY_SUPERVISION
+      if ( !strcmp ("DMEM", partition_grp_config[i].name ) )
+      {
+        NumOfDmemPools++;
+      }
+#endif
+      pool_config++;
+    }
+  }
+
+#endif
+  /* 
+   * To allow CCD (TaskHandle = 0) the usage of dynamic Memory to create a semaphore
+   * the MemPoolHandle for non-task users is initialized with the handle of the int_data_pool
+   * pool.
+   */
+  pf_TaskTable[0].MemPoolHandle = int_data_pool_handle;
+  strcpy ( pf_TaskTable[0].Name, "IRQ" );
+
+  rt_Init();
+#ifdef _TOOLS_
+  (InitFunc)();
+#else
+  InitializeApplication();
+#endif
+#ifdef MEMORY_SUPERVISION
+  InitializePPM();
+#endif /* MEMORY_SUPERVISION */
+
+  InitializeTimer();
+  InitializeDriverConfig();
+#if !defined _TARGET_ && !defined _TOOLS_
+  vsi_pcheck_init(); 
+#endif
+#ifndef _TOOLS_
+  fei_lemu_SendToQueue_init();
+#endif
+  /* 
+  not needed -> temporarily removed 
+  vsi_c_init_com_matrix (MaxEntities);
+  */
+}
+#endif
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)             MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : pf_CreateAllEntities|
++--------------------------------------------------------------------+
+*/
+GLOBAL SHORT pf_CreateAllEntities (void)
+{
+int i = 0;
+
+  while ( ComponentTables[i] != NULL )
+  {
+    pf_CreateTask ( ComponentTables[i] );
+    i++;
+  }
+  InitializeTrace();
+  return PF_OK;
+}
+#endif
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)             MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : pf_CreateEntity     |
++--------------------------------------------------------------------+
+*/
+LOCAL LONG pf_CreateTask ( const T_COMPONENT_ADDRESS *Comp )
+{
+T_PEI_INFO const *Info;
+T_HANDLE TaskHandle;
+T_HANDLE mem_pool_handle = ext_data_pool_handle;
+int Priority = 0;
+ULONG StackSize = 0;
+const T_PEI_FUNC *PeiTable;
+USHORT     QueueEntries = 0;
+USHORT   	 NumOfTimers = 0;
+U32      Flags;
+char *Name = NULL;
+static int e_handle = 1;
+int start_e_handle;
+int i;
+
+  start_e_handle = e_handle;
+  while ( Comp->PeiCreate || Comp->Name )
+  {
+    if ( e_handle > MaxEntities )
+    {
+      vsi_o_assert ( 0, OS_SYST_ERR, __FILE__, __LINE__, "More than MAX_ENTITIES" );
+    }
+    if (  Comp->PeiCreate && Comp->PeiCreate ( &Info ) == PEI_OK )
+    {
+      if ( Comp->Priority != ASSIGNED_BY_TI )
+      {
+        if ( Priority < Comp->Priority )
+          Priority = Comp->Priority;
+      }
+      else
+      {
+        if ( Priority < Info->Priority )
+          Priority = Info->Priority;
+      }
+      Flags = Info->Flags;
+      PeiTable = &Info->PeiTable;
+      Name = (char*)Info->Name;
+      if ( StackSize < Info->StackSize )
+        StackSize = Info->StackSize;
+      pf_TaskTable[e_handle].QueueEntries = Info->QueueEntries;
+      NumOfTimers = Info->NumOfTimers;
+    }
+    else if ( Comp->Name && strlen (Comp->Name) <= RESOURCE_NAMELEN )
+    {
+      Flags = DummyInfo.Flags;
+      PeiTable = &DummyInfo.PeiTable;
+      Name = Comp->Name;
+      if ( StackSize < DummyInfo.StackSize )
+        StackSize = DummyInfo.StackSize;
+      if ( Priority < DummyInfo.Priority )
+        Priority = DummyInfo.Priority;
+      pf_TaskTable[e_handle].QueueEntries = DummyInfo.QueueEntries;
+      NumOfTimers = DummyInfo.NumOfTimers;
+    }
+    else
+      return PF_ERROR;
+
+    if ( QueueEntries < pf_TaskTable[e_handle].QueueEntries )
+      QueueEntries = pf_TaskTable[e_handle].QueueEntries;
+
+    pf_TaskTable[e_handle].Flags = Flags;
+    pf_TaskTable[e_handle].PeiTable = PeiTable;
+    pf_TaskTable[e_handle].NumOfTimers = NumOfTimers;
+    strncpy (pf_TaskTable[e_handle].Name, Name, RESOURCE_NAMELEN);
+    pf_TaskTable[e_handle].Name[RESOURCE_NAMELEN-1] = 0;
+    if ( pf_TaskTable[e_handle].Flags & INT_DATA_TASK )
+    {
+      pf_TaskTable[e_handle].MemPoolHandle = int_data_pool_handle;
+      mem_pool_handle = int_data_pool_handle;
+    }
+    else
+    {
+      pf_TaskTable[e_handle].MemPoolHandle = ext_data_pool_handle;
+      mem_pool_handle = ext_data_pool_handle;
+    }
+    prf_log_entity_create ((void*)e_handle, Name);
+    e_handle++;
+    Comp++;
+  }
+  if ( e_handle > start_e_handle + 1 )
+    Name = (char*)Comp->Priority;
+
+#ifdef MEMORY_SUPERVISION
+  StackSize = StackSize + (StackSize>>3);
+#endif
+  if ( os_CreateTask (NO_TASK, Name, pf_TaskEntry, StackSize, (USHORT)Priority, &TaskHandle, 
+                      mem_pool_handle) == OS_OK )
+  {
+    for ( i = start_e_handle; i < e_handle; i++ )
+    {
+      pf_TaskTable[i].TaskHandle = TaskHandle;
+    }
+    return PF_OK;
+  }
+  else
+    vsi_o_assert ( NO_TASK, OS_SYST_ERR, __FILE__, __LINE__, "Error at creating %s Task", Name );  
+  /*lint +e771 */
+
+  return PF_ERROR;
+}
+#endif
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)             MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : pf_StartAllTasks    |
++--------------------------------------------------------------------+
+*/
+GLOBAL SHORT pf_StartAllTasks ( void )
+{
+int e_handle;
+int t_handle;
+int started_t_handle = 0;
+
+  for ( e_handle = 1; e_handle <= MaxEntities; e_handle++ )
+  {
+    if ( pf_TaskTable[e_handle].Name[0] != 0 )
+    {
+      if ( (t_handle = pf_TaskTable[e_handle].TaskHandle) != started_t_handle )
+      {
+        if ( os_StartTask ( NO_TASK, t_handle, 0 ) == OS_ERROR)
+          return OS_ERROR;
+        NumberOfStartedTasks++;
+        started_t_handle = t_handle;
+      }
+    }
+  }
+  return OS_OK;
+}
+#endif
+
+
+#ifndef RUN_FLASH
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)             MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : pf_TaskEntry        |
++--------------------------------------------------------------------+
+*/
+/*lint -esym(715,Value) suppress Info -- Symbol 'Value' not referenced */
+GLOBAL void pf_TaskEntry (T_HANDLE TaskHandle, ULONG Value )
+{
+OS_QDATA Msg;
+OS_HANDLE mem_pool_handle = ext_data_pool_handle;
+LONG sts;
+int i;
+int queue_entries;
+int queue_handle;
+int biggest_queue_size = 0;
+int sum_queue_size = 0;
+U32 entity_flags = 0;
+#ifndef _TOOLS_
+char queue_name [ RESOURCE_NAMELEN ];
+#endif
+static int entity_init_fail_cnt = 0;
+
+#ifdef _ESF_SUPPORT_
+  {
+    /* OS timer should not be started at this point, otherwise risk of
+       race condition.
+       Furthermore, ESF THIF socket interface can't be used by task tst 
+       before esf_init_func2() is completed. 
+     */
+
+    T_HANDLE esf_init_func2_sem;
+    T_HANDLE caller;
+
+    caller = e_running[os_MyHandle()];
+    esf_init_func2_sem = vsi_s_open (caller, "esf_init_func2_sem", 1);
+
+    vsi_s_get (caller, esf_init_func2_sem);      /* start of critical section */
+    if (firstTime)
+    {
+      firstTime = FALSE;
+      esf_init_func2();
+      esf_init_func2_ready = TRUE; 
+    }
+    vsi_s_release(caller, esf_init_func2_sem); /* end of critical section */
+
+    while (!esf_init_func2_ready)
+    {
+      os_SuspendTask(caller, 100);
+    }
+  }
+#endif
+
+  if ( is_entity_in_task ( TaskHandle, FRM_TST_NAME ) == FALSE
+    && is_entity_in_task ( TaskHandle, FRM_RCV_NAME ) == FALSE )
+  {
+    while ( !(TestInterface & RUNNING) )
+    {
+      os_SuspendTask (TaskHandle, 100);
+    }
+  }
+
+  for ( i = MaxEntities; i > 0; i-- )
+  {
+    if ( pf_TaskTable[i].TaskHandle == TaskHandle )
+    {
+      if ( pf_TaskTable[i].Flags & ADD_QUEUE_SIZES )
+      {
+        entity_flags |= ADD_QUEUE_SIZES;
+      }
+      sum_queue_size += pf_TaskTable[i].QueueEntries;
+      if ( biggest_queue_size < pf_TaskTable[i].QueueEntries )
+      {
+        biggest_queue_size = pf_TaskTable[i].QueueEntries;
+      }
+      if ( pf_TaskTable[i].Flags & INT_DATA_TASK )
+        mem_pool_handle = int_data_pool_handle;
+    }
+  }
+
+  /* set queue size depending on the flag exported by the entities */
+  if ( entity_flags & ADD_QUEUE_SIZES )
+  {
+    queue_entries = sum_queue_size;
+  }
+  else
+  {
+    queue_entries = biggest_queue_size;
+  }
+
+#ifdef _TOOLS_
+  if ( os_CreateQueue ( TaskHandle, 0, pf_TaskTable[TaskHandle].Name, (USHORT)queue_entries, &queue_handle,
+                        pf_TaskTable[TaskHandle].MemPoolHandle) == OS_ERROR )
+  {
+    vsi_o_assert ( NO_TASK, OS_SYST_ERR_QUEUE_CREATE, __FILE__, __LINE__, 
+                   "Error at creating %s Queue", pf_TaskTable[TaskHandle].Name ); 
+  }
+#else
+  os_GetTaskName ( TaskHandle, TaskHandle, queue_name );
+  if ( os_CreateQueue ( TaskHandle, 0, queue_name, (USHORT)queue_entries, &queue_handle, mem_pool_handle) == OS_ERROR )
+  {
+    vsi_o_assert ( NO_TASK, OS_SYST_ERR_QUEUE_CREATE, __FILE__, __LINE__, "Error at creating %s Queue", queue_name ); 
+  }
+#endif
+
+  for ( i = MaxEntities; i > 0; i-- )
+  {
+    if ( pf_TaskTable[i].TaskHandle == TaskHandle )
+    {
+      pf_TaskTable[i].QueueHandle = queue_handle;
+      pf_TaskTable[i].FirstTimerEntry = &TimerHandleField [ NextTimerEntry ];
+      if ( (NextTimerEntry += pf_TaskTable[i].NumOfTimers) >= MaxTimer )
+        vsi_o_assert ( NO_TASK, OS_SYST_ERR_MAX_TIMER, __FILE__, __LINE__, 
+                       "Number of Timers > MAX_TIMER" );  
+    }
+  }
+
+  for ( i = MaxEntities; i > 0; i-- )
+  {
+    if ( pf_TaskTable[i].TaskHandle == TaskHandle )
+    {
+      if (pf_TaskTable[i].PeiTable->pei_init != NULL)
+      {
+        e_running[TaskHandle] = i;
+        while (pf_TaskTable[i].PeiTable->pei_init (i) == PEI_ERROR)
+        {
+          if ( entity_init_fail_cnt++ > (NumberOfStartedTasks * 5) )
+            vsi_o_ttrace(NO_TASK, TC_SYSTEM, "%s pei_init() failed",pf_TaskTable[i].Name );
+		      os_SuspendTask (TaskHandle, 100);
+        }
+        e_running[TaskHandle] = 0;
+      }
+    }
+  }
+
+  if ( is_entity_in_task ( TaskHandle, FRM_TST_NAME ) == TRUE ) 
+    TestInterface |= RUNNING;
+
+
+  if ( ++NumberOfRunningTasks == NumberOfStartedTasks )
+  {
+    if ( TooManyTasks )
+      vsi_o_assert (NO_TASK, OS_SYST_ERR_MAX_TASK, __FILE__, __LINE__, "Number of entities > MAX_ENTITIES" );  
+    vsi_o_ttrace(NO_TASK, TC_SYSTEM, "All tasks entered main loop" );
+#if defined _NUCLEUS_ && !defined _TARGET_
+    printf ("%s\n","All tasks entered main loop");
+#endif
+#ifdef _TARGET_
+    TraceMask[0] = 0;
+    os_dar_set_filter();
+#endif
+  }
+  for ( i = MaxEntities; i > 0; i-- )
+  {
+    if ( pf_TaskTable[i].TaskHandle == TaskHandle )
+    {
+      if (pf_TaskTable[i].PeiTable->pei_run != NULL)
+      {
+        if ( !(pf_TaskTable[i].Flags & PASSIVE_BODY) )
+        {
+            /*
+             * in the active body variant call pei_run
+             */
+            e_running[TaskHandle] = i;
+            pf_TaskTable[i].PeiTable->pei_run (TaskHandle, pf_TaskTable[i].QueueHandle );
+#ifdef _TOOLS_
+            pf_TaskTable[i].PeiTable->pei_exit();
+            NextTimerEntry -= pf_TaskTable[i].NumOfTimers;
+            rt_RoutingModify ( TaskHandle, (char*)SYSPRIM_REDIRECT_TOKEN, (char*)SYSPRIM_CLEAR_TOKEN );
+            os_DestroyQueue ( TaskHandle, pf_TaskTable[i].QueueHandle );
+            e_running[TaskHandle] = 0;
+            os_DestroyTask ( TaskHandle, TaskHandle );
+#endif
+            e_running[TaskHandle] = 0;
+            for (;;)
+              os_SuspendTask(TaskHandle,10000);
+        }
+      }
+    }
+  }
+
+  /*
+   * in the passive body variant wait for a message and
+   * handle it
+   */
+  for ( i = MaxEntities; i > 0; i-- )
+  {
+    if ( pf_TaskTable[i].TaskHandle == TaskHandle )
+    {
+      break;
+    }
+  }
+  for (;;)
+  {
+    sts = os_ReceiveFromQueue ( TaskHandle, pf_TaskTable[i].QueueHandle,
+                                &Msg, OS_SUSPEND );
+    switch ( sts )
+    {
+      case OS_OK:
+#if defined (_TOOLS_) || defined (_LINUX_)
+           e_running[TaskHandle] = TaskHandle;
+           pf_HandleMessage (TaskHandle, &Msg);
+#else
+           e_running[TaskHandle] = Msg.e_id;
+           prf_log_entity_activate ((void*)Msg.e_id);
+           pf_HandleMessage (Msg.e_id, &Msg);
+#endif
+           e_running[TaskHandle] = 0;
+#ifdef _NUCLEUS_ 
+           if ( os_CheckTaskStack ( TaskHandle ) == OS_ERROR )
+           {
+             os_GetTaskName ( TaskHandle, TaskHandle, TaskName );
+             vsi_o_assert ( TaskHandle, OS_SYST_ERR_STACK_OVERFLOW, __FILE__, __LINE__, 
+                            "%s Stack overflow", TaskName );
+           }
+#endif
+      break;
+      case OS_TIMEOUT:
+      break;
+      case OS_ERROR:
+           for(;;)
+             os_SuspendTask(TaskHandle,10000);
+      /*lint -e527, suppress Warning -- Unreachable */
+      break;
+      default:
+           for(;;)
+             os_SuspendTask(TaskHandle,10000);
+      break;
+      /*lint +e527 */
+
+    }
+  }
+}
+#endif
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)             MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : pf_Timeout          |
++--------------------------------------------------------------------+
+*/
+GLOBAL void pf_Timeout (T_HANDLE TaskHandle, T_HANDLE EntityHandle, USHORT TimerIndex )
+{
+OS_QDATA TimeoutMsg;
+
+  TimeoutMsg.data16 = MSG_TIMEOUT;
+  TimeoutMsg.data32 = (ULONG)TimerIndex;
+#ifdef _TOOLS_
+  TimeoutMsg.len = 0;
+#endif
+  TimeoutMsg.e_id = EntityHandle;
+  os_GetTime ( 0, &TimeoutMsg.time );
+    
+  *(pf_TaskTable[EntityHandle].FirstTimerEntry + TimerIndex) |= TIMEOUT_OCCURRED;
+
+#ifdef _TOOLS_
+  if ( rt_Route (TaskHandle, pf_TaskTable[EntityHandle].QueueHandle, OS_NORMAL, OS_SUSPEND, 
+    &TimeoutMsg ) == OS_TIMEOUT )
+#else
+  if ( rt_Route (TaskHandle, EntityHandle, OS_NORMAL, OS_SUSPEND, 
+    &TimeoutMsg ) == OS_TIMEOUT )
+#endif
+      vsi_o_assert ( 0, OS_SYST_ERR_QUEUE_FULL, __FILE__, __LINE__, 
+                     "Timeout write attempt to %s queue failed", pf_TaskTable[EntityHandle].Name );
+}
+#endif
+
+#ifndef RUN_FLASH
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)             MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : pf_HandleMessage    |
++--------------------------------------------------------------------+
+*/
+LOCAL SHORT pf_HandleMessage (T_HANDLE TaskHandle, OS_QDATA *pMsg )
+{
+ULONG PrimId = 0; 
+
+  switch (pMsg->data16)
+  {
+    case MSG_PRIMITIVE:
+      if ( pMsg->ptr != NULL )
+      {
+        PrimId = ((T_PRIM_HEADER*)(pMsg->ptr))->opc;
+
+        if ( PrimId & SYS_MASK )
+        {
+          pf_ProcessSystemPrim ( TaskHandle, pMsg->ptr );
+        }
+        else
+        {
+          pf_ProcessProtocolPrim ( TaskHandle, pMsg->ptr );
+        }
+      }
+    break;
+    case MSG_SIGNAL:
+      if ( pf_TaskTable[TaskHandle].PeiTable->pei_signal != NULL )
+      {
+        pf_TaskTable[TaskHandle].PeiTable->pei_signal ( pMsg->data32, pMsg->ptr ); 
+      }
+    break;
+    case MSG_TIMEOUT:
+      if ( *(pf_TaskTable[TaskHandle].FirstTimerEntry + pMsg->data32) & TIMEOUT_OCCURRED )
+      {
+        if ( !(*(pf_TaskTable[TaskHandle].FirstTimerEntry + pMsg->data32) & PERIODIC_TIMER) )
+        {
+          os_DestroyTimer ( TaskHandle, (OS_HANDLE)(*(pf_TaskTable[TaskHandle].FirstTimerEntry + pMsg->data32) & TIMER_HANDLE_MASK) );
+          *(pf_TaskTable[TaskHandle].FirstTimerEntry + pMsg->data32) = 0;
+        }
+        else
+        {
+          *(pf_TaskTable[TaskHandle].FirstTimerEntry + pMsg->data32) &= ~TIMEOUT_OCCURRED;
+        }
+        vsi_o_ttrace ( TaskHandle, TC_TIMER, "Timeout   : Index %d",pMsg->data32) ;
+        if ( pf_TaskTable[TaskHandle].PeiTable->pei_timeout != NULL )
+          pf_TaskTable[TaskHandle].PeiTable->pei_timeout ( (USHORT)pMsg->data32 ); 
+      }
+    break;
+    default:
+      VSI_PPM_FREE(pMsg->ptr);
+      os_DeallocatePartition (TaskHandle, pMsg->ptr-PPM_OFFSET );
+      return PF_ERROR;
+    /*lint -e527, suppress Warning -- Unreachable */
+    break;
+    /*lint +e527 */
+  }
+  return PF_OK;
+}
+#endif
+
+#ifndef RUN_FLASH
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)           MODULE  : FRAME                 |
+| STATE   : code                     ROUTINE : pf_ProcessProtocolPrim|
++--------------------------------------------------------------------+
+*/
+LOCAL void pf_ProcessProtocolPrim ( T_HANDLE TaskHandle, T_VOID_STRUCT *pPrim)
+{
+
+  if ( TaskHandle != NO_TASK )
+  {
+    if (pf_TaskTable[TaskHandle].PeiTable->pei_primitive != NULL)
+    {
+#ifdef PRIM_AUTO_FREE
+      if ( pf_TaskTable[TaskHandle].Flags & PARTITION_AUTO_FREE )
+      {
+        /* 
+         * TST uses its own partition pool and is handled differently 
+         */
+        if ( TaskHandle != TST_Handle )
+        {
+          processed_prim[TaskHandle] = pPrim;
+          freed_prim[TaskHandle] = NULL;
+        }
+      }
+#endif /* PRIM_AUTO_FREE */
+#ifdef MEMORY_SUPERVISION
+      if ( TaskHandle != TST_Handle ) /* Trace pools are not monitored by PPM */ 
+        VSI_PPM_RCV(pPrim);
+#endif
+      pf_TaskTable[TaskHandle].PeiTable->pei_primitive (pPrim);
+
+#ifdef PRIM_AUTO_FREE
+      if ( pf_TaskTable[TaskHandle].Flags & PARTITION_AUTO_FREE )
+      {
+        /*
+         * if PSTORE was called during the primitive processing, PFREE was no longer
+         * blocked inside the entity and it could have happened that a primitive  
+         * was freed and then newly allocated either by the same or by a different
+         * entity (IRQ). To avoid auto free it is checked if an effective free was
+         * done with the pointer passed to pei_primitive(). In this case the 
+         * partition is not freed.
+         */
+        if ( freed_prim[TaskHandle] == pPrim )
+        {
+          freed_prim[TaskHandle] = NULL;
+          return;
+        }
+        else
+        {
+          processed_prim[TaskHandle] = NULL;
+
+          if ( pPrim != NULL ) 
+          {
+            FREE ( P2D(pPrim) );
+          }
+          return;
+        }
+      }
+      else
+#endif /* PRIM_AUTO_FREE */
+        return;
+    }
+  }
+  if ( pPrim != NULL)
+  {
+#ifndef _TARGET_
+    vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "Primitive discarded in dummy entity %s, opc 0x%x",
+                   pf_TaskTable[TaskHandle].Name, ((T_PRIM_HEADER*)pPrim)->opc );
+#endif
+    VSI_PPM_RCV(pPrim);
+    FREE ( P2D(pPrim) );
+  }
+}
+#endif
+ 
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)           MODULE  : FRAME                 |
+| STATE   : code                     ROUTINE : pf_ProcessSystemPrim  |
++--------------------------------------------------------------------+
+*/ 
+GLOBAL void pf_ProcessSystemPrim ( T_HANDLE TaskHandle, T_VOID_STRUCT *pPrim)
+{
+char * data;
+/*lint -e813, suppress Info 813: auto variable 'token' has size '132' -> uncritical in this context */
+char token[TRACE_TEXT_SIZE];
+/*lint +e813 */
+BOOL Error = FALSE;
+LONG i;
+unsigned int Length;
+T_HANDLE min, max;
+char TraceMaskBuffer[9];
+ULONG trace_mask;
+LONG state;
+#ifdef _TOOLS_
+T_S_HEADER *s_hdr;
+#endif
+
+  VSI_PPM_RCV(pPrim);
+
+  data = (char *)P2D( pPrim );
+
+  Length = GetNextToken (data, token, " #");
+
+  if (!strcmp (token, SYSPRIM_REDIRECT_TOKEN)
+   OR !strcmp (token, SYSPRIM_DUPLICATE_TOKEN))
+  {
+
+    if (TaskHandle NEQ NO_TASK)
+    {
+      /*
+       * Redirect or Duplicate primitives
+       */
+      if ( (state = rt_RoutingModify (TaskHandle, token, data+strlen(token)+1)) != RT_OK )
+      {
+#ifdef NU_DEBUG
+        switch ( state )
+        {
+          case RT_NO_MEM:
+            vsi_o_ttrace(NO_TASK, TC_SYSTEM, "SYSTEM WARNING: Out of Memory - routing command rejected");
+            VSI_PPM_FREE(pPrim);
+            os_DeallocatePartition (TaskHandle, pPrim-PPM_OFFSET );
+            return;
+            /*lint -e527, suppress Warning -- Unreachable */
+            break;
+            /*lint +e527 */
+		      case RT_ERROR: Error = TRUE;
+            break;
+        }
+#else
+        Error = TRUE;
+#endif
+      }
+    }
+  }
+  else if ( !strcmp ( token, SYSPRIM_TRACECLASS_TOKEN) )
+  {
+    if ( Length < strlen(data)-1 )
+    {
+      GetNextToken (data+Length+1, token, " #");
+      trace_mask = ASCIIToHex(token, CHARS_FOR_32BIT);
+      if ( TaskHandle == TST_Handle )
+      {
+        min = 1;
+        max = MaxEntities;
+      }
+      else
+      {
+        min = TaskHandle;
+        max = TaskHandle;
+      }
+      for ( i = min; i <= max; i++ )
+      {
+        if ( vsi_settracemask ( TaskHandle, i, trace_mask) == VSI_ERROR )
+          break;
+      }
+    }
+    else
+    {
+      vsi_gettracemask ( TaskHandle, TaskHandle, &trace_mask);
+      HexToASCII ( trace_mask, TraceMaskBuffer, CHARS_FOR_32BIT );
+      TraceMaskBuffer[8] = 0;
+      sprintf ( data, "%s %s %s", pf_TaskTable[TaskHandle].Name, SYSPRIM_TRACECLASS_TOKEN, TraceMaskBuffer );
+      vsi_o_ttrace ( NO_TASK, TC_SYSTEM, data );
+    }
+  }
+  else if (!strcmp (token, SYSPRIM_CONFIG_TOKEN))
+  {
+    /*
+     * Dynamic Configuration
+     */
+    if (TaskHandle != NO_TASK)
+    {
+      /*
+       * call the pei_config function of the entity
+       */
+      if (pf_TaskTable[TaskHandle].PeiTable->pei_config NEQ NULL)
+        if ( pf_TaskTable[TaskHandle].PeiTable->pei_config ( data+strlen (token)+1 ) == PEI_ERROR )
+          Error = TRUE;
+    }
+  }
+#if 0
+  /* not needed -> temporarily removed */
+  else if (!strcmp (token, SYSPRIM_ISOLATE_TOKEN))
+  {
+    if ( rt_isolate_entity (TaskHandle, data+strlen(token)+1) == RT_ERROR )
+      Error = TRUE;
+  }
+#endif
+  else if (!strcmp (token, SYSPRIM_REGISTER_ERR_IND))
+  {
+    strncpy ( error_ind_dst, data+strlen(token)+1, RESOURCE_NAMELEN );
+    error_ind_dst[RESOURCE_NAMELEN-1] = 0;
+    if ( frm_error_ind == NULL )
+    {
+      frm_error_ind = (T_FRM_ERROR_IND*)vsi_c_pnew (sizeof(T_FRM_ERROR_IND), FRM_ERROR_IND FILE_LINE_MACRO );
+    }
+  }
+  else if (!strcmp (token, SYSPRIM_WITHDRAW_ERR_IND))
+  {
+    if ( frm_error_ind != NULL )
+    {
+      error_ind_dst[0] = 0;
+      vsi_c_pfree( (T_VOID_STRUCT**)&frm_error_ind FILE_LINE_MACRO );
+      frm_error_ind = NULL;
+    }
+  }
+  else if (!strcmp (token, SYSPRIM_STATUS_TOKEN))
+  {
+    GetNextToken (data+strlen(token)+1, token, " #");
+    VSI_PPM_FREE(pPrim);
+    os_DeallocatePartition (TaskHandle, pPrim-PPM_OFFSET );
+    i = 0;
+    while ( Resource[i].Name && strcmp ( Resource[i].Name, token ) )
+      i++;
+    if ( vsi_object_info (TaskHandle, Resource[i].Id, FIRST_ENTRY, token, sizeof(token)) == VSI_OK )       
+    {
+      vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token ); 
+      while ( vsi_object_info (TaskHandle, Resource[i].Id, NEXT_ENTRY, token, sizeof(token)) == VSI_OK )
+      {
+        vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token ); 
+      }
+    }
+    return;
+  }
+#if 0
+  else if (!strcmp (token, SYSPRIM_READ_COM_MATRIX))
+  {
+    state = vsi_c_get_com_matrix_entry ( FIRST_ENTRY, token );
+    if ( state == VSI_OK )
+    {
+      vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token ); 
+      do
+      {
+        if ( (state = vsi_c_get_com_matrix_entry ( NEXT_ENTRY, token)) == VSI_OK )
+          vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token ); 
+      } while ( state == VSI_OK );
+    }
+  }
+#endif
+#ifdef _TARGET_
+  else if (!strcmp (token, SYSPRIM_READ_FFS_DAR))
+  {
+    state = os_read_dar_ffs_data ( FIRST_ENTRY, token, TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER) - 1 );
+    if ( state == OS_OK )
+    {
+      vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token ); 
+      do
+      {
+        if ( (state = os_read_dar_ffs_data ( NEXT_ENTRY, token, TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER) - 1)) == OS_OK )
+          vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token ); 
+      } while ( state == OS_OK );
+    }
+    else
+      vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "No DAR entry stored" ); 
+
+  }
+#endif
+#if !defined _TARGET_ && !defined _TOOLS_
+  else if (!strcmp (token, SYSPRIM_PCHECK))
+  {
+    pcheck_active[TaskHandle] = TRUE;
+  }
+#endif
+  else if (!strcmp (token, SYSPRIM_ROUTE_DESCLIST))
+  {
+    route_desclist[TaskHandle] = TRUE;
+  }
+  else if (!strcmp (token, SYSPRIM_CHECK_DESCLIST))
+  {
+    check_desclist = TRUE;
+  }
+#ifdef _NUCLEUS_
+  else if (!strcmp (token, SYSPRIM_VERSION_TOKEN))
+  {
+    vsi_o_ttrace (NO_TASK, TC_SYSTEM,"FRAME VERSION: %s, %s",frame_version_date, frame_version_time);
+    vsi_o_ttrace (NO_TASK, TC_SYSTEM,"MISC VERSION:  %s, %s",misc_version_date,  misc_version_time);
+    vsi_o_ttrace (NO_TASK, TC_SYSTEM,"TIF VERSION:   %s, %s",tif_version_date,   tif_version_time);
+  }
+#endif
+  else if (!strcmp (token, SYSPRIM_RESET_TOKEN))
+  {
+    /*
+     * Reset
+     */
+    pf_Reset (TaskHandle);
+  }
+#ifdef _TOOLS_
+  else if (!strcmp (token, SYSPRIM_EXIT_TOKEN))
+  {
+    /*
+     * Exit and delete
+     */
+    if (pf_TaskTable[TaskHandle].PeiTable->pei_exit != NULL)
+    {
+      pf_TaskTable[TaskHandle].PeiTable->pei_exit();
+    }
+    VSI_PPM_FREE(pPrim);
+    os_DeallocatePartition (TaskHandle, pPrim-PPM_OFFSET );
+    vsi_p_delete(0,TaskHandle);
+  }
+#endif /* _TOOLS_ */
+#ifdef MEMORY_SUPERVISION
+  else if (!strcmp (token, SYSPRIM_CHECK_OWNER))
+  {
+    ppm_check_partition_owner = 1;
+  }
+  else if (!strcmp (token, SYSPRIM_SHOW_MEMORY))
+  {
+    /*
+     * Show state of the partition pool monitor
+     */
+    VSI_PPM_FREE(pPrim);
+    os_DeallocatePartition (TaskHandle, pPrim-PPM_OFFSET );
+    TracePoolstatus (TaskHandle);
+    return;
+  }
+#endif /* MEMORY_SUPERVISION */    
+#ifndef _TOOLS_  
+  else if (!strcmp (token, SYSPRIM_SELECT_TIME_TDMA))
+  {
+    time_is_tdma_frame = 1;
+  }
+#endif
+#ifdef _TOOLS_
+  else if (!strcmp (token, SYSPRIM_IS_STACK_TIME))
+  {
+    s_hdr = P_SHDR(pPrim);
+    set_stack_time (s_hdr->time);
+  }
+  else if (!strcmp (token, SYSPRIM_REGISTER_TOKEN))
+  {
+    OS_HANDLE comhandle;
+    GetNextToken (data+strlen(token)+1, token, " #");
+    if (os_create_extq (token, &comhandle) == OS_OK)
+    {
+      if (!strcmp (token, FRM_PCO_NAME))
+      {
+        vsi_o_set_htrace (comhandle);
+      }
+    }
+    else
+      Error = TRUE;
+  }
+  else if (!strcmp (token, SYSPRIM_WITHDRAW_TOKEN))
+  {
+    GetNextToken (data+strlen(token)+1, token, " #");
+    if (os_destroy_extq (token) == OS_OK)
+    {
+      if (!strcmp (token, FRM_PCO_NAME))
+      {
+        vsi_o_set_htrace (0);
+      }
+    }
+    else
+      Error = TRUE;
+  }
+#endif /* _TOOLS_ */
+  else
+    Error = TRUE;
+
+  if ( Error )
+  {
+    vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "SYSTEM WARNING:Invalid system primitive '%s'",data );
+  }
+  else
+  {
+    if ( !SuppressOK )
+    {
+      vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "OK (%s %s)", pf_TaskTable[TaskHandle].Name, data );
+    }
+  }
+  VSI_PPM_FREE(pPrim);
+  os_DeallocatePartition (TaskHandle, pPrim-PPM_OFFSET );
+}
+#endif
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-GPF (8415)             MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : pf_Reset            |
++--------------------------------------------------------------------+
+*/
+LOCAL void pf_Reset (T_HANDLE TaskHandle)
+{
+  if (TaskHandle != NO_TASK)
+  {
+    if (pf_TaskTable[TaskHandle].PeiTable->pei_exit != NULL)
+      pf_TaskTable[TaskHandle].PeiTable->pei_exit();
+    /* 
+     * reset a single entity
+     */
+    if (pf_TaskTable[TaskHandle].PeiTable->pei_init != NULL)
+      while (pf_TaskTable[TaskHandle].PeiTable->pei_init(TaskHandle) == PEI_ERROR)
+        os_SuspendTask ( TaskHandle, 5);
+  }
+  else
+  {
+    USHORT Handle;
+    /*
+     * reset all entities
+     */
+    for (Handle = 1; Handle <= MaxEntities; Handle++)
+    {
+      if (pf_TaskTable[TaskHandle].PeiTable->pei_exit != NULL)
+        pf_TaskTable[TaskHandle].PeiTable->pei_exit();
+
+      if (pf_TaskTable[Handle].PeiTable->pei_init != NULL)
+        while (pf_TaskTable[TaskHandle].PeiTable->pei_init(TaskHandle) == PEI_ERROR)
+          os_SuspendTask ( TaskHandle, 5);
+    }
+  }
+}
+#endif
+
+#ifdef _TOOLS_
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : set_stack_time      |
++--------------------------------------------------------------------+
+
+  PURPOSE : stores the local time of stack under test. Used to align 
+            timestamps while tracing.
+
+*/
+void set_stack_time ( ULONG time )
+{
+  init_stack_time = time;
+  os_GetTime ( NO_TASK, &init_local_time );
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : get_stack_time      |
++--------------------------------------------------------------------+
+
+  PURPOSE : returns the local time of stack under test. Used to align 
+            timestamps while tracing.
+
+*/
+void get_local_time ( ULONG *time )
+{
+OS_TIME current_local_time;
+
+ os_GetTime ( NO_TASK, &current_local_time );
+ *time = init_stack_time + current_local_time - init_local_time;
+}
+
+#endif
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-Frame (8415)           MODULE  : FRAME               |
+| STATE   : code                       ROUTINE : pf_handle_error     |
++--------------------------------------------------------------------+
+
+  PURPOSE : frame error and warning handling
+
+*/
+/*lint -e506, suppress Warning 506: Constant value Boolean */
+/*lint -e718, suppress nfo 718: Symbol '_va_argref' undeclared, assumed to return int */
+int pf_handle_warning ( USHORT cause, const char * const format,...)
+{
+T_HANDLE caller;
+va_list varpars;
+static int recursion_count = 0;
+USHORT free;
+USHORT alloc;
+
+  /* recursion counter is needed to avoid endless loop when generating warning during processing of warning */
+  if ( recursion_count == 0 )
+  {
+    recursion_count++;
+    caller = e_running[os_MyHandle()];
+    va_start (varpars, format);              
+    int_vsi_o_ttrace ( NO_TASK, TC_SYSTEM, format, varpars );
+
+    if ( error_ind_dst[0] != 0 )
+    {
+      /* drop the warning, if there are fewer than 3 partitions available to avoid deadlock */
+      vsi_m_status ( caller, sizeof(T_FRM_WARNING_IND)+sizeof(T_PRIM_HEADER), PrimGroupHandle, &free, &alloc );
+      if ( free >= 3 )
+      {
+        PALLOC(frm_warning_ind,FRM_WARNING_IND);
+        frm_warning_ind->warning_code = cause;
+#ifdef _TARGET_
+        /* We will destroy the partition guard pattern if the warning is longer than the warning string in FRM_WARNING_IND */
+        vsprintf ((char*)frm_warning_ind->warning_string, format, varpars);
+#else
+#if defined(_LINUX_) || defined(_SOLARIS_)
+        vsnprintf ((char*)frm_warning_ind->warning_string,
+                     sizeof(frm_warning_ind->warning_string), format, varpars);
+#else
+        _vsnprintf ((char*)frm_warning_ind->warning_string, sizeof(frm_warning_ind->warning_string), format, varpars);
+#endif
+#endif
+        vsi_o_primsend ( caller, TC_SYSTEM, 0, error_ind_dst, (unsigned int)FRM_WARNING_IND, frm_warning_ind, sizeof(T_FRM_WARNING_IND) FILE_LINE_MACRO );
+      }
+      else
+      {
+        vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "FRM_WARNING_IND dropped" );
+      }
+    }
+#if defined _NUCLEUS_ && !defined _TARGET_
+    vsprintf (TraceBuffer, format, varpars);
+    printf ("%s\n",TraceBuffer);
+#endif
+#ifdef _NUCLEUS_
+    os_SystemError ( os_MyHandle(), cause, NULL );
+#endif
+    recursion_count--;
+  }
+  return VSI_OK;
+}
+/*lint +e718 */
+/*lint +e506 */
+
+#endif
+
+