private void CreateRegisterParagraphs(ParserEngine aEngine, NThread aThread, ParserElementBase.ElementCompleteHandler aLastFieldHandler) { { ParserParagraph para = new ParserParagraph("NTHREAD_REGS1"); para.SetTargetMethod(aThread.Registers, "Add"); ParserLine l1 = ParserLine.NewSymFormat("FPEXC %08x\r\n"); ParserLine l2 = ParserLine.NewSymFormat("CAR %08x\r\n"); ParserLine l3 = ParserLine.NewSymFormat("DACR %08x\r\n"); para.Add(l1, l2, l3); aEngine.Add(para); } { ParserParagraph para = new ParserParagraph("NTHREAD_REGS2"); para.SetTargetMethod(aThread.Registers, "Add"); ParserLine l1 = ParserLine.NewSymFormat("R13_USR %08x R14_USR %08x SPSR_SVC %08x\r\n"); ParserLine l2 = ParserLine.NewSymFormat(" R4 %08x R5 %08x R6 %08x R7 %08x\r\n"); ParserLine l3 = ParserLine.NewSymFormat(" R8 %08x R9 %08x R10 %08x R11 %08x\r\n"); ParserLine l4 = ParserLine.NewSymFormat(" PC %08x\r\n"); // if (aLastFieldHandler != null) { l4[0].ElementComplete += new ParserElementBase.ElementCompleteHandler(aLastFieldHandler); } // para.Add(l1, l2, l3, l4); aEngine.Add(para); } }
public ParserParagraph CreateEntryDetector(string aObjectName, ParserElementBase.ElementCompleteHandler aNewEntryHandler) { ParserParagraph para = new ParserParagraph("MONITOR_ENTRY_DETECTOR"); // If the "new entry handler" object is utilised, the client wishes to detect when a new entry is created. // This detection will act as a transient call-back to the client - and won't be used to gather any specific // information besides that a new entry has been detected. Furthermore, the entry will be non-consuming and // dequeue itself once it "fires" since it's purpose has then been served. if (aNewEntryHandler == null) { throw new ArgumentException("aNewEntryHandler cannot be NULL"); } ParserLine newEntryLine = ParserLine.NewSymFormat(aObjectName.ToUpper() + " at %08x VPTR=%08x AccessCount=%d Owner=%08x\r\n"); newEntryLine.ElementComplete += new ParserElementBase.ElementCompleteHandler(aNewEntryHandler); newEntryLine.DequeueIfComplete = true; newEntryLine.NeverConsumesLine = true; para.Add(newEntryLine); return(para); }
public void CreateMonitorThread(ParserEngine aEngine, string aName, DThread aThread, ParserElementBase.ElementCompleteHandler aLastFieldHandler) { // Create DObject paragraph ParserParagraph para0 = base.CreateMonitorObjectParagraph(aName, aThread); aEngine.Add(para0); // Create MState paragraphs ParserParagraph para1 = new ParserParagraph(aName + "_MSTATE"); para1.Tag = aThread; aEngine.Add(para1); CreateThreadMState(para1, DThread.TThreadState.ECreated, "CREATED", false); CreateThreadMState(para1, DThread.TThreadState.EDead, "DEAD", false); CreateThreadMState(para1, DThread.TThreadState.EReady, "READY", false); CreateThreadMState(para1, DThread.TThreadState.EWaitSemaphore, "WAITSEM", true); CreateThreadMState(para1, DThread.TThreadState.EWaitSemaphoreSuspended, "WAITSEMS", true); CreateThreadMState(para1, DThread.TThreadState.EWaitMutex, "WAITMUTEX", true); CreateThreadMState(para1, DThread.TThreadState.EWaitMutexSuspended, "WAITMUTXS", true); CreateThreadMState(para1, DThread.TThreadState.EHoldMutexPending, "HOLDMUTXP", true); CreateThreadMState(para1, DThread.TThreadState.EWaitCondVar, "WAITCONDVAR", true); CreateThreadMState(para1, DThread.TThreadState.EWaitCondVarSuspended, "WAITCONDVRS", true); CreateThreadMState(para1, DThread.TThreadState.EUnknown, "??", true); // Create common thread paragraph ParserParagraph para2 = CreateThreadCommon(aName, aThread); aEngine.Add(para2); // Create NThread paragraphs iHelper.CreateMonitorNThread(aEngine, aName + "_NTHREAD", aThread.NThread, aLastFieldHandler); // TODO: add support for older memory models? }
public void CreateMonitorNThread(ParserEngine aEngine, string aName, NThread aThread, ParserElementBase.ElementCompleteHandler aLastFieldHandler) { // Create MState lines ParserParagraph para0 = new ParserParagraph(aName + "_NSTATE"); para0.Tag = aThread; CreateThreadNState(para0, aThread, "READY", false); CreateThreadNState(para0, aThread, "SUSPENDED", false); CreateThreadNState(para0, aThread, "WAITFSEM", true); CreateThreadNState(para0, aThread, "SLEEP", false); CreateThreadNState(para0, aThread, "BLOCKED", false); CreateThreadNState(para0, aThread, "DEAD", false); CreateThreadNState(para0, aThread, "WAITDFC", false); CreateThreadNState(para0, aThread, "??", true); aEngine.Add(para0); ParserParagraph para1 = CreateThreadCommon(aName, aThread); aEngine.Add(para1); CreateRegisterParagraphs(aEngine, aThread, aLastFieldHandler); // TODO: add support for older memory models? }
public void CreateMonitorProcess(ParserEngine aEngine, string aName, DProcess aProcess, ParserElementBase.ElementCompleteHandler aLastFieldHandler) { ParserParagraph para0 = base.CreateMonitorObjectParagraph(aName, aProcess); aEngine.Add(para0); ParserParagraph para1 = CreateMonitorProcessCommon(aName, aProcess); aEngine.Add(para1); ParserParagraph para2 = CreateMonitorProcessCodeSegs(aName + "_CodeSegs", aProcess); aEngine.Add(para2); ParserParagraph para3 = CreateMonitorProcessMemModelMultiple(aName + "_MemModel_Multiple", aProcess, aLastFieldHandler); aEngine.Add(para3); // TODO: add support for older memory models? }
private ParserParagraph CreateMonitorProcessMemModelMultiple(string aName, DProcess aProcess, ParserElementBase.ElementCompleteHandler aLastFieldHandler) { ParserParagraph para = new ParserParagraph(aName); para.Tag = aProcess; if (aLastFieldHandler != null) { para.ElementComplete += new ParserElementBase.ElementCompleteHandler(aLastFieldHandler); } // Misc ParserLine l0 = ParserLine.NewSymFormat("OS ASID=%d, LPD=%08x, GPD=%08x\r\n"); l0.SetTargetProperties(aProcess, "OSASID", "LPD", "GPD"); // Loop body - construct this first as we use it for the header line ParserLine l2 = ParserLine.NewSymFormat("%d: Chunk %08x, access count %d\r\n"); l2[0].SetTargetObject(); l2[1].SetTargetMethod(this, "AddChunkToProcess"); l2[2].SetTargetMethod(this, "SetChunkAccessCount"); // Loop header ParserLine l1 = ParserLine.NewSymFormat("ChunkCount=%d ChunkAlloc=%d\r\n"); l1[0].SetTargetMethod(l2, "SetRepetitions"); para.Add(l0, l1, l2); return(para); }