/* ************************************************************************** * * Component = * * Synopsis = rdbgexcep.c * * $Id$ * ************************************************************************** */ #include #include #include #include #include #include unsigned int NbExceptCtx; volatile unsigned int NbSerializedCtx; Exception_context *FirstCtx = NULL; Exception_context *LastCtx = NULL; CPU_Exception_frame SavedContext; /********* Save an exception context at the end of a list *****/ int PushExceptCtx ( Objects_Id Id, Objects_Id semId, CPU_Exception_frame *ctx ) { Exception_context *SaveCtx; SaveCtx = (Exception_context *)malloc(sizeof(Exception_context)); if (SaveCtx == NULL) rtems_panic("Can't allocate memory to save Exception context"); SaveCtx->id = Id; SaveCtx->ctx = ctx; SaveCtx->semaphoreId = semId; SaveCtx->previous = NULL; SaveCtx->next = NULL; if (FirstCtx == NULL){ /* initialization */ FirstCtx = SaveCtx; LastCtx = SaveCtx; NbExceptCtx = 1; } else { NbExceptCtx ++; LastCtx->next = SaveCtx; SaveCtx->previous = LastCtx; LastCtx = SaveCtx; } return 0; } /********* Save an temporary exception context in a ******/ /********* global variable ******/ int PushSavedExceptCtx ( Objects_Id Id, CPU_Exception_frame *ctx ) { memcpy (&(SavedContext), ctx, sizeof(CPU_Exception_frame)); return 0; } /****** Remove the context of the specified Id thread *********/ /****** If Id = -1, then return the first context *********/ int PopExceptCtx ( Objects_Id Id ) { Exception_context *ExtractCtx; if (FirstCtx == NULL) return -1; if (Id == -1) { ExtractCtx = LastCtx; LastCtx = LastCtx->previous; free(ExtractCtx); NbExceptCtx --; return 0; } ExtractCtx = LastCtx; while (ExtractCtx->id != Id && ExtractCtx != NULL) { ExtractCtx = ExtractCtx->previous; } if (ExtractCtx == NULL) return -1; if ( ExtractCtx->previous != NULL) (ExtractCtx->previous)->next = ExtractCtx->next; if ( ExtractCtx->next != NULL) (ExtractCtx->next)->previous = ExtractCtx->previous; if (ExtractCtx == FirstCtx) FirstCtx = FirstCtx->next; else if (ExtractCtx == LastCtx) LastCtx = LastCtx->previous; free(ExtractCtx); NbExceptCtx --; return 0; } /****** Return the context of the specified Id thread *********/ /****** If Id = -1, then return the first context *********/ Exception_context *GetExceptCtx ( Objects_Id Id ) { Exception_context *ExtractCtx; if (FirstCtx == NULL) return NULL; if (Id == -1) { return LastCtx; } ExtractCtx = LastCtx; while (ExtractCtx->id != Id && ExtractCtx != NULL) { ExtractCtx = ExtractCtx->previous; } if (ExtractCtx == NULL) return NULL; return ExtractCtx; }