// ============================================================================= // sxs_CheckPendingTk // ----------------------------------------------------------------------------- /// Trace out a diagnostic information for all the pending or active task. // ============================================================================= void sxs_CheckPendingTk (void) { u32 i; for (i=0; i<SXR_NB_MAX_TASK; i++) { if ((sxr_Task.Ctx [i].State == SXR_PENDING_TSK) || (sxr_Task.Ctx [i].State == SXR_ACTIVE_TSK)) { if (sxr_Task.Ctx [i].State == SXR_PENDING_TSK) { SXS_TRACE (_SXR|TSMAP(1)|TSTDOUT|TNB_ARG(1)|TDB,TSTR("Task %s is Pending\n",0x06c3000f), sxr_Task.Ctx [i].Desc -> Name); } else { SXS_TRACE (_SXR|TSMAP(1)|TSTDOUT|TNB_ARG(1)|TDB,TSTR("Task %s is Active\n",0x06c30010), sxr_Task.Ctx [i].Desc -> Name); } // sxs_BackTrace (sxr_GetTkPcInStack (sxr_Task.Ctx [i].Sp), sxr_Task.Ctx [i].Sp); } } }
// ============================================================================= // sxr_ChkTask // ----------------------------------------------------------------------------- /// Trace out a diagnostic information for a task. /// @param TkNb Task Id. // ============================================================================= void sxr_ChkTask (u8 TkNb) { { if ( sxr_Task.Ctx [TkNb].Id != SXR_NO_TASK) { SXS_FPRINTF ((_SXR|TSTDOUT|TSMAP(2)|TDB|TNB_ARG(3),TSTR("Task %2i: %s Priority %3i ",0x06c30005), TkNb, sxr_Task.Ctx [TkNb].Desc -> Name, sxr_Task.Ctx [TkNb].Desc -> Priority)); switch (sxr_Task.Ctx [TkNb].State) { case SXR_ALLOCATED_TSK : SXS_FPRINTF ((_SXR|TSTDOUT|TIDU|TDB,TSTR("is allocated.\n",0x06c30006))); break; case SXR_PENDING_TSK : SXS_FPRINTF ((_SXR|TSTDOUT|TIDU|TDB,TSTR("is pending.\n",0x06c30007))); break; case SXR_ACTIVE_TSK : SXS_FPRINTF ((_SXR|TSTDOUT|TIDU|TDB,TSTR("is active.\n",0x06c30008))); break; case SXR_SUSPENDED_TSK : SXS_FPRINTF ((_SXR|TSTDOUT|TIDU|TDB,TSTR("is suspended.\n",0x06c30009))); break; case SXR_WAIT_MSG_TSK : SXS_FPRINTF ((_SXR|TSTDOUT|TIDU|TDB,TSTR("wait for a message.\n",0x06c3000a))); break; default : SXS_FPRINTF ((_SXR|TSTDOUT|TIDU|TDB,TSTR("is broken...\n",0x06c3000b))); } #ifdef __SXR_STACK_CHECK__ { SXS_FPRINTF ((_SXR|TSTDOUT|TIDU|TDB|TNB_ARG(4),TSTR("Stack %3i/%3i Top 0x%lx <- 0x%lx\n",0x06c3000c), sxr_GetStackMaxUsage(TkNb), SXR_SET_STACK(sxr_Task.Ctx [TkNb].Desc -> StackSize) << 2, sxr_Task.Ctx [TkNb].StackTop, sxr_Task.Ctx [TkNb].StackTop + SXR_SET_STACK(sxr_Task.Ctx [TkNb].Desc -> StackSize))); } #endif } } }
// ============================================================================= // sxr_ChkMutex // ----------------------------------------------------------------------------- /// Display debug information about mutex /// @param Id mutex Id. // ============================================================================= void sxr_ChkMutex (u8 Id) { if (sxr_Mutex.Queue [Id].Next == SXR_MUTEX_ALLOCATED) { SXS_TRACE (_SXR|TSTDOUT|TDB|TNB_ARG(1),TSTR("Mutex %i:\n",0x06bf0012), Id); SXS_TRACE (_SXR|TSTDOUT|TSMAP(2)|TDB|TNB_ARG(3),TSTR("Owned by Task :%2i: %s Priority %3i\n",0x06bf0013), sxr_Mutex.Queue [Id].TaskId, sxr_Task.Ctx [sxr_Mutex.Queue [Id].TaskId].Desc -> Name, sxr_Task.Ctx [sxr_Mutex.Queue [Id].TaskId].Desc -> Priority); SXS_TRACE (_SXR|TSTDOUT|TDB|TNB_ARG(1),TSTR("Count:%d\n",0x06bf0014), sxr_Mutex.Queue [Id].Count); SXS_TRACE (_SXR|TSTDOUT|TDB|TNB_ARG(1),TSTR("First Take Caller: 0x%lx\n",0x06bf0015), sxr_Mutex.Queue [Id].CallerAdd); SXS_TRACE (_SXR|TSTDOUT|TDB|TNB_ARG(0),TSTR("Semaphore info:",0x06bf0016)); sxr_ChkSbx(sxr_Mutex.Queue [Id].SemaId); } }
void sxr_ChkUdtHp (u8 Idx) { sxr_HMemHead_t *HBlock = (sxr_HMemHead_t *)sxr_Heap [Idx].Start; u32 **PHBlock = (u32 **)&HBlock; u8 Cnt = 0; while (HBlock < (sxr_HMemHead_t *)sxr_Heap [Idx].Top) { if (HBlock != ((sxr_HMemHead_t *) ((u32 *)HBlock) [HBlock -> Size - 1])) { SXS_RAISE ((_SXR|TSMAP(0x18)|TDB|TNB_ARG(5),TSTR("Heap block consistency failure %lx Size %i Heap End %lx %s %s\n",0x06bc001b), HBlock, HBlock -> Size, sxr_Heap [Idx].End, sxr_GetTaskName (), sxr_GetJobName ())); } if (HBlock -> H.Index == SXR_HEAP_ALLOCATED) { if (!sxr_CheckSum (&HBlock -> H.CheckSum)) { SXS_RAISE ((_SXR|TSMAP(6)|TDB|TNB_ARG(3),TSTR("Heap Header consistency failure %lx %s %s\n",0x06bc001c), HBlock + 1, sxr_GetTaskName (), sxr_GetJobName ())); } if (((u8 *)HBlock)[sizeof (sxr_HMemHead_t) + (HBlock -> Size << 2) - HBlock -> H.DSize] != SXR_MEM_PATTERN) { SXS_RAISE ((_SXR|TSMAP(0x0A)|TDB|TNB_ARG(4),TSTR("Heap Footer erased %lx, %lxy %s %s\n",0x06bc001d), HBlock, HBlock -> H.CallerAdd, sxr_GetTaskName (), sxr_GetJobName ())); } } #ifdef __SXR_DEBUG__ else { u32 i; for (i= sizeof (sxr_HMemHead_t) / 4; i< HBlock -> Size - 1; i++) { if (((u32 *)HBlock) [i] != SXR_DW_MEM_PATTERN) { SXS_RAISE ((_SXR|TDB|TNB_ARG(2),TSTR("Heap memory deletion %lx (%lx)\n",0x06bc001e), &HBlock[i+1], HBlock[i+1])); } } } #endif if (HBlock -> Size > 0xFFFFF) { SXS_RAISE ((_SXR|TSMAP(0x0A)|TDB|TNB_ARG(4),TSTR("Heap destroyed. %lx %lx %s %s\n",0x06bc001f), HBlock, HBlock -> Size, sxr_GetTaskName (), sxr_GetJobName ())); } *PHBlock += HBlock -> Size; } if (HBlock != (sxr_HMemHead_t *)sxr_Heap [Idx].Top) { SXS_RAISE ((_SXR|TSMAP(0x0A)|TDB|TNB_ARG(4),TSTR("Heap unconsistency %lx / %lx %s %s\n",0x06bc0020), HBlock, sxr_Heap [Idx].End, sxr_GetTaskName (), sxr_GetJobName ())); } HBlock++; #ifdef __SXR_DEBUG__ while (HBlock < (sxr_HMemHead_t *)sxr_Heap [Idx].End) { if (*((u32 *)HBlock) != SXR_DW_MEM_PATTERN) { SXS_RAISE ((_SXR|TDB|TNB_ARG(3),TSTR("Heap memory deletion %lx (%lx), top %lx\n",0x06bc0021), HBlock, HBlock [0], sxr_Heap [Idx].Top)); } (*PHBlock)++; } #endif }
void sxr_CheckUpdateCluster (u8 *Ptr, u8 ClusterIdx) { u32 i; sxr_MemHead_t *Header = (sxr_MemHead_t *)(Ptr - sizeof (sxr_MemHead_t)); sxr_HMemHead_t *HBlock = ((sxr_HMemHead_t *)Ptr) - 1; u32 Size = (HBlock -> Size << 2) - HBlock -> H.DSize; #ifdef __SXR_DEBUG__ if (Ptr != NIL) { for (i=0; i<(u32)(sxr_Cluster [ClusterIdx].Size - Size); i++) { if (((u8 *)Ptr) [Size + i] != SXR_MEM_PATTERN) { SXS_RAISE ((_SXR|TDB|TNB_ARG(3),TSTR("Cluster memory deleted %lx offset %i (%lx)\n",0x06bc000f), (Ptr, Size + i, (u8 *)Ptr)[Size + i])); break; } } if (Header -> Link == 0) memset ((u8 *)Ptr, SXR_MEM_PATTERN, sxr_Cluster [ClusterIdx].Size); } #endif for (i=0; i<sxr_NbCluster; i++) { #ifdef __SXR_CLUSTER__ u32 j; for (j=0; j<sxr_Cluster [i].NbCluster; j++) { Header = (sxr_MemHead_t *)(&((u8 *)sxr_Cluster [i].Add) [j * sxr_Cluster [i].AlignSize]); Ptr = ((u8 *)Header) + sizeof (sxr_MemHead_t); if (!sxr_CheckSum (&Header -> CheckSum)) { SXS_RAISE ((_SXR|TSMAP(6)|TDB|TNB_ARG(3),TSTR("Cluster Header consistency failure %lx %s %s\n",0x06bc0010), Header + 1, sxr_GetTaskName (), sxr_GetJobName ())); } if ((((u8 *)sxr_Cluster [Header -> PIdx].Add) [((Header -> Index + 1) * sxr_Cluster [Header -> PIdx].AlignSize) -1]) != SXR_MEM_PATTERN) { SXS_RAISE ((_SXR | TSMAP(0x0A)|TDB|TNB_ARG(4),TSTR("Cluster Footer erased %lx, %lxy %s %s\n",0x06bc0011), Header + 1, Header -> CallerAdd, sxr_GetTaskName (), sxr_GetJobName ())); } #ifdef __SXR_DEBUG__ if (Header -> CallerAdd != SXR_POOL_FREE) { u32 k; for (k=0; k<(u32)(sxr_Cluster [i].Size - Header -> Size); k++) { if (((u8 *)Ptr) [Header -> Size + k] != SXR_MEM_PATTERN) { SXS_RAISE ((_SXR|TDB|TNB_ARG(3),TSTR("Cluster memory deletion %lx offset 0x%x (%lx)\n",0x06bc0012), Ptr, Header -> Size + k, ((u8 *)Ptr)[Header -> Size + k])); break; } } } else { u32 k; for (k=0; k<(sxr_Cluster [i].Size); k++) { if (((u8 *)Ptr) [k] != (SXR_MEM_PATTERN)) { SXS_RAISE ((_SXR|TDB|TNB_ARG(3),TSTR("Cluster memory deletion %lx offset 0x%x (%lx)\n",0x06bc0013), Ptr, k, ((u8 *)Ptr)[k])); break; } } } #endif } #else sxr_ChkUdtHp (PAL_NB_RAM_AREA + SXR_NB_HEAP_USER + i); #endif } }