mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-30 06:47:21 +08:00
GP-0: Fix timing issue in emulator service and p-code stepper test.
This commit is contained in:
+10
-8
@@ -90,16 +90,18 @@ public class DebuggerPcodeStepperProviderTest extends AbstractGhidraHeadedDebugg
|
|||||||
traceManager.openTrace(tb.trace);
|
traceManager.openTrace(tb.trace);
|
||||||
traceManager.activateThread(thread);
|
traceManager.activateThread(thread);
|
||||||
traceManager.activateTime(schedule1);
|
traceManager.activateTime(schedule1);
|
||||||
|
waitForPass(() -> assertEquals(schedule1, pcodeProvider.current.getTime()));
|
||||||
DebuggerTracePcodeEmulator emu =
|
|
||||||
waitForValue(() -> emuService.getCachedEmulator(tb.trace, schedule1));
|
|
||||||
assertNotNull(emu);
|
|
||||||
|
|
||||||
// P-code step to decode already done. One for each op. One to retire.
|
// P-code step to decode already done. One for each op. One to retire.
|
||||||
TraceSchedule schedule2 =
|
TraceSchedule schedule2 =
|
||||||
schedule1.steppedPcodeForward(thread, imm1234.getPcode().length + 1);
|
schedule1.steppedPcodeForward(thread, imm1234.getPcode().length + 1);
|
||||||
PcodeThread<byte[]> et = emu.getThread(thread.getPath(), false);
|
|
||||||
traceManager.activateTime(schedule2);
|
traceManager.activateTime(schedule2);
|
||||||
|
waitForPass(() -> assertEquals(schedule2, pcodeProvider.current.getTime()));
|
||||||
|
|
||||||
|
DebuggerTracePcodeEmulator emu =
|
||||||
|
waitForValue(() -> emuService.getCachedEmulator(tb.trace, schedule2));
|
||||||
|
assertNotNull(emu);
|
||||||
|
PcodeThread<byte[]> et = emu.getThread(thread.getPath(), false);
|
||||||
waitForPass(() -> assertNull(et.getFrame()));
|
waitForPass(() -> assertNull(et.getFrame()));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -110,13 +112,13 @@ public class DebuggerPcodeStepperProviderTest extends AbstractGhidraHeadedDebugg
|
|||||||
*/
|
*/
|
||||||
emu.addBreakpoint(imm2045.getAddress(), "1:1");
|
emu.addBreakpoint(imm2045.getAddress(), "1:1");
|
||||||
|
|
||||||
// Just one to decode is necessary
|
// Just one p-code step to decode
|
||||||
TraceSchedule schedule3 = schedule2.steppedPcodeForward(thread, 1);
|
TraceSchedule schedule3 = schedule2.steppedPcodeForward(thread, 1);
|
||||||
traceManager.activateTime(schedule3);
|
traceManager.activateTime(schedule3);
|
||||||
waitForPass(() -> assertEquals(schedule3, pcodeProvider.current.getTime()));
|
waitForPass(() -> assertEquals(schedule3, pcodeProvider.current.getTime()));
|
||||||
|
|
||||||
assertTrue(pcodeProvider.pcodeTableModel.getModelData()
|
waitForPass(() -> assertTrue(pcodeProvider.pcodeTableModel.getModelData()
|
||||||
.stream()
|
.stream()
|
||||||
.anyMatch(r -> r.getCode().contains("emu_swi")));
|
.anyMatch(r -> r.getCode().contains("emu_swi"))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -135,7 +135,10 @@ public abstract class AnnotatedSleighUseropLibrary<T> implements SleighUseropLib
|
|||||||
Class<T> opType = getOperandType();
|
Class<T> opType = getOperandType();
|
||||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||||
Class<? extends AnnotatedSleighUseropLibrary<T>> cls = (Class) this.getClass();
|
Class<? extends AnnotatedSleighUseropLibrary<T>> cls = (Class) this.getClass();
|
||||||
Set<Method> methods = CACHE_BY_CLASS.computeIfAbsent(cls, __ -> collectDefinitions(cls));
|
Set<Method> methods;
|
||||||
|
synchronized (CACHE_BY_CLASS) {
|
||||||
|
methods = CACHE_BY_CLASS.computeIfAbsent(cls, __ -> collectDefinitions(cls));
|
||||||
|
}
|
||||||
for (Method m : methods) {
|
for (Method m : methods) {
|
||||||
ops.put(m.getName(), new AnnotatedSleighUseropDefinition<>(this, opType, lookup, m));
|
ops.put(m.getName(), new AnnotatedSleighUseropDefinition<>(this, opType, lookup, m));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user