comparison gpf/frame/frame.c @ 0:75a11d740a02

initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 09 Jun 2016 00:02:41 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:75a11d740a02
1 /*
2 +------------------------------------------------------------------------------
3 | File: frame.c
4 +------------------------------------------------------------------------------
5 | Copyright 2002 Texas Instruments Berlin, AG
6 | All rights reserved.
7 |
8 | This file is confidential and a trade secret of Texas
9 | Instruments Berlin, AG
10 | The receipt of or possession of this file does not convey
11 | any rights to reproduce or disclose its contents or to
12 | manufacture, use, or sell anything it may describe, in
13 | whole, or in part, without the specific written consent of
14 | Texas Instruments Berlin, AG.
15 +-----------------------------------------------------------------------------
16 | Purpose : This Modul defines the general frame functionality.
17 +-----------------------------------------------------------------------------
18 */
19
20
21 #ifndef __FRAME_C__
22 #define __FRAME_C__
23 #endif
24
25 /*==== INCLUDES ===================================================*/
26
27 #include <stdarg.h>
28 #include <string.h>
29 #include <stdio.h>
30
31 #include "gpfconf.h"
32 #include "typedefs.h"
33
34 #include "glob_defs.h"
35 #include "os.h"
36 #include "vsi.h"
37 #include "pei.h"
38 #include "frame.h"
39 #include "tools.h"
40 #include "gdi.h"
41 #include "frm_defs.h"
42 #include "frm_types.h"
43 #include "frm_glob.h"
44 #include "route.h"
45 #include "p_frame.h"
46 #include "prf_func.h"
47 #ifdef _ESF_SUPPORT_
48 #include "esf_func.h"
49 #endif
50 #include "frm_ext.h"
51
52 /*==== TYPES ======================================================*/
53
54 typedef struct
55 {
56 char const *Name;
57 USHORT Id;
58 } T_NAME_ID;
59
60 /*==== CONSTANTS ==================================================*/
61
62 #define RUNNING 0x01
63 #undef VSI_CALLER
64 #define VSI_CALLER TaskHandle,
65
66 /*==== EXTERNALS ==================================================*/
67 /* -------------- S H A R E D - BEGIN ---------------- */
68 #ifdef _TOOLS_
69 #pragma data_seg("FRAME_SHARED")
70 #endif
71
72 #if defined _NUCLEUS_ && !defined _TARGET_
73 extern char TraceBuffer[];
74 #endif
75
76 #ifndef _TOOLS_
77 extern const T_MEMORY_POOL_CONFIG memory_pool_config[];
78 extern const T_FRM_PARTITION_GROUP_CONFIG partition_grp_config[];
79 extern T_HANDLE MemoryPoolHandle[];
80 extern OS_HANDLE PoolGroupHandle[];
81 extern const T_DRV_LIST DrvList[];
82 #ifdef MEMORY_SUPERVISION
83 extern USHORT NumberOfPPMPartitions;
84 extern USHORT NumOfPPMPools;
85 extern USHORT NumOfPPMGroups;
86 extern USHORT NumOfPrimPools;
87 extern USHORT NumOfDmemPools;
88 #endif
89 #endif
90
91 extern T_DRV_LIST const *DriverConfigList;
92
93 #ifndef _TOOLS_
94 extern const T_COMPONENT_ADDRESS *ComponentTables[];
95 extern const char * const frame_version_date;
96 extern const char * const frame_version_time;
97 extern const char * const misc_version_date;
98 extern const char * const misc_version_time;
99 extern const char * const tif_version_date;
100 extern const char * const tif_version_time;
101 #endif
102
103 #ifdef _TOOLS_
104 __declspec (dllimport) T_HANDLE TST_Handle;
105 #else
106 extern T_HANDLE TST_Handle;
107 #endif
108
109 #ifdef MEMORY_SUPERVISION
110 extern int ppm_check_partition_owner;
111 #endif
112
113 /*==== VARIABLES ==================================================*/
114
115 #ifndef RUN_INT_RAM
116 UBYTE SuppressOK=1;
117 GLOBAL T_HANDLE MemPoolHandle;
118 GLOBAL T_HANDLE PrimGroupHandle;
119 GLOBAL T_HANDLE DmemGroupHandle;
120 GLOBAL T_HANDLE TestGroupHandle;
121 GLOBAL T_HANDLE LemuGroupHandle;
122 GLOBAL T_HANDLE int_data_pool_handle;
123 GLOBAL T_HANDLE ext_data_pool_handle;
124 GLOBAL UBYTE FrameEnv=0;
125 GLOBAL USHORT TestInterface = 0;
126 GLOBAL USHORT NextTimerEntry = 0;
127 int time_is_tdma_frame;
128 char error_ind_dst[RESOURCE_NAMELEN] = {0};
129 T_FRM_ERROR_IND *frm_error_ind = NULL;
130 char check_desclist = FALSE;
131 GLOBAL USHORT NumberOfStartedTasks = 0;
132 GLOBAL USHORT NumberOfRunningTasks = 0;
133 GLOBAL USHORT TooManyTasks = 0;
134
135 const T_PEI_INFO DummyInfo =
136 {
137 "", /* Name */
138 {
139 NULL,
140 NULL,
141 NULL,
142 NULL,
143 NULL,
144 NULL,
145 NULL,
146 NULL
147 },
148 768, /* stack size */
149 10, /* queue entries */
150 1, /* priority */
151 0, /* number of timers */
152 COPY_BY_REF /* Flags */
153 };
154
155 const T_NAME_ID Resource[] =
156 {
157 { "TASK", OS_OBJTASK},
158 { "QUEUE", OS_OBJQUEUE},
159 { "TIMER", OS_OBJTIMER },
160 { "SEMAPHORE", OS_OBJSEMAPHORE},
161 { "PARTITION", OS_OBJPARTITIONGROUP},
162 { "MEMORY", OS_OBJMEMORYPOOL},
163 { NULL, 0 }
164 };
165
166 #ifdef _TOOLS_
167 LOCAL T_COMPONENT_ADDRESS *ComponentTables [NUM_OF_COMPONENT_TABLES+1]={0};
168 typedef void T_INIT_FUNC ( void );
169 T_INIT_FUNC *InitFunc;
170 ULONG init_stack_time = 0;
171 ULONG init_local_time = 0;
172 ULONG MaxPrimPartSize = 65536;
173 USHORT TextTracePartitionSize = 260;
174 #endif
175
176 char TaskName [ RESOURCE_NAMELEN ];
177
178 #else /* RUN_INT_RAM */
179 extern USHORT TestInterface;
180 extern USHORT NextTimerEntry;
181 extern USHORT NumberOfStartedTasks;
182 extern USHORT NumberOfRunningTasks;
183 extern USHORT TooManyTasks;
184 extern char TaskName[];
185 extern T_HANDLE int_data_pool_handle;
186 extern T_HANDLE ext_data_pool_handle;
187 #endif /* RUN_INT_RAM */
188
189 #ifdef _TOOLS_
190 #pragma data_seg()
191 #endif
192
193 #ifdef _ESF_SUPPORT_
194 int esf_init_func2_ready = FALSE;
195 int firstTime = TRUE;
196 #endif
197
198 /* -------------- S H A R E D - END ---------------- */
199
200
201 /*==== PROTOTYPES =================================================*/
202
203 GLOBAL void pf_TaskEntry (T_HANDLE TaskHandle, ULONG Value );
204 LOCAL SHORT pf_HandleMessage (T_HANDLE TaskHandle, OS_QDATA *pMsg );
205 LOCAL LONG pf_CreateTask ( const T_COMPONENT_ADDRESS *Comp );
206 LOCAL void pf_ProcessProtocolPrim ( T_HANDLE TaskHandle, T_VOID_STRUCT *pPrim);
207 LOCAL void pf_Reset (T_HANDLE TaskHandle);
208 int is_entity_in_task (T_HANDLE t_handle, char *name );
209 int int_vsi_o_ttrace ( T_HANDLE Caller, ULONG TraceClass, const char * const format, va_list varpars );
210
211 #ifndef _TOOLS_
212 GLOBAL void InitializeApplication ( void );
213 #endif
214
215 /*==== LINT =======================================================*/
216
217 /*lint -e522 suppress Warning -- Expected void type, assignment, increment or decrement */
218
219 /*==== FUNCTIONS ==================================================*/
220
221 #ifdef _TOOLS_
222 /*
223 +------------------------------------------------------------------------------
224 | Function : pf_get_frameenv
225 +------------------------------------------------------------------------------
226 | Description : This function returns the current value of FrameEnv
227 |
228 | Parameters : void
229 |
230 | Return : FrameEnv
231 +------------------------------------------------------------------------------
232 */
233 USHORT pf_get_frameenv (void)
234 {
235 return (USHORT) FrameEnv;
236 }
237
238 #endif /* _TOOLS_ */
239
240 #ifndef _TOOLS_
241 #ifndef RUN_INT_RAM
242 /*
243 +--------------------------------------------------------------------+
244 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
245 | STATE : code ROUTINE : StartFrame |
246 +--------------------------------------------------------------------+
247
248 PURPOSE : Start the frame
249
250 */
251 SHORT StartFrame ( void )
252 {
253 prf_init();
254 pf_Init(NULL);
255 pf_CreateAllEntities();
256 #ifdef _ESF_SUPPORT_
257 esf_init();
258 esf_init_func1();
259 #endif
260 pf_StartAllTasks ();
261 return ( PF_OK );
262 }
263 #endif
264 #endif /* ndef _TOOLS_ */
265
266 #if defined (_LINUX_) || (defined _SOLARIS_)
267 int main ()
268 {
269 (void) StartFrame ();
270 for (;;)
271 {
272 os_SuspendTask (0, 1500);
273 }
274 }
275 #endif
276
277 #ifndef RUN_INT_RAM
278 /*
279 +--------------------------------------------------------------------+
280 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
281 | STATE : code ROUTINE : is_entity_in_task |
282 +--------------------------------------------------------------------+
283
284 PURPOSE : Initialize the frame
285
286 */
287 int is_entity_in_task ( T_HANDLE t_handle, char *name )
288 {
289 int i;
290
291 for ( i = MaxEntities; i > 0; i-- )
292 {
293 if ( pf_TaskTable[i].TaskHandle == t_handle )
294 {
295 if ( !strncmp (pf_TaskTable[i].Name, name, RESOURCE_NAMELEN-1) )
296 return TRUE;
297 }
298 }
299 return FALSE;
300 }
301 #endif
302
303 #ifndef RUN_INT_RAM
304 /*
305 +--------------------------------------------------------------------+
306 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
307 | STATE : code ROUTINE : pf_Init |
308 +--------------------------------------------------------------------+
309
310 PURPOSE : Initialize the frame
311
312 */
313
314 /*lint -esym(715,ConfigAddress) only needed for _TOOLS_*/
315 GLOBAL void pf_Init ( T_CONFIGURATION_ADDRESS *ConfigAddress)
316 {
317 #ifndef _TOOLS_
318 const T_FRM_PARTITION_POOL_CONFIG * pool_config;
319 USHORT i = 1,j = 0;
320 #endif
321
322 #if defined _NUCLEUS_ && !defined _TARGET_ || defined (_LINUX_)
323 printf ("FRAME VERSION: %s, %s\n",frame_version_date, frame_version_time);
324 printf ("MISC VERSION: %s, %s\n",misc_version_date, misc_version_time);
325 printf ("TIF VERSION: %s, %s\n\n",tif_version_date, tif_version_time);
326 #endif
327 if ( os_Initialize() == OS_ERROR )
328 {
329 vsi_o_assert ( 0, OS_SYST_ERR, __FILE__, __LINE__, "OS initialization error" );
330 }
331
332 time_is_tdma_frame = 0;
333 TestInterface = 0;
334 NextTimerEntry = 0;
335 #ifdef _TOOLS_
336 ComponentTables[RCV_ADR] = ConfigAddress->RcvAdr;
337 ComponentTables[TST_ADR] = ConfigAddress->TstAdr;
338 ComponentTables[END_OF_COMP_TABLE] = NULL;
339 DriverConfigList = ConfigAddress->DrvListAdr;
340 InitFunc = ConfigAddress->InitFuncAdr;
341 FrameEnv = *ConfigAddress->FrameEnvAdr;
342 #else
343 DriverConfigList = &DrvList[0];
344 #endif
345
346 #ifndef _TOOLS_
347
348
349 j = 0;
350 /*
351 * create memory pools
352 */
353 while ( memory_pool_config[j].Name != NULL )
354 {
355 if ( memory_pool_config[j].Size > 1 )
356 os_CreateMemoryPool ( NO_TASK,
357 memory_pool_config[j].Name,
358 memory_pool_config[j].PoolAddress,
359 memory_pool_config[j].Size,
360 (OS_HANDLE*)MemoryPoolHandle[j] );
361 j++;
362 }
363
364 #ifdef _NUCLEUS_
365 os_SetPoolHandles (ext_data_pool_handle, int_data_pool_handle);
366 #endif
367
368 /*
369 * create partition pools
370 */
371
372 for ( i = 0; partition_grp_config[i].name != NULL; i++ )
373 {
374 #ifdef MEMORY_SUPERVISION
375 // if ( strcmp ("TEST", partition_grp_config[i].name ) )
376 // {
377 /* currently all created groups are counted to ease offset calculation for
378 partition supervision */
379 NumOfPPMGroups++;
380 // }
381 #endif
382 pool_config = partition_grp_config[i].grp_config;
383 while ( pool_config->part_size && pool_config->part_num )
384 {
385 os_CreatePartitionPool ( NO_TASK,
386 partition_grp_config[i].name,
387 pool_config->mem,
388 (USHORT)pool_config->part_num,
389 pool_config->part_size,
390 (OS_HANDLE*)PoolGroupHandle[i] );
391 #ifdef MEMORY_SUPERVISION
392 /* TEST pool not under partition supervision */
393 if ( strcmp ("TEST", partition_grp_config[i].name ) )
394 {
395 NumOfPPMPools++;
396 NumberOfPPMPartitions += pool_config->part_num;
397 }
398 #endif
399 if ( !strcmp ("PRIM", partition_grp_config[i].name ) )
400 {
401 if ( MaxPrimPartSize < pool_config->part_size )
402 {
403 MaxPrimPartSize = pool_config->part_size;
404 }
405 #ifdef MEMORY_SUPERVISION
406 NumOfPrimPools++;
407 #endif
408 }
409 #ifdef MEMORY_SUPERVISION
410 if ( !strcmp ("DMEM", partition_grp_config[i].name ) )
411 {
412 NumOfDmemPools++;
413 }
414 #endif
415 pool_config++;
416 }
417 }
418
419 #endif
420 /*
421 * To allow CCD (TaskHandle = 0) the usage of dynamic Memory to create a semaphore
422 * the MemPoolHandle for non-task users is initialized with the handle of the int_data_pool
423 * pool.
424 */
425 pf_TaskTable[0].MemPoolHandle = int_data_pool_handle;
426 strcpy ( pf_TaskTable[0].Name, "IRQ" );
427
428 rt_Init();
429 #ifdef _TOOLS_
430 (InitFunc)();
431 #else
432 InitializeApplication();
433 #endif
434 #ifdef MEMORY_SUPERVISION
435 InitializePPM();
436 #endif /* MEMORY_SUPERVISION */
437
438 InitializeTimer();
439 InitializeDriverConfig();
440 #if !defined _TARGET_ && !defined _TOOLS_
441 vsi_pcheck_init();
442 #endif
443 #ifndef _TOOLS_
444 fei_lemu_SendToQueue_init();
445 #endif
446 /*
447 not needed -> temporarily removed
448 vsi_c_init_com_matrix (MaxEntities);
449 */
450 }
451 #endif
452
453 #ifndef RUN_INT_RAM
454 /*
455 +--------------------------------------------------------------------+
456 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
457 | STATE : code ROUTINE : pf_CreateAllEntities|
458 +--------------------------------------------------------------------+
459 */
460 GLOBAL SHORT pf_CreateAllEntities (void)
461 {
462 int i = 0;
463
464 while ( ComponentTables[i] != NULL )
465 {
466 pf_CreateTask ( ComponentTables[i] );
467 i++;
468 }
469 InitializeTrace();
470 return PF_OK;
471 }
472 #endif
473 #ifndef RUN_INT_RAM
474 /*
475 +--------------------------------------------------------------------+
476 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
477 | STATE : code ROUTINE : pf_CreateEntity |
478 +--------------------------------------------------------------------+
479 */
480 LOCAL LONG pf_CreateTask ( const T_COMPONENT_ADDRESS *Comp )
481 {
482 T_PEI_INFO const *Info;
483 T_HANDLE TaskHandle;
484 T_HANDLE mem_pool_handle = ext_data_pool_handle;
485 int Priority = 0;
486 ULONG StackSize = 0;
487 const T_PEI_FUNC *PeiTable;
488 USHORT QueueEntries = 0;
489 USHORT NumOfTimers = 0;
490 U32 Flags;
491 char *Name = NULL;
492 static int e_handle = 1;
493 int start_e_handle;
494 int i;
495
496 start_e_handle = e_handle;
497 while ( Comp->PeiCreate || Comp->Name )
498 {
499 if ( e_handle > MaxEntities )
500 {
501 vsi_o_assert ( 0, OS_SYST_ERR, __FILE__, __LINE__, "More than MAX_ENTITIES" );
502 }
503 if ( Comp->PeiCreate && Comp->PeiCreate ( &Info ) == PEI_OK )
504 {
505 if ( Comp->Priority != ASSIGNED_BY_TI )
506 {
507 if ( Priority < Comp->Priority )
508 Priority = Comp->Priority;
509 }
510 else
511 {
512 if ( Priority < Info->Priority )
513 Priority = Info->Priority;
514 }
515 Flags = Info->Flags;
516 PeiTable = &Info->PeiTable;
517 Name = (char*)Info->Name;
518 if ( StackSize < Info->StackSize )
519 StackSize = Info->StackSize;
520 pf_TaskTable[e_handle].QueueEntries = Info->QueueEntries;
521 NumOfTimers = Info->NumOfTimers;
522 }
523 else if ( Comp->Name && strlen (Comp->Name) <= RESOURCE_NAMELEN )
524 {
525 Flags = DummyInfo.Flags;
526 PeiTable = &DummyInfo.PeiTable;
527 Name = Comp->Name;
528 if ( StackSize < DummyInfo.StackSize )
529 StackSize = DummyInfo.StackSize;
530 if ( Priority < DummyInfo.Priority )
531 Priority = DummyInfo.Priority;
532 pf_TaskTable[e_handle].QueueEntries = DummyInfo.QueueEntries;
533 NumOfTimers = DummyInfo.NumOfTimers;
534 }
535 else
536 return PF_ERROR;
537
538 if ( QueueEntries < pf_TaskTable[e_handle].QueueEntries )
539 QueueEntries = pf_TaskTable[e_handle].QueueEntries;
540
541 pf_TaskTable[e_handle].Flags = Flags;
542 pf_TaskTable[e_handle].PeiTable = PeiTable;
543 pf_TaskTable[e_handle].NumOfTimers = NumOfTimers;
544 strncpy (pf_TaskTable[e_handle].Name, Name, RESOURCE_NAMELEN);
545 pf_TaskTable[e_handle].Name[RESOURCE_NAMELEN-1] = 0;
546 if ( pf_TaskTable[e_handle].Flags & INT_DATA_TASK )
547 {
548 pf_TaskTable[e_handle].MemPoolHandle = int_data_pool_handle;
549 mem_pool_handle = int_data_pool_handle;
550 }
551 else
552 {
553 pf_TaskTable[e_handle].MemPoolHandle = ext_data_pool_handle;
554 mem_pool_handle = ext_data_pool_handle;
555 }
556 prf_log_entity_create ((void*)e_handle, Name);
557 e_handle++;
558 Comp++;
559 }
560 if ( e_handle > start_e_handle + 1 )
561 Name = (char*)Comp->Priority;
562
563 #ifdef MEMORY_SUPERVISION
564 StackSize = StackSize + (StackSize>>3);
565 #endif
566 if ( os_CreateTask (NO_TASK, Name, pf_TaskEntry, StackSize, (USHORT)Priority, &TaskHandle,
567 mem_pool_handle) == OS_OK )
568 {
569 for ( i = start_e_handle; i < e_handle; i++ )
570 {
571 pf_TaskTable[i].TaskHandle = TaskHandle;
572 }
573 return PF_OK;
574 }
575 else
576 vsi_o_assert ( NO_TASK, OS_SYST_ERR, __FILE__, __LINE__, "Error at creating %s Task", Name );
577 /*lint +e771 */
578
579 return PF_ERROR;
580 }
581 #endif
582
583 #ifndef RUN_INT_RAM
584 /*
585 +--------------------------------------------------------------------+
586 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
587 | STATE : code ROUTINE : pf_StartAllTasks |
588 +--------------------------------------------------------------------+
589 */
590 GLOBAL SHORT pf_StartAllTasks ( void )
591 {
592 int e_handle;
593 int t_handle;
594 int started_t_handle = 0;
595
596 for ( e_handle = 1; e_handle <= MaxEntities; e_handle++ )
597 {
598 if ( pf_TaskTable[e_handle].Name[0] != 0 )
599 {
600 if ( (t_handle = pf_TaskTable[e_handle].TaskHandle) != started_t_handle )
601 {
602 if ( os_StartTask ( NO_TASK, t_handle, 0 ) == OS_ERROR)
603 return OS_ERROR;
604 NumberOfStartedTasks++;
605 started_t_handle = t_handle;
606 }
607 }
608 }
609 return OS_OK;
610 }
611 #endif
612
613
614 #ifndef RUN_FLASH
615 /*
616 +--------------------------------------------------------------------+
617 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
618 | STATE : code ROUTINE : pf_TaskEntry |
619 +--------------------------------------------------------------------+
620 */
621 /*lint -esym(715,Value) suppress Info -- Symbol 'Value' not referenced */
622 GLOBAL void pf_TaskEntry (T_HANDLE TaskHandle, ULONG Value )
623 {
624 OS_QDATA Msg;
625 OS_HANDLE mem_pool_handle = ext_data_pool_handle;
626 LONG sts;
627 int i;
628 int queue_entries;
629 int queue_handle;
630 int biggest_queue_size = 0;
631 int sum_queue_size = 0;
632 U32 entity_flags = 0;
633 #ifndef _TOOLS_
634 char queue_name [ RESOURCE_NAMELEN ];
635 #endif
636 static int entity_init_fail_cnt = 0;
637
638 #ifdef _ESF_SUPPORT_
639 {
640 /* OS timer should not be started at this point, otherwise risk of
641 race condition.
642 Furthermore, ESF THIF socket interface can't be used by task tst
643 before esf_init_func2() is completed.
644 */
645
646 T_HANDLE esf_init_func2_sem;
647 T_HANDLE caller;
648
649 caller = e_running[os_MyHandle()];
650 esf_init_func2_sem = vsi_s_open (caller, "esf_init_func2_sem", 1);
651
652 vsi_s_get (caller, esf_init_func2_sem); /* start of critical section */
653 if (firstTime)
654 {
655 firstTime = FALSE;
656 esf_init_func2();
657 esf_init_func2_ready = TRUE;
658 }
659 vsi_s_release(caller, esf_init_func2_sem); /* end of critical section */
660
661 while (!esf_init_func2_ready)
662 {
663 os_SuspendTask(caller, 100);
664 }
665 }
666 #endif
667
668 if ( is_entity_in_task ( TaskHandle, FRM_TST_NAME ) == FALSE
669 && is_entity_in_task ( TaskHandle, FRM_RCV_NAME ) == FALSE )
670 {
671 while ( !(TestInterface & RUNNING) )
672 {
673 os_SuspendTask (TaskHandle, 100);
674 }
675 }
676
677 for ( i = MaxEntities; i > 0; i-- )
678 {
679 if ( pf_TaskTable[i].TaskHandle == TaskHandle )
680 {
681 if ( pf_TaskTable[i].Flags & ADD_QUEUE_SIZES )
682 {
683 entity_flags |= ADD_QUEUE_SIZES;
684 }
685 sum_queue_size += pf_TaskTable[i].QueueEntries;
686 if ( biggest_queue_size < pf_TaskTable[i].QueueEntries )
687 {
688 biggest_queue_size = pf_TaskTable[i].QueueEntries;
689 }
690 if ( pf_TaskTable[i].Flags & INT_DATA_TASK )
691 mem_pool_handle = int_data_pool_handle;
692 }
693 }
694
695 /* set queue size depending on the flag exported by the entities */
696 if ( entity_flags & ADD_QUEUE_SIZES )
697 {
698 queue_entries = sum_queue_size;
699 }
700 else
701 {
702 queue_entries = biggest_queue_size;
703 }
704
705 #ifdef _TOOLS_
706 if ( os_CreateQueue ( TaskHandle, 0, pf_TaskTable[TaskHandle].Name, (USHORT)queue_entries, &queue_handle,
707 pf_TaskTable[TaskHandle].MemPoolHandle) == OS_ERROR )
708 {
709 vsi_o_assert ( NO_TASK, OS_SYST_ERR_QUEUE_CREATE, __FILE__, __LINE__,
710 "Error at creating %s Queue", pf_TaskTable[TaskHandle].Name );
711 }
712 #else
713 os_GetTaskName ( TaskHandle, TaskHandle, queue_name );
714 if ( os_CreateQueue ( TaskHandle, 0, queue_name, (USHORT)queue_entries, &queue_handle, mem_pool_handle) == OS_ERROR )
715 {
716 vsi_o_assert ( NO_TASK, OS_SYST_ERR_QUEUE_CREATE, __FILE__, __LINE__, "Error at creating %s Queue", queue_name );
717 }
718 #endif
719
720 for ( i = MaxEntities; i > 0; i-- )
721 {
722 if ( pf_TaskTable[i].TaskHandle == TaskHandle )
723 {
724 pf_TaskTable[i].QueueHandle = queue_handle;
725 pf_TaskTable[i].FirstTimerEntry = &TimerHandleField [ NextTimerEntry ];
726 if ( (NextTimerEntry += pf_TaskTable[i].NumOfTimers) >= MaxTimer )
727 vsi_o_assert ( NO_TASK, OS_SYST_ERR_MAX_TIMER, __FILE__, __LINE__,
728 "Number of Timers > MAX_TIMER" );
729 }
730 }
731
732 for ( i = MaxEntities; i > 0; i-- )
733 {
734 if ( pf_TaskTable[i].TaskHandle == TaskHandle )
735 {
736 if (pf_TaskTable[i].PeiTable->pei_init != NULL)
737 {
738 e_running[TaskHandle] = i;
739 while (pf_TaskTable[i].PeiTable->pei_init (i) == PEI_ERROR)
740 {
741 if ( entity_init_fail_cnt++ > (NumberOfStartedTasks * 5) )
742 vsi_o_ttrace(NO_TASK, TC_SYSTEM, "%s pei_init() failed",pf_TaskTable[i].Name );
743 os_SuspendTask (TaskHandle, 100);
744 }
745 e_running[TaskHandle] = 0;
746 }
747 }
748 }
749
750 if ( is_entity_in_task ( TaskHandle, FRM_TST_NAME ) == TRUE )
751 TestInterface |= RUNNING;
752
753
754 if ( ++NumberOfRunningTasks == NumberOfStartedTasks )
755 {
756 if ( TooManyTasks )
757 vsi_o_assert (NO_TASK, OS_SYST_ERR_MAX_TASK, __FILE__, __LINE__, "Number of entities > MAX_ENTITIES" );
758 vsi_o_ttrace(NO_TASK, TC_SYSTEM, "All tasks entered main loop" );
759 #if defined _NUCLEUS_ && !defined _TARGET_
760 printf ("%s\n","All tasks entered main loop");
761 #endif
762 #ifdef _TARGET_
763 // TraceMask[0] = 0; // removed in FreeCalypso - Space Falcon
764 os_dar_set_filter();
765 #endif
766 }
767 for ( i = MaxEntities; i > 0; i-- )
768 {
769 if ( pf_TaskTable[i].TaskHandle == TaskHandle )
770 {
771 if (pf_TaskTable[i].PeiTable->pei_run != NULL)
772 {
773 if ( !(pf_TaskTable[i].Flags & PASSIVE_BODY) )
774 {
775 /*
776 * in the active body variant call pei_run
777 */
778 e_running[TaskHandle] = i;
779 pf_TaskTable[i].PeiTable->pei_run (TaskHandle, pf_TaskTable[i].QueueHandle );
780 #ifdef _TOOLS_
781 pf_TaskTable[i].PeiTable->pei_exit();
782 NextTimerEntry -= pf_TaskTable[i].NumOfTimers;
783 rt_RoutingModify ( TaskHandle, (char*)SYSPRIM_REDIRECT_TOKEN, (char*)SYSPRIM_CLEAR_TOKEN );
784 os_DestroyQueue ( TaskHandle, pf_TaskTable[i].QueueHandle );
785 e_running[TaskHandle] = 0;
786 os_DestroyTask ( TaskHandle, TaskHandle );
787 #endif
788 e_running[TaskHandle] = 0;
789 for (;;)
790 os_SuspendTask(TaskHandle,10000);
791 }
792 }
793 }
794 }
795
796 /*
797 * in the passive body variant wait for a message and
798 * handle it
799 */
800 for ( i = MaxEntities; i > 0; i-- )
801 {
802 if ( pf_TaskTable[i].TaskHandle == TaskHandle )
803 {
804 break;
805 }
806 }
807 for (;;)
808 {
809 sts = os_ReceiveFromQueue ( TaskHandle, pf_TaskTable[i].QueueHandle,
810 &Msg, OS_SUSPEND );
811 switch ( sts )
812 {
813 case OS_OK:
814 #if defined (_TOOLS_) || defined (_LINUX_)
815 e_running[TaskHandle] = TaskHandle;
816 pf_HandleMessage (TaskHandle, &Msg);
817 #else
818 e_running[TaskHandle] = Msg.e_id;
819 prf_log_entity_activate ((void*)Msg.e_id);
820 pf_HandleMessage (Msg.e_id, &Msg);
821 #endif
822 e_running[TaskHandle] = 0;
823 #ifdef _NUCLEUS_
824 if ( os_CheckTaskStack ( TaskHandle ) == OS_ERROR )
825 {
826 os_GetTaskName ( TaskHandle, TaskHandle, TaskName );
827 vsi_o_assert ( TaskHandle, OS_SYST_ERR_STACK_OVERFLOW, __FILE__, __LINE__,
828 "%s Stack overflow", TaskName );
829 }
830 #endif
831 break;
832 case OS_TIMEOUT:
833 break;
834 case OS_ERROR:
835 for(;;)
836 os_SuspendTask(TaskHandle,10000);
837 /*lint -e527, suppress Warning -- Unreachable */
838 break;
839 default:
840 for(;;)
841 os_SuspendTask(TaskHandle,10000);
842 break;
843 /*lint +e527 */
844
845 }
846 }
847 }
848 #endif
849
850 #ifndef RUN_INT_RAM
851 /*
852 +--------------------------------------------------------------------+
853 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
854 | STATE : code ROUTINE : pf_Timeout |
855 +--------------------------------------------------------------------+
856 */
857 GLOBAL void pf_Timeout (T_HANDLE TaskHandle, T_HANDLE EntityHandle, USHORT TimerIndex )
858 {
859 OS_QDATA TimeoutMsg;
860
861 TimeoutMsg.data16 = MSG_TIMEOUT;
862 TimeoutMsg.data32 = (ULONG)TimerIndex;
863 #ifdef _TOOLS_
864 TimeoutMsg.len = 0;
865 #endif
866 TimeoutMsg.e_id = EntityHandle;
867 os_GetTime ( 0, &TimeoutMsg.time );
868
869 *(pf_TaskTable[EntityHandle].FirstTimerEntry + TimerIndex) |= TIMEOUT_OCCURRED;
870
871 #ifdef _TOOLS_
872 if ( rt_Route (TaskHandle, pf_TaskTable[EntityHandle].QueueHandle, OS_NORMAL, OS_SUSPEND,
873 &TimeoutMsg ) == OS_TIMEOUT )
874 #else
875 if ( rt_Route (TaskHandle, EntityHandle, OS_NORMAL, OS_SUSPEND,
876 &TimeoutMsg ) == OS_TIMEOUT )
877 #endif
878 vsi_o_assert ( 0, OS_SYST_ERR_QUEUE_FULL, __FILE__, __LINE__,
879 "Timeout write attempt to %s queue failed", pf_TaskTable[EntityHandle].Name );
880 }
881 #endif
882
883 #ifndef RUN_FLASH
884 /*
885 +--------------------------------------------------------------------+
886 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
887 | STATE : code ROUTINE : pf_HandleMessage |
888 +--------------------------------------------------------------------+
889 */
890 LOCAL SHORT pf_HandleMessage (T_HANDLE TaskHandle, OS_QDATA *pMsg )
891 {
892 ULONG PrimId = 0;
893
894 switch (pMsg->data16)
895 {
896 case MSG_PRIMITIVE:
897 if ( pMsg->ptr != NULL )
898 {
899 PrimId = ((T_PRIM_HEADER*)(pMsg->ptr))->opc;
900
901 if ( PrimId & SYS_MASK )
902 {
903 pf_ProcessSystemPrim ( TaskHandle, pMsg->ptr );
904 }
905 else
906 {
907 pf_ProcessProtocolPrim ( TaskHandle, pMsg->ptr );
908 }
909 }
910 break;
911 case MSG_SIGNAL:
912 if ( pf_TaskTable[TaskHandle].PeiTable->pei_signal != NULL )
913 {
914 pf_TaskTable[TaskHandle].PeiTable->pei_signal ( pMsg->data32, pMsg->ptr );
915 }
916 break;
917 case MSG_TIMEOUT:
918 if ( *(pf_TaskTable[TaskHandle].FirstTimerEntry + pMsg->data32) & TIMEOUT_OCCURRED )
919 {
920 if ( !(*(pf_TaskTable[TaskHandle].FirstTimerEntry + pMsg->data32) & PERIODIC_TIMER) )
921 {
922 os_DestroyTimer ( TaskHandle, (OS_HANDLE)(*(pf_TaskTable[TaskHandle].FirstTimerEntry + pMsg->data32) & TIMER_HANDLE_MASK) );
923 *(pf_TaskTable[TaskHandle].FirstTimerEntry + pMsg->data32) = 0;
924 }
925 else
926 {
927 *(pf_TaskTable[TaskHandle].FirstTimerEntry + pMsg->data32) &= ~TIMEOUT_OCCURRED;
928 }
929 vsi_o_ttrace ( TaskHandle, TC_TIMER, "Timeout : Index %d",pMsg->data32) ;
930 if ( pf_TaskTable[TaskHandle].PeiTable->pei_timeout != NULL )
931 pf_TaskTable[TaskHandle].PeiTable->pei_timeout ( (USHORT)pMsg->data32 );
932 }
933 break;
934 default:
935 VSI_PPM_FREE(pMsg->ptr);
936 os_DeallocatePartition (TaskHandle, pMsg->ptr-PPM_OFFSET );
937 return PF_ERROR;
938 /*lint -e527, suppress Warning -- Unreachable */
939 break;
940 /*lint +e527 */
941 }
942 return PF_OK;
943 }
944 #endif
945
946 #ifndef RUN_FLASH
947 /*
948 +--------------------------------------------------------------------+
949 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
950 | STATE : code ROUTINE : pf_ProcessProtocolPrim|
951 +--------------------------------------------------------------------+
952 */
953 LOCAL void pf_ProcessProtocolPrim ( T_HANDLE TaskHandle, T_VOID_STRUCT *pPrim)
954 {
955
956 if ( TaskHandle != NO_TASK )
957 {
958 if (pf_TaskTable[TaskHandle].PeiTable->pei_primitive != NULL)
959 {
960 #ifdef PRIM_AUTO_FREE
961 if ( pf_TaskTable[TaskHandle].Flags & PARTITION_AUTO_FREE )
962 {
963 /*
964 * TST uses its own partition pool and is handled differently
965 */
966 if ( TaskHandle != TST_Handle )
967 {
968 processed_prim[TaskHandle] = pPrim;
969 freed_prim[TaskHandle] = NULL;
970 }
971 }
972 #endif /* PRIM_AUTO_FREE */
973 #ifdef MEMORY_SUPERVISION
974 if ( TaskHandle != TST_Handle ) /* Trace pools are not monitored by PPM */
975 VSI_PPM_RCV(pPrim);
976 #endif
977 pf_TaskTable[TaskHandle].PeiTable->pei_primitive (pPrim);
978
979 #ifdef PRIM_AUTO_FREE
980 if ( pf_TaskTable[TaskHandle].Flags & PARTITION_AUTO_FREE )
981 {
982 /*
983 * if PSTORE was called during the primitive processing, PFREE was no longer
984 * blocked inside the entity and it could have happened that a primitive
985 * was freed and then newly allocated either by the same or by a different
986 * entity (IRQ). To avoid auto free it is checked if an effective free was
987 * done with the pointer passed to pei_primitive(). In this case the
988 * partition is not freed.
989 */
990 if ( freed_prim[TaskHandle] == pPrim )
991 {
992 freed_prim[TaskHandle] = NULL;
993 return;
994 }
995 else
996 {
997 processed_prim[TaskHandle] = NULL;
998
999 if ( pPrim != NULL )
1000 {
1001 FREE ( P2D(pPrim) );
1002 }
1003 return;
1004 }
1005 }
1006 else
1007 #endif /* PRIM_AUTO_FREE */
1008 return;
1009 }
1010 }
1011 if ( pPrim != NULL)
1012 {
1013 #ifndef _TARGET_
1014 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "Primitive discarded in dummy entity %s, opc 0x%x",
1015 pf_TaskTable[TaskHandle].Name, ((T_PRIM_HEADER*)pPrim)->opc );
1016 #endif
1017 VSI_PPM_RCV(pPrim);
1018 FREE ( P2D(pPrim) );
1019 }
1020 }
1021 #endif
1022
1023 #ifndef RUN_INT_RAM
1024 /*
1025 +--------------------------------------------------------------------+
1026 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
1027 | STATE : code ROUTINE : pf_ProcessSystemPrim |
1028 +--------------------------------------------------------------------+
1029 */
1030 GLOBAL void pf_ProcessSystemPrim ( T_HANDLE TaskHandle, T_VOID_STRUCT *pPrim)
1031 {
1032 char * data;
1033 /*lint -e813, suppress Info 813: auto variable 'token' has size '132' -> uncritical in this context */
1034 char token[TRACE_TEXT_SIZE];
1035 /*lint +e813 */
1036 BOOL Error = FALSE;
1037 LONG i;
1038 unsigned int Length;
1039 T_HANDLE min, max;
1040 char TraceMaskBuffer[9];
1041 ULONG trace_mask;
1042 LONG state;
1043 #ifdef _TOOLS_
1044 T_S_HEADER *s_hdr;
1045 #endif
1046
1047 VSI_PPM_RCV(pPrim);
1048
1049 data = (char *)P2D( pPrim );
1050
1051 Length = GetNextToken (data, token, " #");
1052
1053 if (!strcmp (token, SYSPRIM_REDIRECT_TOKEN)
1054 OR !strcmp (token, SYSPRIM_DUPLICATE_TOKEN))
1055 {
1056
1057 if (TaskHandle NEQ NO_TASK)
1058 {
1059 /*
1060 * Redirect or Duplicate primitives
1061 */
1062 if ( (state = rt_RoutingModify (TaskHandle, token, data+strlen(token)+1)) != RT_OK )
1063 {
1064 #ifdef NU_DEBUG
1065 switch ( state )
1066 {
1067 case RT_NO_MEM:
1068 vsi_o_ttrace(NO_TASK, TC_SYSTEM, "SYSTEM WARNING: Out of Memory - routing command rejected");
1069 VSI_PPM_FREE(pPrim);
1070 os_DeallocatePartition (TaskHandle, pPrim-PPM_OFFSET );
1071 return;
1072 /*lint -e527, suppress Warning -- Unreachable */
1073 break;
1074 /*lint +e527 */
1075 case RT_ERROR: Error = TRUE;
1076 break;
1077 }
1078 #else
1079 Error = TRUE;
1080 #endif
1081 }
1082 }
1083 }
1084 else if ( !strcmp ( token, SYSPRIM_TRACECLASS_TOKEN) )
1085 {
1086 if ( Length < strlen(data)-1 )
1087 {
1088 GetNextToken (data+Length+1, token, " #");
1089 trace_mask = ASCIIToHex(token, CHARS_FOR_32BIT);
1090 if ( TaskHandle == TST_Handle )
1091 {
1092 min = 1;
1093 max = MaxEntities;
1094 }
1095 else
1096 {
1097 min = TaskHandle;
1098 max = TaskHandle;
1099 }
1100 for ( i = min; i <= max; i++ )
1101 {
1102 if ( vsi_settracemask ( TaskHandle, i, trace_mask) == VSI_ERROR )
1103 break;
1104 }
1105 }
1106 else
1107 {
1108 vsi_gettracemask ( TaskHandle, TaskHandle, &trace_mask);
1109 HexToASCII ( trace_mask, TraceMaskBuffer, CHARS_FOR_32BIT );
1110 TraceMaskBuffer[8] = 0;
1111 sprintf ( data, "%s %s %s", pf_TaskTable[TaskHandle].Name, SYSPRIM_TRACECLASS_TOKEN, TraceMaskBuffer );
1112 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, data );
1113 }
1114 }
1115 else if (!strcmp (token, SYSPRIM_CONFIG_TOKEN))
1116 {
1117 /*
1118 * Dynamic Configuration
1119 */
1120 if (TaskHandle != NO_TASK)
1121 {
1122 /*
1123 * call the pei_config function of the entity
1124 */
1125 if (pf_TaskTable[TaskHandle].PeiTable->pei_config NEQ NULL)
1126 if ( pf_TaskTable[TaskHandle].PeiTable->pei_config ( data+strlen (token)+1 ) == PEI_ERROR )
1127 Error = TRUE;
1128 }
1129 }
1130 #if 0
1131 /* not needed -> temporarily removed */
1132 else if (!strcmp (token, SYSPRIM_ISOLATE_TOKEN))
1133 {
1134 if ( rt_isolate_entity (TaskHandle, data+strlen(token)+1) == RT_ERROR )
1135 Error = TRUE;
1136 }
1137 #endif
1138 else if (!strcmp (token, SYSPRIM_REGISTER_ERR_IND))
1139 {
1140 strncpy ( error_ind_dst, data+strlen(token)+1, RESOURCE_NAMELEN );
1141 error_ind_dst[RESOURCE_NAMELEN-1] = 0;
1142 if ( frm_error_ind == NULL )
1143 {
1144 frm_error_ind = (T_FRM_ERROR_IND*)vsi_c_pnew (sizeof(T_FRM_ERROR_IND), FRM_ERROR_IND FILE_LINE_MACRO );
1145 }
1146 }
1147 else if (!strcmp (token, SYSPRIM_WITHDRAW_ERR_IND))
1148 {
1149 if ( frm_error_ind != NULL )
1150 {
1151 error_ind_dst[0] = 0;
1152 vsi_c_pfree( (T_VOID_STRUCT**)&frm_error_ind FILE_LINE_MACRO );
1153 frm_error_ind = NULL;
1154 }
1155 }
1156 else if (!strcmp (token, SYSPRIM_STATUS_TOKEN))
1157 {
1158 GetNextToken (data+strlen(token)+1, token, " #");
1159 VSI_PPM_FREE(pPrim);
1160 os_DeallocatePartition (TaskHandle, pPrim-PPM_OFFSET );
1161 i = 0;
1162 while ( Resource[i].Name && strcmp ( Resource[i].Name, token ) )
1163 i++;
1164 if ( vsi_object_info (TaskHandle, Resource[i].Id, FIRST_ENTRY, token, sizeof(token)) == VSI_OK )
1165 {
1166 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token );
1167 while ( vsi_object_info (TaskHandle, Resource[i].Id, NEXT_ENTRY, token, sizeof(token)) == VSI_OK )
1168 {
1169 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token );
1170 }
1171 }
1172 return;
1173 }
1174 #if 0
1175 else if (!strcmp (token, SYSPRIM_READ_COM_MATRIX))
1176 {
1177 state = vsi_c_get_com_matrix_entry ( FIRST_ENTRY, token );
1178 if ( state == VSI_OK )
1179 {
1180 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token );
1181 do
1182 {
1183 if ( (state = vsi_c_get_com_matrix_entry ( NEXT_ENTRY, token)) == VSI_OK )
1184 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token );
1185 } while ( state == VSI_OK );
1186 }
1187 }
1188 #endif
1189 #ifdef _TARGET_
1190 else if (!strcmp (token, SYSPRIM_READ_FFS_DAR))
1191 {
1192 state = os_read_dar_ffs_data ( FIRST_ENTRY, token, TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER) - 1 );
1193 if ( state == OS_OK )
1194 {
1195 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token );
1196 do
1197 {
1198 if ( (state = os_read_dar_ffs_data ( NEXT_ENTRY, token, TextTracePartitionSize - sizeof(T_S_HEADER) - sizeof(T_PRIM_HEADER) - 1)) == OS_OK )
1199 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, token );
1200 } while ( state == OS_OK );
1201 }
1202 else
1203 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "No DAR entry stored" );
1204
1205 }
1206 #endif
1207 #if !defined _TARGET_ && !defined _TOOLS_
1208 else if (!strcmp (token, SYSPRIM_PCHECK))
1209 {
1210 pcheck_active[TaskHandle] = TRUE;
1211 }
1212 #endif
1213 else if (!strcmp (token, SYSPRIM_ROUTE_DESCLIST))
1214 {
1215 route_desclist[TaskHandle] = TRUE;
1216 }
1217 else if (!strcmp (token, SYSPRIM_CHECK_DESCLIST))
1218 {
1219 check_desclist = TRUE;
1220 }
1221 #ifdef _NUCLEUS_
1222 else if (!strcmp (token, SYSPRIM_VERSION_TOKEN))
1223 {
1224 vsi_o_ttrace (NO_TASK, TC_SYSTEM,"FRAME VERSION: %s, %s",frame_version_date, frame_version_time);
1225 vsi_o_ttrace (NO_TASK, TC_SYSTEM,"MISC VERSION: %s, %s",misc_version_date, misc_version_time);
1226 vsi_o_ttrace (NO_TASK, TC_SYSTEM,"TIF VERSION: %s, %s",tif_version_date, tif_version_time);
1227 }
1228 #endif
1229 else if (!strcmp (token, SYSPRIM_RESET_TOKEN))
1230 {
1231 /*
1232 * Reset
1233 */
1234 pf_Reset (TaskHandle);
1235 }
1236 #ifdef _TOOLS_
1237 else if (!strcmp (token, SYSPRIM_EXIT_TOKEN))
1238 {
1239 /*
1240 * Exit and delete
1241 */
1242 if (pf_TaskTable[TaskHandle].PeiTable->pei_exit != NULL)
1243 {
1244 pf_TaskTable[TaskHandle].PeiTable->pei_exit();
1245 }
1246 VSI_PPM_FREE(pPrim);
1247 os_DeallocatePartition (TaskHandle, pPrim-PPM_OFFSET );
1248 vsi_p_delete(0,TaskHandle);
1249 }
1250 #endif /* _TOOLS_ */
1251 #ifdef MEMORY_SUPERVISION
1252 else if (!strcmp (token, SYSPRIM_CHECK_OWNER))
1253 {
1254 ppm_check_partition_owner = 1;
1255 }
1256 else if (!strcmp (token, SYSPRIM_SHOW_MEMORY))
1257 {
1258 /*
1259 * Show state of the partition pool monitor
1260 */
1261 VSI_PPM_FREE(pPrim);
1262 os_DeallocatePartition (TaskHandle, pPrim-PPM_OFFSET );
1263 TracePoolstatus (TaskHandle);
1264 return;
1265 }
1266 #endif /* MEMORY_SUPERVISION */
1267 #ifndef _TOOLS_
1268 else if (!strcmp (token, SYSPRIM_SELECT_TIME_TDMA))
1269 {
1270 time_is_tdma_frame = 1;
1271 }
1272 #endif
1273 #ifdef _TOOLS_
1274 else if (!strcmp (token, SYSPRIM_IS_STACK_TIME))
1275 {
1276 s_hdr = P_SHDR(pPrim);
1277 set_stack_time (s_hdr->time);
1278 }
1279 else if (!strcmp (token, SYSPRIM_REGISTER_TOKEN))
1280 {
1281 OS_HANDLE comhandle;
1282 GetNextToken (data+strlen(token)+1, token, " #");
1283 if (os_create_extq (token, &comhandle) == OS_OK)
1284 {
1285 if (!strcmp (token, FRM_PCO_NAME))
1286 {
1287 vsi_o_set_htrace (comhandle);
1288 }
1289 }
1290 else
1291 Error = TRUE;
1292 }
1293 else if (!strcmp (token, SYSPRIM_WITHDRAW_TOKEN))
1294 {
1295 GetNextToken (data+strlen(token)+1, token, " #");
1296 if (os_destroy_extq (token) == OS_OK)
1297 {
1298 if (!strcmp (token, FRM_PCO_NAME))
1299 {
1300 vsi_o_set_htrace (0);
1301 }
1302 }
1303 else
1304 Error = TRUE;
1305 }
1306 #endif /* _TOOLS_ */
1307 else
1308 Error = TRUE;
1309
1310 if ( Error )
1311 {
1312 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "SYSTEM WARNING:Invalid system primitive '%s'",data );
1313 }
1314 else
1315 {
1316 if ( !SuppressOK )
1317 {
1318 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "OK (%s %s)", pf_TaskTable[TaskHandle].Name, data );
1319 }
1320 }
1321 VSI_PPM_FREE(pPrim);
1322 os_DeallocatePartition (TaskHandle, pPrim-PPM_OFFSET );
1323 }
1324 #endif
1325
1326 #ifndef RUN_INT_RAM
1327 /*
1328 +--------------------------------------------------------------------+
1329 | PROJECT : GSM-GPF (8415) MODULE : FRAME |
1330 | STATE : code ROUTINE : pf_Reset |
1331 +--------------------------------------------------------------------+
1332 */
1333 LOCAL void pf_Reset (T_HANDLE TaskHandle)
1334 {
1335 if (TaskHandle != NO_TASK)
1336 {
1337 if (pf_TaskTable[TaskHandle].PeiTable->pei_exit != NULL)
1338 pf_TaskTable[TaskHandle].PeiTable->pei_exit();
1339 /*
1340 * reset a single entity
1341 */
1342 if (pf_TaskTable[TaskHandle].PeiTable->pei_init != NULL)
1343 while (pf_TaskTable[TaskHandle].PeiTable->pei_init(TaskHandle) == PEI_ERROR)
1344 os_SuspendTask ( TaskHandle, 5);
1345 }
1346 else
1347 {
1348 USHORT Handle;
1349 /*
1350 * reset all entities
1351 */
1352 for (Handle = 1; Handle <= MaxEntities; Handle++)
1353 {
1354 if (pf_TaskTable[TaskHandle].PeiTable->pei_exit != NULL)
1355 pf_TaskTable[TaskHandle].PeiTable->pei_exit();
1356
1357 if (pf_TaskTable[Handle].PeiTable->pei_init != NULL)
1358 while (pf_TaskTable[TaskHandle].PeiTable->pei_init(TaskHandle) == PEI_ERROR)
1359 os_SuspendTask ( TaskHandle, 5);
1360 }
1361 }
1362 }
1363 #endif
1364
1365 #ifdef _TOOLS_
1366 /*
1367 +--------------------------------------------------------------------+
1368 | PROJECT : GSM-Frame (8415) MODULE : FRAME |
1369 | STATE : code ROUTINE : set_stack_time |
1370 +--------------------------------------------------------------------+
1371
1372 PURPOSE : stores the local time of stack under test. Used to align
1373 timestamps while tracing.
1374
1375 */
1376 void set_stack_time ( ULONG time )
1377 {
1378 init_stack_time = time;
1379 os_GetTime ( NO_TASK, &init_local_time );
1380 }
1381
1382 /*
1383 +--------------------------------------------------------------------+
1384 | PROJECT : GSM-Frame (8415) MODULE : FRAME |
1385 | STATE : code ROUTINE : get_stack_time |
1386 +--------------------------------------------------------------------+
1387
1388 PURPOSE : returns the local time of stack under test. Used to align
1389 timestamps while tracing.
1390
1391 */
1392 void get_local_time ( ULONG *time )
1393 {
1394 OS_TIME current_local_time;
1395
1396 os_GetTime ( NO_TASK, &current_local_time );
1397 *time = init_stack_time + current_local_time - init_local_time;
1398 }
1399
1400 #endif
1401
1402 #ifndef RUN_INT_RAM
1403 /*
1404 +--------------------------------------------------------------------+
1405 | PROJECT : GSM-Frame (8415) MODULE : FRAME |
1406 | STATE : code ROUTINE : pf_handle_error |
1407 +--------------------------------------------------------------------+
1408
1409 PURPOSE : frame error and warning handling
1410
1411 */
1412 /*lint -e506, suppress Warning 506: Constant value Boolean */
1413 /*lint -e718, suppress nfo 718: Symbol '_va_argref' undeclared, assumed to return int */
1414 int pf_handle_warning ( USHORT cause, const char * const format,...)
1415 {
1416 T_HANDLE caller;
1417 va_list varpars;
1418 static int recursion_count = 0;
1419 USHORT free;
1420 USHORT alloc;
1421
1422 /* recursion counter is needed to avoid endless loop when generating warning during processing of warning */
1423 if ( recursion_count == 0 )
1424 {
1425 recursion_count++;
1426 caller = e_running[os_MyHandle()];
1427 va_start (varpars, format);
1428 int_vsi_o_ttrace ( NO_TASK, TC_SYSTEM, format, varpars );
1429
1430 if ( error_ind_dst[0] != 0 )
1431 {
1432 /* drop the warning, if there are fewer than 3 partitions available to avoid deadlock */
1433 vsi_m_status ( caller, sizeof(T_FRM_WARNING_IND)+sizeof(T_PRIM_HEADER), PrimGroupHandle, &free, &alloc );
1434 if ( free >= 3 )
1435 {
1436 PALLOC(frm_warning_ind,FRM_WARNING_IND);
1437 frm_warning_ind->warning_code = cause;
1438 #ifdef _TARGET_
1439 /* We will destroy the partition guard pattern if the warning is longer than the warning string in FRM_WARNING_IND */
1440 vsprintf ((char*)frm_warning_ind->warning_string, format, varpars);
1441 #else
1442 #if defined(_LINUX_) || defined(_SOLARIS_)
1443 vsnprintf ((char*)frm_warning_ind->warning_string,
1444 sizeof(frm_warning_ind->warning_string), format, varpars);
1445 #else
1446 _vsnprintf ((char*)frm_warning_ind->warning_string, sizeof(frm_warning_ind->warning_string), format, varpars);
1447 #endif
1448 #endif
1449 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 );
1450 }
1451 else
1452 {
1453 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "FRM_WARNING_IND dropped" );
1454 }
1455 }
1456 #if defined _NUCLEUS_ && !defined _TARGET_
1457 vsprintf (TraceBuffer, format, varpars);
1458 printf ("%s\n",TraceBuffer);
1459 #endif
1460 #ifdef _NUCLEUS_
1461 os_SystemError ( os_MyHandle(), cause, NULL );
1462 #endif
1463 recursion_count--;
1464 }
1465 return VSI_OK;
1466 }
1467 /*lint +e718 */
1468 /*lint +e506 */
1469
1470 #endif
1471
1472