FreeCalypso > hg > fc-selenite
comparison src/gpf/frame/vsi_ppm.c @ 5:1ea54a97e831
src/gpf: import of Magnetite src/gpf3
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sun, 15 Jul 2018 08:11:07 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 4:6e457872f745 | 5:1ea54a97e831 |
|---|---|
| 1 /* | |
| 2 +------------------------------------------------------------------------------ | |
| 3 | File: vsi_ppm.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 Module defines the virtual system interface part | |
| 17 | for the primitive partition pool supervision. | |
| 18 +----------------------------------------------------------------------------- | |
| 19 */ | |
| 20 | |
| 21 #ifndef __VSI_PPM_C__ | |
| 22 #define __VSI_PPM_C__ | |
| 23 #endif | |
| 24 | |
| 25 #ifdef MEMORY_SUPERVISION | |
| 26 | |
| 27 /*==== INCLUDES ===================================================*/ | |
| 28 | |
| 29 #include "string.h" | |
| 30 #include "typedefs.h" | |
| 31 #include "os.h" | |
| 32 #include "vsi.h" | |
| 33 #include "tools.h" | |
| 34 #include "frm_defs.h" | |
| 35 #include "frm_types.h" | |
| 36 #include "frm_glob.h" | |
| 37 | |
| 38 /*==== TYPES ======================================================*/ | |
| 39 | |
| 40 typedef struct | |
| 41 { | |
| 42 USHORT pool_nr; | |
| 43 USHORT group_nr; | |
| 44 } T_POOL_GROUP; | |
| 45 | |
| 46 typedef struct | |
| 47 { | |
| 48 SHORT state_id; | |
| 49 char const * state_name; | |
| 50 } T_PARTITION_STATE; | |
| 51 /* | |
| 52 * indices to read the stored counters | |
| 53 */ | |
| 54 typedef enum { TOTAL,CURRENT_BYTE,CURRENT_PART,MAX_RANGES,MAX_BYTE_MEM,MAX_PART_MEM } T_COUNTER_READ; | |
| 55 | |
| 56 /* | |
| 57 * indices to update the counters | |
| 58 */ | |
| 59 typedef enum { DECREMENT, INCREMENT, STORE_MAX_BYTE, STORE_MAX_PART } T_COUNTER_UPDATE; | |
| 60 | |
| 61 /*==== CONSTANTS ==================================================*/ | |
| 62 | |
| 63 #define OWNER_IS_COM_HANDLE 0x8000 | |
| 64 /* | |
| 65 * Partition States | |
| 66 */ | |
| 67 #define PARTITION_FREED 0x0001 | |
| 68 #define PARTITION_ALLOCATED 0x0002 | |
| 69 #define PARTITION_RECEIVED 0x0004 | |
| 70 #define PARTITION_SENT 0x0008 | |
| 71 #define PARTITION_REUSED 0x0010 | |
| 72 #define PARTITION_ACCESSED 0x0020 | |
| 73 #define PARTITION_STORED 0x0040 | |
| 74 #define MAX_PARTITION_STATE 7 | |
| 75 | |
| 76 #define ALLOWED_ALLOCATE_STATES (PARTITION_FREED) | |
| 77 #define ALLOWED_RECEIVE_STATES (PARTITION_SENT|PARTITION_RECEIVED) | |
| 78 #define ALLOWED_SEND_STATES (PARTITION_ALLOCATED|PARTITION_REUSED|\ | |
| 79 PARTITION_RECEIVED|PARTITION_ACCESSED|\ | |
| 80 PARTITION_STORED) | |
| 81 #define ALLOWED_REUSE_STATES (PARTITION_ALLOCATED|PARTITION_RECEIVED|\ | |
| 82 PARTITION_STORED|PARTITION_REUSED) | |
| 83 #define ALLOWED_DEALLOCATE_STATES (PARTITION_RECEIVED|PARTITION_ALLOCATED|\ | |
| 84 PARTITION_SENT|PARTITION_REUSED|\ | |
| 85 PARTITION_ACCESSED|PARTITION_STORED) | |
| 86 #define ALLOWED_ACCESS_STATES (PARTITION_ALLOCATED|PARTITION_RECEIVED|\ | |
| 87 PARTITION_REUSED|PARTITION_ACCESSED|\ | |
| 88 PARTITION_STORED) | |
| 89 #define ALLOWED_STORE_STATES (PARTITION_ALLOCATED|PARTITION_RECEIVED|\ | |
| 90 PARTITION_REUSED|PARTITION_ACCESSED|\ | |
| 91 PARTITION_SENT) | |
| 92 | |
| 93 #define FORBIDDEN_ALLOCATE_STATES (0xffff&~ALLOWED_ALLOCATE_STATES) | |
| 94 #define FORBIDDEN_RECEIVE_STATES (0xffff&~ALLOWED_RECEIVE_STATES) | |
| 95 #define FORBIDDEN_SEND_STATES (0xffff&~ALLOWED_SEND_STATES) | |
| 96 #define FORBIDDEN_REUSE_STATES (0xffff&~ALLOWED_REUSE_STATES) | |
| 97 #define FORBIDDEN_DEALLOCATE_STATES (0xffff&~ALLOWED_DEALLOCATE_STATES) | |
| 98 #define FORBIDDEN_ACCESS_STATES (0xffff&~ALLOWED_ACCESS_STATES) | |
| 99 #define FORBIDDEN_STORE_STATES (0xffff&~ALLOWED_STORE_STATES) | |
| 100 | |
| 101 #define PPM_END_MARKER ((char)0xff) | |
| 102 | |
| 103 #define PARTITION_SIZE(g,p) (partition_grp_config[g].grp_config[p].part_size) | |
| 104 | |
| 105 #ifndef RUN_INT_RAM | |
| 106 const T_PARTITION_STATE partition_state[MAX_PARTITION_STATE+1] = | |
| 107 { | |
| 108 { PARTITION_FREED, "FREED" }, | |
| 109 { PARTITION_ALLOCATED, "ALLOCATED" }, | |
| 110 { PARTITION_RECEIVED, "RECEIVED" }, | |
| 111 { PARTITION_SENT, "SENT" }, | |
| 112 { PARTITION_REUSED, "REUSED" }, | |
| 113 { PARTITION_ACCESSED, "ACCESSED" }, | |
| 114 { PARTITION_STORED, "STORED" }, | |
| 115 { 0, NULL } | |
| 116 }; | |
| 117 #endif | |
| 118 | |
| 119 /*==== EXTERNALS ==================================================*/ | |
| 120 | |
| 121 /* -------------- S H A R E D - BEGIN ---------------- */ | |
| 122 #ifdef _TOOLS_ | |
| 123 #pragma data_seg("FRAME_SHARED") | |
| 124 #endif | |
| 125 | |
| 126 extern T_HANDLE TST_Handle; | |
| 127 extern const T_FRM_PARTITION_GROUP_CONFIG partition_grp_config[]; | |
| 128 extern T_HANDLE * PoolGroupHandle []; | |
| 129 extern OS_HANDLE ext_data_pool_handle; | |
| 130 extern USHORT MaxPoolGroups; | |
| 131 | |
| 132 /*==== VARIABLES ==================================================*/ | |
| 133 | |
| 134 #ifndef RUN_INT_RAM | |
| 135 | |
| 136 USHORT NumberOfPPMPartitions = 0; | |
| 137 USHORT NumOfPPMPools = 0; | |
| 138 USHORT NumOfPPMGroups; | |
| 139 USHORT NumOfPrimPools; | |
| 140 USHORT NumOfDmemPools; | |
| 141 T_PARTITION_POOL_STATUS PoolStatus; | |
| 142 T_PARTITION_STATUS *PartitionStatus; | |
| 143 T_OVERSIZE_STATUS *PartitionOversize; | |
| 144 T_COUNTER *PartitionCounter; | |
| 145 T_POOL_GROUP *PoolGroup; | |
| 146 #ifdef OPTIMIZE_POOL | |
| 147 T_COUNTER *ByteCounter; | |
| 148 T_COUNTER *RangeCounter; | |
| 149 int *GroupStartRange; | |
| 150 int *GroupStartCnt; | |
| 151 #endif /* OPTIMIZE_POOL */ | |
| 152 int ppm_check_partition_owner; | |
| 153 | |
| 154 #else /* RUN_INT_RAM */ | |
| 155 | |
| 156 extern int ppm_check_partition_owner; | |
| 157 extern T_PARTITION_POOL_STATUS PoolStatus; | |
| 158 extern T_POOL_GROUP * PoolGroup; | |
| 159 extern USHORT NumOfPrimPools; | |
| 160 extern USHORT NumOfDmemPools; | |
| 161 extern int *GroupStartRange; | |
| 162 | |
| 163 #endif /* RUN_INT_RAM */ | |
| 164 | |
| 165 #ifdef _TOOLS_ | |
| 166 #pragma data_seg() | |
| 167 #endif | |
| 168 /* -------------- S H A R E D - END ---------------- */ | |
| 169 | |
| 170 /*==== FUNCTIONS ==================================================*/ | |
| 171 | |
| 172 GLOBAL void SetPartitionStatus ( T_PARTITION_STATUS *pPoolStatus, const char *file, int line, | |
| 173 ULONG opc, USHORT Status, T_HANDLE owner ); | |
| 174 | |
| 175 USHORT update_dyn_state ( T_HANDLE Caller, T_PRIM_HEADER *prim, T_HANDLE owner, USHORT state, const char* file, int line ); | |
| 176 BOOL UpdatePoolCounter ( T_COUNTER *pCounter, T_COUNTER_UPDATE Status, ULONG Value ); | |
| 177 void StoreRangeCounters ( T_PRIM_HEADER *prim, T_COUNTER_UPDATE Status ); | |
| 178 int GetPartitionRange ( ULONG size, USHORT group_nr, USHORT pool_nr ); | |
| 179 LONG get_partition_group ( T_PRIM_HEADER *prim, USHORT *group_nr, USHORT *pool_nr ); | |
| 180 char const *get_partition_state_name ( USHORT partition_state ); | |
| 181 | |
| 182 | |
| 183 #ifndef RUN_FLASH | |
| 184 USHORT update_dyn_state ( T_HANDLE Caller, T_PRIM_HEADER *prim, T_HANDLE owner, USHORT state, const char* file, int line ) | |
| 185 { | |
| 186 T_desc *desc; | |
| 187 T_desc3 *desc3; | |
| 188 T_M_HEADER *mem; | |
| 189 T_DP_HEADER *dp_hdr; | |
| 190 USHORT ret = TRUE; | |
| 191 | |
| 192 if ( prim->dph_offset != 0 ) | |
| 193 { | |
| 194 dp_hdr = (T_DP_HEADER*)((ULONG*)prim + prim->dph_offset); | |
| 195 if ( *((ULONG*)dp_hdr) == GUARD_PATTERN ) | |
| 196 { | |
| 197 dp_hdr = (T_DP_HEADER*)dp_hdr->next; | |
| 198 while (dp_hdr != NULL) | |
| 199 { | |
| 200 SetPartitionStatus ( &PoolStatus.PartitionStatus [ P_PNR(dp_hdr) ], file, line, P_OPC(prim), state, owner ); | |
| 201 dp_hdr = (T_DP_HEADER*)dp_hdr->next; | |
| 202 } | |
| 203 } | |
| 204 else | |
| 205 { | |
| 206 if ( Caller != TST_Handle ) | |
| 207 { | |
| 208 /* do not check and update the states of the primitives in descriptor lists when called by TST, because | |
| 209 descriptor lists are not routed to TST and will result in the warning generated below */ | |
| 210 desc = (T_desc*)(((T_desc_list*)dp_hdr)->first); | |
| 211 while (desc != NULL) | |
| 212 { | |
| 213 #ifdef _NUCLEUS_ | |
| 214 if ( *(((ULONG*)desc)-4) == 0 ) | |
| 215 #endif | |
| 216 { | |
| 217 mem = ((T_M_HEADER*)desc)-1; | |
| 218 SetPartitionStatus ( &PoolStatus.PartitionStatus [P_PNR(mem)], file, line, P_OPC(prim), state, owner ); | |
| 219 if ( mem->desc_type == (VSI_DESC_TYPE3 >> 16) ) | |
| 220 { | |
| 221 desc3 = (T_desc3*)desc; | |
| 222 mem = ((T_M_HEADER*)desc3->buffer)-1; | |
| 223 SetPartitionStatus ( &PoolStatus.PartitionStatus [P_PNR(mem)], file, line, P_OPC(prim), state, owner ); | |
| 224 } | |
| 225 } | |
| 226 #ifdef _NUCLEUS_ | |
| 227 else | |
| 228 vsi_o_ttrace (Caller, TC_SYSTEM,"[PPM]: FREED PARTITION 0x%lx IN DESCLIST, %s(%d)", prim,rm_path(file),line ); | |
| 229 #endif | |
| 230 desc = (T_desc *)desc->next; | |
| 231 } | |
| 232 } | |
| 233 } | |
| 234 } | |
| 235 else | |
| 236 ret = FALSE; | |
| 237 return ret; | |
| 238 } | |
| 239 #endif | |
| 240 | |
| 241 #ifndef RUN_INT_RAM | |
| 242 /* | |
| 243 +------------------------------------------------------------------------+ | |
| 244 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 245 | STATE : code ROUTINE : get_partition_state_name| | |
| 246 +------------------------------------------------------------------------+ | |
| 247 | |
| 248 PURPOSE : update counter. | |
| 249 | |
| 250 */ | |
| 251 char const *get_partition_state_name ( USHORT state ) | |
| 252 { | |
| 253 USHORT i = 0; | |
| 254 | |
| 255 while ( partition_state[i].state_id ) | |
| 256 { | |
| 257 if ( partition_state[i].state_id == state ) | |
| 258 return partition_state[i].state_name; | |
| 259 i++; | |
| 260 } | |
| 261 return NULL; | |
| 262 } | |
| 263 #endif | |
| 264 | |
| 265 #ifndef RUN_FLASH | |
| 266 /* | |
| 267 +----------------------------------------------------------------------+ | |
| 268 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 269 | STATE : code ROUTINE : check_partition_group | | |
| 270 +----------------------------------------------------------------------+ | |
| 271 | |
| 272 PURPOSE : update counter. | |
| 273 | |
| 274 */ | |
| 275 LONG get_partition_group ( T_PRIM_HEADER *prim, USHORT *group_nr, USHORT *pool_nr ) | |
| 276 { | |
| 277 SHORT invalid_pool = 0; | |
| 278 T_HANDLE Caller; | |
| 279 | |
| 280 *pool_nr = PoolGroup [ (USHORT)(P_PGR(prim)) ].pool_nr; | |
| 281 *group_nr = PoolGroup [ (USHORT)(P_PGR(prim)) ].group_nr; | |
| 282 | |
| 283 if ( *group_nr > MaxPoolGroups ) | |
| 284 invalid_pool = 1; | |
| 285 | |
| 286 if ( *group_nr == PrimGroupHandle ) | |
| 287 { | |
| 288 if ( *pool_nr > NumOfPrimPools ) | |
| 289 invalid_pool = 1; | |
| 290 } | |
| 291 else if ( *group_nr == DmemGroupHandle ) | |
| 292 { | |
| 293 if ( *pool_nr > NumOfDmemPools ) | |
| 294 invalid_pool = 1; | |
| 295 } | |
| 296 | |
| 297 if ( invalid_pool == 1 ) | |
| 298 { | |
| 299 Caller = e_running[os_MyHandle()]; | |
| 300 vsi_o_ttrace (Caller, TC_SYSTEM, | |
| 301 "[PPM]: Invalid Partition Pool, group: %d, pool: %d", *group_nr, *pool_nr ); | |
| 302 return VSI_ERROR; | |
| 303 } | |
| 304 | |
| 305 return VSI_OK; | |
| 306 } | |
| 307 #endif | |
| 308 | |
| 309 #ifndef RUN_FLASH | |
| 310 /* | |
| 311 +--------------------------------------------------------------------+ | |
| 312 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 313 | STATE : code ROUTINE : GetPartitionRange | | |
| 314 +--------------------------------------------------------------------+ | |
| 315 | |
| 316 PURPOSE : update counter. | |
| 317 | |
| 318 */ | |
| 319 int GetPartitionRange ( ULONG size, USHORT group_nr, USHORT pool_nr ) | |
| 320 { | |
| 321 int partition_range; | |
| 322 int size_offset; | |
| 323 int range; | |
| 324 | |
| 325 if ( pool_nr != 0 ) | |
| 326 { | |
| 327 partition_range = (int)(PARTITION_SIZE(group_nr,pool_nr) - PARTITION_SIZE(group_nr,pool_nr-1)); | |
| 328 | |
| 329 size_offset = (int)(size - (USHORT)(PARTITION_SIZE(group_nr,pool_nr-1)) - 1); | |
| 330 if ( size_offset < 0 ) | |
| 331 size_offset = 0; | |
| 332 } | |
| 333 else | |
| 334 { | |
| 335 partition_range = (USHORT)(PARTITION_SIZE(group_nr,pool_nr)); | |
| 336 if ( size == 0 ) | |
| 337 size_offset = 0; | |
| 338 else | |
| 339 size_offset = (int)(size - 1); | |
| 340 } | |
| 341 | |
| 342 range = (USHORT)((size_offset * RANGES_PER_POOL)/partition_range + pool_nr * RANGES_PER_POOL + GroupStartRange[group_nr]); | |
| 343 | |
| 344 return range; | |
| 345 } | |
| 346 #endif | |
| 347 | |
| 348 #ifndef RUN_FLASH | |
| 349 /* | |
| 350 +--------------------------------------------------------------------+ | |
| 351 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 352 | STATE : code ROUTINE : UpdatePoolCounter | | |
| 353 +--------------------------------------------------------------------+ | |
| 354 | |
| 355 PURPOSE : update counter. | |
| 356 | |
| 357 */ | |
| 358 BOOL UpdatePoolCounter ( T_COUNTER *pCounter, T_COUNTER_UPDATE Status, ULONG Value ) | |
| 359 { | |
| 360 | |
| 361 switch ( Status ) | |
| 362 { | |
| 363 case INCREMENT: | |
| 364 pCounter->Total += Value; /* total number */ | |
| 365 pCounter->Current += Value; /* current number */ | |
| 366 if ( pCounter->Current > pCounter->Maximum ) /* current > maximum ? */ | |
| 367 { | |
| 368 pCounter->Maximum = pCounter->Current; /* Maximum = Current */ | |
| 369 return TRUE ; | |
| 370 } | |
| 371 break; | |
| 372 case DECREMENT: | |
| 373 pCounter->Current -= Value; /* current number */ | |
| 374 break; | |
| 375 case STORE_MAX_BYTE: | |
| 376 pCounter->MaxByteMemory = pCounter->Current; /* store current number */ | |
| 377 break; | |
| 378 case STORE_MAX_PART: | |
| 379 pCounter->MaxPartMemory = pCounter->Current; /* store current number */ | |
| 380 break; | |
| 381 } | |
| 382 return FALSE; | |
| 383 } | |
| 384 #endif | |
| 385 | |
| 386 #ifndef RUN_FLASH | |
| 387 /* | |
| 388 +--------------------------------------------------------------------+ | |
| 389 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 390 | STATE : code ROUTINE : SetPartitionStatus | | |
| 391 +--------------------------------------------------------------------+ | |
| 392 | |
| 393 PURPOSE : update the status of the partition. | |
| 394 | |
| 395 */ | |
| 396 GLOBAL void SetPartitionStatus ( T_PARTITION_STATUS *pPoolStatus, const char *file, int line, ULONG opc, USHORT Status, T_HANDLE owner ) | |
| 397 { | |
| 398 | |
| 399 pPoolStatus->Status = Status; | |
| 400 pPoolStatus->PrimOPC = opc; | |
| 401 pPoolStatus->owner = owner; | |
| 402 if ( Status NEQ PARTITION_FREED ) | |
| 403 { | |
| 404 os_GetTime (0,&pPoolStatus->time); | |
| 405 pPoolStatus->Userfile = file; | |
| 406 pPoolStatus->Line = line; | |
| 407 } | |
| 408 } | |
| 409 #endif | |
| 410 | |
| 411 #ifdef OPTIMIZE_POOL | |
| 412 #ifndef RUN_FLASH | |
| 413 /* | |
| 414 +--------------------------------------------------------------------+ | |
| 415 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 416 | STATE : code ROUTINE : StoreRangeCounters | | |
| 417 +--------------------------------------------------------------------+ | |
| 418 | |
| 419 PURPOSE : stores the range counters for a specified partition. | |
| 420 | |
| 421 */ | |
| 422 void StoreRangeCounters ( T_PRIM_HEADER *prim, T_COUNTER_UPDATE Status ) | |
| 423 { | |
| 424 USHORT i; | |
| 425 | |
| 426 for ( i=0; i<5; i++ ) | |
| 427 UpdatePoolCounter ( &PoolStatus.RangeCounter [ P_PGR(prim)*5+i ], Status,0 ); | |
| 428 } | |
| 429 #endif | |
| 430 | |
| 431 #ifndef RUN_INT_RAM | |
| 432 /* | |
| 433 +--------------------------------------------------------------------+ | |
| 434 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 435 | STATE : code ROUTINE : TracePoolStatistic | | |
| 436 +--------------------------------------------------------------------+ | |
| 437 | |
| 438 PURPOSE : send the statistic information specified by the parameters | |
| 439 to the tst interface. | |
| 440 | |
| 441 */ | |
| 442 LOCAL void TracePoolStatistic ( T_HANDLE Caller, USHORT group_nr, USHORT pool_nr, char const *Src, | |
| 443 T_COUNTER_READ Status ) | |
| 444 { | |
| 445 #define RNG_COUNT_IDX(g,p,i) (GroupStartRange[g]+p*RANGES_PER_POOL+i) | |
| 446 #define COUNT_IDX(g,p) (GroupStartCnt[g]+p) | |
| 447 T_FRM_PARTITION_POOL_CONFIG * pool_config; | |
| 448 ULONG Value1; | |
| 449 ULONG Value2; | |
| 450 char const *Resource; | |
| 451 BOOL TraceRange = FALSE; | |
| 452 BOOL TraceValue = FALSE; | |
| 453 ULONG Value[5]; | |
| 454 int i; | |
| 455 | |
| 456 pool_config = (T_FRM_PARTITION_POOL_CONFIG*)partition_grp_config[group_nr].grp_config + pool_nr; | |
| 457 | |
| 458 switch ( Status ) | |
| 459 { | |
| 460 case TOTAL: | |
| 461 TraceRange = TRUE; | |
| 462 for ( i = 0; i < RANGES_PER_POOL; i++ ) | |
| 463 Value[i] = PoolStatus.RangeCounter [ RNG_COUNT_IDX(group_nr,pool_nr,i) ].Total; | |
| 464 break; | |
| 465 case CURRENT_BYTE: | |
| 466 TraceValue = TRUE; | |
| 467 Resource = "max bytes "; | |
| 468 Value1 = PoolStatus.ByteCounter [ COUNT_IDX(group_nr,pool_nr) ].Current; | |
| 469 Value2 = PoolStatus.PartitionCounter [COUNT_IDX(group_nr,pool_nr)].Current * pool_config->part_size; | |
| 470 break; | |
| 471 case CURRENT_PART: | |
| 472 TraceValue = TRUE; | |
| 473 Resource = "part"; | |
| 474 Value1 = PoolStatus.PartitionCounter [COUNT_IDX(group_nr,pool_nr)].Current; | |
| 475 Value2 = pool_config->part_num; | |
| 476 | |
| 477 break; | |
| 478 case MAX_RANGES: | |
| 479 TraceRange = TRUE; | |
| 480 for ( i = 0; i < RANGES_PER_POOL; i++ ) | |
| 481 Value[i] = PoolStatus.RangeCounter [ RNG_COUNT_IDX(group_nr,pool_nr,i) ].Maximum; | |
| 482 break; | |
| 483 case MAX_BYTE_MEM: | |
| 484 TraceRange = TRUE; | |
| 485 TraceValue = TRUE; | |
| 486 Resource = "bytes "; | |
| 487 Value1 = PoolStatus.ByteCounter [COUNT_IDX(group_nr,pool_nr)].Maximum; | |
| 488 Value2 = PoolStatus.PartitionCounter [COUNT_IDX(group_nr,pool_nr)].MaxByteMemory * pool_config->part_size; | |
| 489 for ( i = 0; i < RANGES_PER_POOL; i++ ) | |
| 490 Value[i] = PoolStatus.RangeCounter [ RNG_COUNT_IDX(group_nr,pool_nr,i) ].MaxByteMemory; | |
| 491 break; | |
| 492 case MAX_PART_MEM: | |
| 493 TraceRange = TRUE; | |
| 494 TraceValue = TRUE; | |
| 495 Resource = "partitions"; | |
| 496 Value1 = PoolStatus.PartitionCounter [COUNT_IDX(group_nr,pool_nr)].Maximum; | |
| 497 Value2 = pool_config->part_num; | |
| 498 for ( i = 0; i < RANGES_PER_POOL; i++ ) | |
| 499 Value[i] = PoolStatus.RangeCounter [ RNG_COUNT_IDX(group_nr,pool_nr,i) ].MaxPartMemory; | |
| 500 break; | |
| 501 default: | |
| 502 break; | |
| 503 } | |
| 504 | |
| 505 /*lint -e644, suppress Warning -- Variable may not have been initialized */ | |
| 506 if ( TraceValue ) | |
| 507 vsi_o_ttrace (Caller, TC_SYSTEM,"[PPM]: %s pool %d:%5d %s =>%3d%%", | |
| 508 Src, pool_nr, Value1, Resource, (Value1*100)/(Value2==0?1:Value2) ); | |
| 509 | |
| 510 if ( TraceRange ) | |
| 511 vsi_o_ttrace (Caller, TC_SYSTEM,"[PPM]: %s partitions pool %d: %3d, %3d, %3d, %3d, %3d",Src, pool_nr, | |
| 512 Value[0],Value[1],Value[2],Value[3],Value[4]); | |
| 513 /*lint +e644 */ | |
| 514 | |
| 515 } | |
| 516 #endif | |
| 517 #endif /* OPTIMIZE_POOL */ | |
| 518 | |
| 519 #ifndef RUN_INT_RAM | |
| 520 /* | |
| 521 +--------------------------------------------------------------------+ | |
| 522 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 523 | STATE : code ROUTINE : TracePoolStatus | | |
| 524 +--------------------------------------------------------------------+ | |
| 525 | |
| 526 PURPOSE : send the statistic information to the test interface. | |
| 527 | |
| 528 */ | |
| 529 GLOBAL void TracePoolstatus ( T_HANDLE Caller ) | |
| 530 { | |
| 531 T_PARTITION_STATUS *pPoolStatus; | |
| 532 T_FRM_PARTITION_POOL_CONFIG * pool_config; | |
| 533 USHORT i, m; | |
| 534 USHORT group_nr, pool_nr; | |
| 535 USHORT PartitionError = FALSE, OversizeError = FALSE; | |
| 536 T_OVERSIZE_STATUS *pOversizeStatus; | |
| 537 T_HANDLE owner; | |
| 538 char *opc; | |
| 539 | |
| 540 pOversizeStatus = &PoolStatus.PartitionOversize[0]; | |
| 541 pPoolStatus = &PoolStatus.PartitionStatus [0]; | |
| 542 for ( i = 0; i < NumberOfPPMPartitions; i++ ) | |
| 543 { | |
| 544 if ( pPoolStatus->Status > 0 && pPoolStatus->Status NEQ PARTITION_FREED ) | |
| 545 { | |
| 546 if ( pPoolStatus->owner & OWNER_IS_COM_HANDLE ) | |
| 547 owner = pPoolStatus->owner&~OWNER_IS_COM_HANDLE; | |
| 548 else | |
| 549 owner = pPoolStatus->owner; | |
| 550 | |
| 551 if ( pPoolStatus->PrimOPC && ( ((T_PRIM_HEADER*)pPoolStatus->ptr)->opc != pPoolStatus->PrimOPC ) ) | |
| 552 opc = "in desclist of OPC"; | |
| 553 else | |
| 554 opc = "OPC"; | |
| 555 get_partition_group ( pPoolStatus->ptr, &group_nr, &pool_nr ); | |
| 556 | |
| 557 pool_config = (T_FRM_PARTITION_POOL_CONFIG*)partition_grp_config[group_nr].grp_config + pool_nr; | |
| 558 | |
| 559 vsi_o_ttrace ( Caller, TC_SYSTEM, "POOL%d%d(%s), PARTITION 0x%lx(%d), %s 0x%lx, \ | |
| 560 %s, %s, TIME %d, %s(%d)", group_nr,pool_nr,partition_grp_config[group_nr].name, pPoolStatus->ptr,pool_config->part_size, | |
| 561 opc, pPoolStatus->PrimOPC, get_partition_state_name(pPoolStatus->Status), pf_TaskTable[owner].Name, pPoolStatus->time, | |
| 562 rm_path(pPoolStatus->Userfile), pPoolStatus->Line); | |
| 563 PartitionError = TRUE; | |
| 564 } | |
| 565 pPoolStatus++; | |
| 566 } | |
| 567 | |
| 568 for (m = 0; partition_grp_config[m].grp_config != NULL; m++ ) | |
| 569 { | |
| 570 if ( strcmp ("TEST", partition_grp_config[m].name ) ) | |
| 571 { | |
| 572 vsi_o_ttrace ( Caller, TC_SYSTEM, "---------------------------------------------------------" ); | |
| 573 vsi_o_ttrace ( Caller, TC_SYSTEM, "[PPM]: POOL NAME: %s", partition_grp_config[m].name ); | |
| 574 pool_config = (T_FRM_PARTITION_POOL_CONFIG*)partition_grp_config[m].grp_config; | |
| 575 for ( i = 0; pool_config != NULL; i++) | |
| 576 { | |
| 577 if ( pool_config->part_size ) | |
| 578 { | |
| 579 #ifdef OPTIMIZE_POOL | |
| 580 vsi_o_ttrace ( Caller, TC_SYSTEM, "---------------------------------------------------------" ); | |
| 581 vsi_o_ttrace ( Caller, TC_SYSTEM, "[PPM]: POOL %d (size %d) ",i, pool_config->part_size ); | |
| 582 TracePoolStatistic ( Caller, m, i, "MAXBYTE ", MAX_BYTE_MEM ); | |
| 583 TracePoolStatistic ( Caller, m, i, "MAXPART ", MAX_PART_MEM ); | |
| 584 TracePoolStatistic ( Caller, m, i, "MAXRANGE", MAX_RANGES ); | |
| 585 TracePoolStatistic ( Caller, m, i, "TOTAL ", TOTAL ); | |
| 586 #endif /* OPTIMIZE_POOL */ | |
| 587 if ( pOversizeStatus->PrimOPC ) | |
| 588 { | |
| 589 vsi_o_ttrace ( Caller, TC_SYSTEM, "PPM: PARTITION OF SIZE %d USED BY OVERSIZED \ | |
| 590 PRIMITIVE %lx AT %s(%d)", pool_config->part_size, | |
| 591 pOversizeStatus->PrimOPC, rm_path(pOversizeStatus->Userfile), pPoolStatus->Line); | |
| 592 OversizeError = TRUE; | |
| 593 } | |
| 594 pOversizeStatus++; | |
| 595 } | |
| 596 else | |
| 597 { | |
| 598 break; | |
| 599 } | |
| 600 pool_config++; | |
| 601 } | |
| 602 if ( !PartitionError ) | |
| 603 vsi_o_ttrace ( Caller, TC_SYSTEM, "[PPM]: ALL PARTITIONS FREED" ); | |
| 604 if ( !OversizeError ) | |
| 605 vsi_o_ttrace ( Caller, TC_SYSTEM, "[PPM]: NO OVERSIZE ERRORS OCCURED" ); | |
| 606 } | |
| 607 } | |
| 608 | |
| 609 } | |
| 610 #endif | |
| 611 | |
| 612 #ifndef RUN_INT_RAM | |
| 613 /* | |
| 614 +--------------------------------------------------------------------+ | |
| 615 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 616 | STATE : code ROUTINE : InitializePPM | | |
| 617 +--------------------------------------------------------------------+ | |
| 618 | |
| 619 PURPOSE : initialize supervision, write index to each partition. | |
| 620 | |
| 621 */ | |
| 622 void InitializePPM ( void ) | |
| 623 { | |
| 624 T_FRM_PARTITION_POOL_CONFIG * pool_config; | |
| 625 ULONG *Prims; | |
| 626 USHORT i,j,k,m,n; | |
| 627 int status; | |
| 628 static int last_range = 0; | |
| 629 static int last_cnt = 0; | |
| 630 | |
| 631 status = os_AllocateMemory (NO_TASK, (T_VOID_STRUCT**)&Prims, sizeof(int)*NumberOfPPMPartitions, OS_NO_SUSPEND, ext_data_pool_handle ); | |
| 632 status |= os_AllocateMemory (NO_TASK, (T_VOID_STRUCT**)&PoolGroup, sizeof(T_POOL_GROUP)*NumOfPPMPools, OS_NO_SUSPEND, ext_data_pool_handle ); | |
| 633 status |= os_AllocateMemory (NO_TASK, (T_VOID_STRUCT**)&PartitionStatus, sizeof(T_PARTITION_STATUS)*NumberOfPPMPartitions, OS_NO_SUSPEND, ext_data_pool_handle ); | |
| 634 status |= os_AllocateMemory (NO_TASK, (T_VOID_STRUCT**)&PartitionOversize, sizeof(T_OVERSIZE_STATUS)*NumOfPPMPools, OS_NO_SUSPEND, ext_data_pool_handle ); | |
| 635 status |= os_AllocateMemory (NO_TASK, (T_VOID_STRUCT**)&PartitionCounter, sizeof(T_COUNTER)*NumOfPPMPools, OS_NO_SUSPEND, ext_data_pool_handle ); | |
| 636 #ifdef OPTIMIZE_POOL | |
| 637 status |= os_AllocateMemory (NO_TASK, (T_VOID_STRUCT**)&ByteCounter, sizeof(T_COUNTER)*NumOfPPMPools, OS_NO_SUSPEND, ext_data_pool_handle ); | |
| 638 status |= os_AllocateMemory (NO_TASK, (T_VOID_STRUCT**)&RangeCounter, sizeof(T_COUNTER)*NumberOfPPMPartitions, OS_NO_SUSPEND, ext_data_pool_handle ); | |
| 639 status |= os_AllocateMemory (NO_TASK, (T_VOID_STRUCT**)&GroupStartRange, sizeof(int)*NumOfPPMGroups, OS_NO_SUSPEND, ext_data_pool_handle ); | |
| 640 status |= os_AllocateMemory (NO_TASK, (T_VOID_STRUCT**)&GroupStartCnt, sizeof(int)*NumOfPPMGroups, OS_NO_SUSPEND, ext_data_pool_handle ); | |
| 641 #endif | |
| 642 if ( status > 0 ) | |
| 643 { | |
| 644 vsi_o_assert ( 0, OS_SYST_ERR, __FILE__, __LINE__, "Memory allocation for partition supervision failed" ); | |
| 645 } | |
| 646 ppm_check_partition_owner = 0; | |
| 647 PoolStatus.PartitionStatus = PartitionStatus; | |
| 648 PoolStatus.PartitionOversize = PartitionOversize; | |
| 649 PoolStatus.PartitionCounter = PartitionCounter; | |
| 650 #ifdef OPTIMIZE_POOL | |
| 651 PoolStatus.ByteCounter = ByteCounter; | |
| 652 PoolStatus.RangeCounter = RangeCounter; | |
| 653 #endif | |
| 654 | |
| 655 for ( j = 0; j<NumberOfPPMPartitions; j++) | |
| 656 Prims[j] = 0; | |
| 657 | |
| 658 for (m = 0, j = 0, i = 0; partition_grp_config[m].grp_config != NULL; m++ ) | |
| 659 { | |
| 660 if ( strcmp ("TEST", partition_grp_config[m].name ) ) | |
| 661 { | |
| 662 pool_config = (T_FRM_PARTITION_POOL_CONFIG*)partition_grp_config[m].grp_config; | |
| 663 | |
| 664 for (n = 0; pool_config != NULL; i++, n++) | |
| 665 { | |
| 666 if ( pool_config->part_size ) | |
| 667 { | |
| 668 PoolGroup[i].group_nr = m; | |
| 669 PoolGroup[i].pool_nr = n; | |
| 670 for (k = 0; k < pool_config->part_num; k++ , j++) | |
| 671 { | |
| 672 if ( os_AllocatePartition ( NO_TASK, (T_VOID_STRUCT**)&Prims[j], pool_config->part_size, | |
| 673 OS_NO_SUSPEND, *PoolGroupHandle[m] ) == OS_OK ) | |
| 674 { | |
| 675 P_IDX((T_PRIM_HEADER*)(Prims[j]+PPM_IDX_OFFSET)) = ( ((USHORT)i<<16) | j ); | |
| 676 } | |
| 677 else | |
| 678 { | |
| 679 P_IDX((T_PRIM_HEADER*)(Prims[j]+PPM_IDX_OFFSET)) = 0; | |
| 680 } | |
| 681 } | |
| 682 } | |
| 683 else | |
| 684 { | |
| 685 break; | |
| 686 } | |
| 687 pool_config++; | |
| 688 } | |
| 689 if ( m == 0 ) | |
| 690 { | |
| 691 GroupStartCnt[m] = 0; | |
| 692 GroupStartRange[m] = 0; | |
| 693 last_cnt = n; | |
| 694 last_range = RANGES_PER_POOL * n; | |
| 695 } | |
| 696 else | |
| 697 { | |
| 698 GroupStartCnt[m] = last_cnt; | |
| 699 GroupStartRange[m] = last_range; | |
| 700 last_cnt = GroupStartCnt[m] + n; | |
| 701 last_range = GroupStartRange[m] + RANGES_PER_POOL * n; | |
| 702 } | |
| 703 | |
| 704 } | |
| 705 } | |
| 706 for ( j = 0; j<NumberOfPPMPartitions; j++) | |
| 707 { | |
| 708 if ( Prims[j] ) | |
| 709 { | |
| 710 os_DeallocatePartition ( NO_TASK, (T_VOID_STRUCT*)Prims[j] ); | |
| 711 PoolStatus.PartitionStatus [ P_PNR(Prims[j]+4) ].Status = PARTITION_FREED; | |
| 712 } | |
| 713 } | |
| 714 } | |
| 715 #endif | |
| 716 | |
| 717 #ifndef RUN_FLASH | |
| 718 /* | |
| 719 +--------------------------------------------------------------------+ | |
| 720 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 721 | STATE : code ROUTINE : vsi_ppm_new | | |
| 722 +--------------------------------------------------------------------+ | |
| 723 | |
| 724 PURPOSE : supervision of allocating a partition. | |
| 725 | |
| 726 */ | |
| 727 GLOBAL void vsi_ppm_new ( T_HANDLE Caller, ULONG Size, T_PRIM_HEADER *prim, const char* file, int line ) | |
| 728 { | |
| 729 T_PARTITION_STATUS *pPoolStatus; | |
| 730 USHORT group_nr, pool_nr; | |
| 731 | |
| 732 if ( prim != NULL ) | |
| 733 { | |
| 734 if ( get_partition_group ( prim, &group_nr, &pool_nr ) == VSI_OK ) | |
| 735 { | |
| 736 vsi_ppm_setend(prim, Size); | |
| 737 /* | |
| 738 * set pointer to status entry of the currently used partition | |
| 739 */ | |
| 740 pPoolStatus = &PoolStatus.PartitionStatus [ P_PNR(prim) ]; | |
| 741 | |
| 742 pPoolStatus->ptr = prim; | |
| 743 /* | |
| 744 * send error message in case of an illegal state transition | |
| 745 */ | |
| 746 if ( pPoolStatus->Status & FORBIDDEN_ALLOCATE_STATES ) | |
| 747 vsi_o_ttrace (Caller, TC_SYSTEM, | |
| 748 "[PPM]: %s->%s: %s(%d)", get_partition_state_name(pPoolStatus->Status), | |
| 749 get_partition_state_name(PARTITION_ALLOCATED),rm_path(file),line ); | |
| 750 | |
| 751 /* | |
| 752 * update partition status | |
| 753 */ | |
| 754 SetPartitionStatus ( pPoolStatus, file, line, P_OPC(prim), PARTITION_ALLOCATED, Caller ); | |
| 755 | |
| 756 #ifdef OPTIMIZE_POOL | |
| 757 /* | |
| 758 * get primitive size and update range counter | |
| 759 */ | |
| 760 pPoolStatus->UsedSize = Size; | |
| 761 UpdatePoolCounter ( &PoolStatus.RangeCounter [GetPartitionRange(pPoolStatus->UsedSize,group_nr,pool_nr)], INCREMENT,1 ); | |
| 762 #endif /* OPTIMIZE_POOL */ | |
| 763 | |
| 764 /* | |
| 765 * update partition counter, if new maximum and OPTIMIZE_POOL, then | |
| 766 * - store the counters of the ranges within this partition | |
| 767 * - send a message that a new maximum has occurred | |
| 768 */ | |
| 769 if ( UpdatePoolCounter ( &PoolStatus.PartitionCounter [P_PGR(prim)],INCREMENT,1 ) ) | |
| 770 #ifndef OPTIMIZE_POOL | |
| 771 ; | |
| 772 #else | |
| 773 { | |
| 774 StoreRangeCounters ( prim, STORE_MAX_PART ); | |
| 775 } | |
| 776 | |
| 777 /* | |
| 778 * update byte counter, if new maximum, then | |
| 779 * - store the counters of the ranges within this partition | |
| 780 * - store the number of currently allocated partitions | |
| 781 */ | |
| 782 if ( UpdatePoolCounter ( &PoolStatus.ByteCounter [P_PGR(prim)],INCREMENT,pPoolStatus->UsedSize ) ) | |
| 783 { | |
| 784 StoreRangeCounters ( prim, STORE_MAX_BYTE ); | |
| 785 UpdatePoolCounter ( &PoolStatus.PartitionCounter [ P_PGR(prim) ], STORE_MAX_BYTE,0 ); | |
| 786 } | |
| 787 #endif /* OPTIMIZE_POOL */ | |
| 788 } | |
| 789 else | |
| 790 vsi_o_ttrace (Caller, TC_SYSTEM,"[PPM]: Invalid Partition Pool, group: %d, pool: %d", group_nr, pool_nr ); | |
| 791 } | |
| 792 } | |
| 793 #endif | |
| 794 | |
| 795 #ifndef RUN_FLASH | |
| 796 /* | |
| 797 +--------------------------------------------------------------------+ | |
| 798 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 799 | STATE : code ROUTINE : vsi_ppm_rec | | |
| 800 +--------------------------------------------------------------------+ | |
| 801 | |
| 802 PURPOSE : supervision of receiving a partition. | |
| 803 | |
| 804 */ | |
| 805 GLOBAL void vsi_ppm_rec ( T_HANDLE Caller, T_PRIM_HEADER *prim, const char *file, int line ) | |
| 806 { | |
| 807 T_PARTITION_STATUS *pPoolStatus; | |
| 808 USHORT group_nr, pool_nr; | |
| 809 | |
| 810 if ( prim != NULL ) | |
| 811 { | |
| 812 if ( get_partition_group ( prim, &group_nr, &pool_nr ) == VSI_OK ) | |
| 813 { | |
| 814 Caller = e_running[os_MyHandle()]; | |
| 815 /* | |
| 816 * set pointer to status entry of the currently used partition | |
| 817 */ | |
| 818 pPoolStatus = &PoolStatus.PartitionStatus [ P_PNR(prim) ]; | |
| 819 | |
| 820 /* | |
| 821 * send error message in case of an illegal state transition | |
| 822 */ | |
| 823 if ( pPoolStatus->Status & FORBIDDEN_RECEIVE_STATES ) | |
| 824 vsi_o_ttrace (Caller, TC_SYSTEM, | |
| 825 "[PPM]: %s->%s: %s(%d)", get_partition_state_name(pPoolStatus->Status), | |
| 826 get_partition_state_name(PARTITION_RECEIVED),rm_path(file),line ); | |
| 827 | |
| 828 /* | |
| 829 * update partition status | |
| 830 */ | |
| 831 SetPartitionStatus ( pPoolStatus, file, line, P_OPC(prim), PARTITION_RECEIVED, Caller ); | |
| 832 update_dyn_state ( Caller, prim, Caller, PARTITION_RECEIVED, file, line ); | |
| 833 } | |
| 834 else | |
| 835 vsi_o_ttrace (Caller, TC_SYSTEM,"[PPM]: Invalid Partition Pool, group: %d, pool: %d", group_nr, pool_nr ); | |
| 836 } | |
| 837 } | |
| 838 #endif | |
| 839 | |
| 840 #ifndef RUN_INT_RAM | |
| 841 /* | |
| 842 +--------------------------------------------------------------------+ | |
| 843 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 844 | STATE : code ROUTINE : vsi_ppm_access | | |
| 845 +--------------------------------------------------------------------+ | |
| 846 | |
| 847 PURPOSE : supervision of receiving a partition. | |
| 848 | |
| 849 */ | |
| 850 GLOBAL void vsi_ppm_access ( T_HANDLE Caller, T_PRIM_HEADER *prim, const char *file, int line ) | |
| 851 { | |
| 852 T_PARTITION_STATUS *pPoolStatus; | |
| 853 USHORT group_nr, pool_nr; | |
| 854 | |
| 855 if ( prim != NULL ) | |
| 856 { | |
| 857 if ( get_partition_group ( prim, &group_nr, &pool_nr ) == VSI_OK ) | |
| 858 { | |
| 859 Caller = e_running[os_MyHandle()]; | |
| 860 /* | |
| 861 * set pointer to status entry of the currently used partition | |
| 862 */ | |
| 863 pPoolStatus = &PoolStatus.PartitionStatus [ P_PNR(prim) ]; | |
| 864 | |
| 865 /* | |
| 866 * send error message in case of an illegal state transition | |
| 867 */ | |
| 868 if ( pPoolStatus->Status & FORBIDDEN_ACCESS_STATES ) | |
| 869 vsi_o_ttrace (Caller, TC_SYSTEM, | |
| 870 "[PPM]: %s->%s: %s(%d)", get_partition_state_name(pPoolStatus->Status), | |
| 871 get_partition_state_name(PARTITION_ACCESSED),rm_path(file),line ); | |
| 872 | |
| 873 /* | |
| 874 * update partition status | |
| 875 */ | |
| 876 SetPartitionStatus ( pPoolStatus, file, line, P_OPC(prim), pPoolStatus->Status, Caller ); | |
| 877 update_dyn_state ( Caller, prim, Caller, PARTITION_ACCESSED, file, line ); | |
| 878 } | |
| 879 else | |
| 880 vsi_o_ttrace (Caller, TC_SYSTEM,"[PPM]: Invalid Partition Pool, group: %d, pool: %d", group_nr, pool_nr ); | |
| 881 } | |
| 882 } | |
| 883 #endif | |
| 884 | |
| 885 #ifndef RUN_FLASH | |
| 886 /* | |
| 887 +--------------------------------------------------------------------+ | |
| 888 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 889 | STATE : code ROUTINE : vsi_ppm_send | | |
| 890 +--------------------------------------------------------------------+ | |
| 891 | |
| 892 PURPOSE : supervision of receiving a partition. | |
| 893 | |
| 894 */ | |
| 895 GLOBAL void vsi_ppm_send ( T_HANDLE Caller, T_HANDLE rcv, T_PRIM_HEADER *prim, const char *file, int line ) | |
| 896 { | |
| 897 T_PARTITION_STATUS *pPoolStatus; | |
| 898 USHORT NewStatus = PARTITION_SENT; | |
| 899 USHORT group_nr, pool_nr; | |
| 900 | |
| 901 if ( prim != NULL ) | |
| 902 { | |
| 903 if ( get_partition_group ( prim, &group_nr, &pool_nr ) == VSI_OK ) | |
| 904 { | |
| 905 Caller = e_running[os_MyHandle()]; | |
| 906 /* | |
| 907 * set pointer to status entry of the currently used partition | |
| 908 */ | |
| 909 pPoolStatus = &PoolStatus.PartitionStatus [ P_PNR(prim) ]; | |
| 910 | |
| 911 | |
| 912 /* | |
| 913 * send error message in case of an illegal state transition | |
| 914 */ | |
| 915 if ( pPoolStatus->Status & FORBIDDEN_SEND_STATES ) | |
| 916 vsi_o_ttrace (Caller, TC_SYSTEM, | |
| 917 "[PPM]: %s->%s: %s(%d)", get_partition_state_name(pPoolStatus->Status), | |
| 918 get_partition_state_name(PARTITION_SENT),rm_path(file),line ); | |
| 919 | |
| 920 /* | |
| 921 * check if more bytes written than requested during allocation | |
| 922 */ | |
| 923 if ( *((char*)prim + pPoolStatus->RequestedSize - 1) != PPM_END_MARKER ) | |
| 924 { | |
| 925 if ( prim->dph_offset == 0 ) | |
| 926 vsi_o_ttrace ( NO_TASK, TC_SYSTEM, "SYSTEM WARNING: Bytes written > requested partition size, %s(%d)", rm_path(file), line ); | |
| 927 } | |
| 928 /* | |
| 929 * update partition status | |
| 930 */ | |
| 931 SetPartitionStatus ( pPoolStatus, file, line, P_OPC(prim), NewStatus, (T_HANDLE)(OWNER_IS_COM_HANDLE|rcv) ); | |
| 932 update_dyn_state ( Caller, prim, rcv, PARTITION_SENT, file, line ); | |
| 933 } | |
| 934 else | |
| 935 vsi_o_ttrace (Caller, TC_SYSTEM,"[PPM]: Invalid Partition Pool, group: %d, pool: %d", group_nr, pool_nr ); | |
| 936 } | |
| 937 } | |
| 938 #endif | |
| 939 | |
| 940 #ifndef RUN_INT_RAM | |
| 941 /* | |
| 942 +--------------------------------------------------------------------+ | |
| 943 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 944 | STATE : code ROUTINE : vsi_ppm_store | | |
| 945 +--------------------------------------------------------------------+ | |
| 946 | |
| 947 PURPOSE : supervision of storing a partition. | |
| 948 | |
| 949 */ | |
| 950 GLOBAL void vsi_ppm_store ( T_HANDLE Caller, T_PRIM_HEADER *prim, const char *file, int line ) | |
| 951 { | |
| 952 T_PARTITION_STATUS *pPoolStatus; | |
| 953 USHORT group_nr, pool_nr; | |
| 954 | |
| 955 if ( prim != NULL ) | |
| 956 { | |
| 957 if ( get_partition_group ( prim, &group_nr, &pool_nr ) == VSI_OK ) | |
| 958 { | |
| 959 Caller = e_running[os_MyHandle()]; | |
| 960 /* | |
| 961 * set pointer to status entry of the currently used partition | |
| 962 */ | |
| 963 pPoolStatus = &PoolStatus.PartitionStatus [ P_PNR(prim) ]; | |
| 964 | |
| 965 /* | |
| 966 * send error message in case of an illegal state transition | |
| 967 */ | |
| 968 if ( pPoolStatus->Status & FORBIDDEN_STORE_STATES ) | |
| 969 vsi_o_ttrace (Caller, TC_SYSTEM, | |
| 970 "[PPM]: %s->%s: %s(%d)", get_partition_state_name(pPoolStatus->Status), | |
| 971 get_partition_state_name(PARTITION_STORED),rm_path(file),line ); | |
| 972 | |
| 973 /* | |
| 974 * update partition status | |
| 975 */ | |
| 976 SetPartitionStatus ( pPoolStatus, file, line, P_OPC(prim), pPoolStatus->Status, Caller ); | |
| 977 } | |
| 978 else | |
| 979 vsi_o_ttrace (Caller, TC_SYSTEM,"[PPM]: Invalid Partition Pool, group: %d, pool: %d", group_nr, pool_nr ); | |
| 980 } | |
| 981 } | |
| 982 #endif | |
| 983 | |
| 984 #ifndef RUN_INT_RAM | |
| 985 /* | |
| 986 +--------------------------------------------------------------------+ | |
| 987 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 988 | STATE : code ROUTINE : vsi_ppm_reuse | | |
| 989 +--------------------------------------------------------------------+ | |
| 990 | |
| 991 PURPOSE : supervision of reusing a partition. | |
| 992 | |
| 993 */ | |
| 994 GLOBAL void vsi_ppm_reuse ( T_HANDLE Caller, T_PRIM_HEADER *prim, const char *file, int line ) | |
| 995 { | |
| 996 T_PARTITION_STATUS *pPoolStatus; | |
| 997 ULONG OldSize, NewSize; | |
| 998 USHORT group_nr, pool_nr; | |
| 999 | |
| 1000 if ( prim != NULL ) | |
| 1001 { | |
| 1002 if ( get_partition_group ( prim, &group_nr, &pool_nr ) == VSI_OK ) | |
| 1003 { | |
| 1004 Caller = e_running[os_MyHandle()]; | |
| 1005 /* | |
| 1006 * set pointer to status entry of the currently used partition | |
| 1007 */ | |
| 1008 pPoolStatus = &PoolStatus.PartitionStatus [ P_PNR(prim) ]; | |
| 1009 | |
| 1010 /* | |
| 1011 * send error message in case of an illegal state transition | |
| 1012 */ | |
| 1013 if ( pPoolStatus->Status & FORBIDDEN_REUSE_STATES ) | |
| 1014 vsi_o_ttrace (Caller, TC_SYSTEM, | |
| 1015 "[PPM]: %s->%s: %s(%d)", get_partition_state_name(pPoolStatus->Status), | |
| 1016 get_partition_state_name(PARTITION_REUSED),rm_path(file),line ); | |
| 1017 | |
| 1018 /* | |
| 1019 * update partition status | |
| 1020 */ | |
| 1021 SetPartitionStatus ( pPoolStatus, file, line, P_OPC(prim), PARTITION_REUSED, Caller ); | |
| 1022 update_dyn_state ( Caller, prim, Caller, PARTITION_REUSED, file, line ); | |
| 1023 /* | |
| 1024 * if the new primitive exceeds the size of the partition, then | |
| 1025 * - store file, line and primitive opc | |
| 1026 * - send an error message | |
| 1027 */ | |
| 1028 #if 0 | |
| 1029 if ( (ULONG)(P_LEN(prim)) > PoolGroupConfig[PrimGroupHandle]->PoolConfig[P_PGR(prim)].PartitionSize ) | |
| 1030 { | |
| 1031 PoolStatus.PartitionOversize [P_PGR(prim)].Userfile = file; | |
| 1032 PoolStatus.PartitionOversize [P_PGR(prim)].Line = line; | |
| 1033 PoolStatus.PartitionOversize [P_PGR(prim)].PrimOPC = P_OPC(prim); | |
| 1034 vsi_o_assert (NO_TASK, OS_SYST_ERR_OVERSIZE, file, line, "PREUSE - oversize error in %s", | |
| 1035 pf_TaskTable[Caller].Name ); | |
| 1036 } | |
| 1037 #endif | |
| 1038 #ifdef OPTIMIZE_POOL | |
| 1039 /* | |
| 1040 * if the old and new primitve have different sizes, then | |
| 1041 * - decrement byte counter by old size | |
| 1042 * - decrement old range counter | |
| 1043 * - increment new range counter | |
| 1044 * - increment byte counter by new size | |
| 1045 */ | |
| 1046 if ( (OldSize=pPoolStatus->UsedSize) NEQ (NewSize=P_LEN(prim)) ) | |
| 1047 { | |
| 1048 UpdatePoolCounter ( &PoolStatus.ByteCounter [P_PGR(prim)],DECREMENT,OldSize ); | |
| 1049 UpdatePoolCounter ( &PoolStatus.RangeCounter [ GetPartitionRange(OldSize,group_nr,pool_nr) ], DECREMENT, 1 ); | |
| 1050 UpdatePoolCounter ( &PoolStatus.RangeCounter [ GetPartitionRange(NewSize,group_nr,pool_nr) ], INCREMENT, 1 ); | |
| 1051 pPoolStatus->UsedSize = NewSize; | |
| 1052 if ( UpdatePoolCounter ( &PoolStatus.ByteCounter [P_PGR(prim)],INCREMENT,NewSize ) ) | |
| 1053 { | |
| 1054 StoreRangeCounters ( prim, STORE_MAX_BYTE ); | |
| 1055 UpdatePoolCounter ( &PoolStatus.PartitionCounter [ P_PGR(prim) ], STORE_MAX_BYTE,0 ); | |
| 1056 } | |
| 1057 } | |
| 1058 #endif /* OPTIMIZE_POOL */ | |
| 1059 } | |
| 1060 else | |
| 1061 vsi_o_ttrace (Caller, TC_SYSTEM,"[PPM]: Invalid Partition Pool, group: %d, pool: %d", group_nr, pool_nr ); | |
| 1062 } | |
| 1063 } | |
| 1064 #endif | |
| 1065 | |
| 1066 #ifndef RUN_FLASH | |
| 1067 /* | |
| 1068 +--------------------------------------------------------------------+ | |
| 1069 | PROJECT : GSM-Frame (8415) MODULE : VSI_PPM | | |
| 1070 | STATE : code ROUTINE : vsi_ppm_free | | |
| 1071 +--------------------------------------------------------------------+ | |
| 1072 | |
| 1073 PURPOSE : supervision of deallocating a partition. | |
| 1074 | |
| 1075 */ | |
| 1076 GLOBAL void vsi_ppm_free ( T_HANDLE Caller, T_PRIM_HEADER *prim, const char *file, int line ) | |
| 1077 { | |
| 1078 T_PARTITION_STATUS *pPoolStatus; | |
| 1079 USHORT group_nr, pool_nr; | |
| 1080 T_HANDLE owner; | |
| 1081 | |
| 1082 if ( prim != NULL ) | |
| 1083 { | |
| 1084 if ( get_partition_group ( prim, &group_nr, &pool_nr ) == VSI_OK ) | |
| 1085 { | |
| 1086 Caller = e_running[os_MyHandle()]; | |
| 1087 prim->opc = 0; | |
| 1088 /* | |
| 1089 * set pointer to status entry of the currently used partition | |
| 1090 */ | |
| 1091 pPoolStatus = &PoolStatus.PartitionStatus [ P_PNR(prim) ]; | |
| 1092 | |
| 1093 /* | |
| 1094 * send error message in case of an illegal state transition | |
| 1095 */ | |
| 1096 if ( pPoolStatus->Status & FORBIDDEN_DEALLOCATE_STATES ) | |
| 1097 vsi_o_ttrace (Caller, TC_SYSTEM, | |
| 1098 "[PPM]: %s->%s: %s(%d)", get_partition_state_name(pPoolStatus->Status), | |
| 1099 get_partition_state_name(PARTITION_FREED),file,line ); | |
| 1100 | |
| 1101 | |
| 1102 /* CURRENTLY DISABLED FOR UMTS RELEASE */ | |
| 1103 if ( pPoolStatus->owner & OWNER_IS_COM_HANDLE ) | |
| 1104 { | |
| 1105 owner = pPoolStatus->owner&~OWNER_IS_COM_HANDLE; | |
| 1106 vsi_o_ttrace (NO_TASK, TC_SYSTEM, | |
| 1107 "SYSTEM WARNING: %s freed partition stored in %s queue, %s(%d)", | |
| 1108 pf_TaskTable[Caller].Name,pf_TaskTable[owner].Name,rm_path(file),line ); | |
| 1109 } | |
| 1110 if ( ppm_check_partition_owner == 1 ) | |
| 1111 { | |
| 1112 if ( (pPoolStatus->owner & ~OWNER_IS_COM_HANDLE) != Caller ) | |
| 1113 { | |
| 1114 owner = pPoolStatus->owner&~OWNER_IS_COM_HANDLE; | |
| 1115 vsi_o_ttrace (NO_TASK, TC_SYSTEM, | |
| 1116 "SYSTEM WARNING: %s freed partition belonging to %s, %s(%d)", | |
| 1117 pf_TaskTable[Caller].Name,pf_TaskTable[owner].Name,rm_path(file),line ); | |
| 1118 } | |
| 1119 } | |
| 1120 | |
| 1121 if ( !(pPoolStatus->Status & PARTITION_FREED) ) | |
| 1122 { | |
| 1123 #ifdef OPTIMIZE_POOL | |
| 1124 /* | |
| 1125 * decrement byte counter by primitive size | |
| 1126 * decrement range counter | |
| 1127 * decrement partition counter | |
| 1128 */ | |
| 1129 UpdatePoolCounter ( &PoolStatus.ByteCounter [ P_PGR(prim) ], DECREMENT, pPoolStatus->UsedSize ); | |
| 1130 UpdatePoolCounter ( &PoolStatus.RangeCounter [GetPartitionRange(pPoolStatus->UsedSize,group_nr,pool_nr)], DECREMENT, 1 ) ; | |
| 1131 #endif /* OPTIMIZE_POOL */ | |
| 1132 UpdatePoolCounter ( &PoolStatus.PartitionCounter [ P_PGR(prim) ], DECREMENT, 1 ); | |
| 1133 } | |
| 1134 | |
| 1135 /* | |
| 1136 * update partition status | |
| 1137 */ | |
| 1138 SetPartitionStatus ( pPoolStatus, file, line, 0, PARTITION_FREED, 0 ); | |
| 1139 } | |
| 1140 else | |
| 1141 vsi_o_ttrace (Caller, TC_SYSTEM,"[PPM]: Invalid Partition Pool, group: %d, pool: %d", group_nr, pool_nr ); | |
| 1142 } | |
| 1143 } | |
| 1144 #endif | |
| 1145 | |
| 1146 #ifndef RUN_FLASH | |
| 1147 GLOBAL void vsi_ppm_setend ( T_PRIM_HEADER *prim, ULONG size ) | |
| 1148 { | |
| 1149 *((char*)prim + size ) = PPM_END_MARKER; | |
| 1150 PoolStatus.PartitionStatus[P_PNR(prim)].RequestedSize = size+1; | |
| 1151 } | |
| 1152 #endif | |
| 1153 #endif /* MEMORY_SUPERVISION */ |
