GP-0: Fix control service.

This commit is contained in:
Dan 2023-12-06 10:11:04 -05:00
parent f9103016b1
commit 0e826aa1c7
2 changed files with 42 additions and 26 deletions

View file

@ -90,6 +90,14 @@ public enum ControlMode {
return false; return false;
} }
@Override
public ControlMode modeOnChange(DebuggerCoordinates coordinates) {
if (coordinates.isAliveAndPresent()) {
return this;
}
return getAlternative(coordinates);
}
@Override @Override
public boolean isSelectable(DebuggerCoordinates coordinates) { public boolean isSelectable(DebuggerCoordinates coordinates) {
return coordinates.isAlive(); return coordinates.isAlive();
@ -151,6 +159,14 @@ public enum ControlMode {
return false; return false;
} }
@Override
public ControlMode modeOnChange(DebuggerCoordinates coordinates) {
if (coordinates.isAliveAndPresent()) {
return this;
}
return getAlternative(coordinates);
}
@Override @Override
public boolean isSelectable(DebuggerCoordinates coordinates) { public boolean isSelectable(DebuggerCoordinates coordinates) {
return coordinates.isAlive(); return coordinates.isAlive();

View file

@ -42,7 +42,7 @@ import ghidra.trace.model.thread.TraceThread;
import ghidra.trace.model.time.schedule.TraceSchedule; import ghidra.trace.model.time.schedule.TraceSchedule;
public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest { public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest {
protected DebuggerControlService editingService; protected DebuggerControlService controlService;
protected Register r0; protected Register r0;
protected Register r0h; protected Register r0h;
@ -51,7 +51,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
protected RegisterValue rvHigh1234; protected RegisterValue rvHigh1234;
protected StateEditor createStateEditor() { protected StateEditor createStateEditor() {
return editingService.createStateEditor(tb.trace); return controlService.createStateEditor(tb.trace);
} }
protected void activateTrace() { protected void activateTrace() {
@ -86,7 +86,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
@Before @Before
public void setUpEditorTest() throws Exception { public void setUpEditorTest() throws Exception {
editingService = addPlugin(tool, DebuggerControlServicePlugin.class); controlService = addPlugin(tool, DebuggerControlServicePlugin.class);
Language toy = getToyBE64Language(); Language toy = getToyBE64Language();
r0 = toy.getRegister("r0"); r0 = toy.getRegister("r0");
r0h = toy.getRegister("r0h"); r0h = toy.getRegister("r0h");
@ -106,7 +106,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
createAndOpenTrace(); createAndOpenTrace();
activateTrace(); activateTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR); controlService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR);
StateEditor editor = createStateEditor(); StateEditor editor = createStateEditor();
assertFalse(editor.isVariableEditable(tb.addr(0x00400000), 4)); assertFalse(editor.isVariableEditable(tb.addr(0x00400000), 4));
@ -118,7 +118,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
@Test @Test
public void testWriteEmuRegisterNoThreadErr() throws Throwable { public void testWriteEmuRegisterNoThreadErr() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR); controlService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR);
activateTrace(); activateTrace();
waitForSwing(); waitForSwing();
@ -133,7 +133,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
@Test @Test
public void testWriteEmuMemory() throws Throwable { public void testWriteEmuMemory() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR); controlService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR);
try (Transaction tx = tb.startTransaction()) { try (Transaction tx = tb.startTransaction()) {
// NB. TraceManager should automatically activate the first thread // NB. TraceManager should automatically activate the first thread
@ -159,7 +159,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
@Test @Test
public void testWriteEmuRegister() throws Throwable { public void testWriteEmuRegister() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR); controlService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR);
TraceThread thread; TraceThread thread;
try (Transaction tx = tb.startTransaction()) { try (Transaction tx = tb.startTransaction()) {
@ -188,7 +188,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
@Test @Test
public void testWriteEmuMemoryAfterStep() throws Throwable { public void testWriteEmuMemoryAfterStep() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_TRACE); controlService.setCurrentMode(tb.trace, ControlMode.RW_TRACE);
try (Transaction tx = tb.startTransaction()) { try (Transaction tx = tb.startTransaction()) {
// NB. TraceManager should automatically activate the first thread // NB. TraceManager should automatically activate the first thread
@ -201,7 +201,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
tb.exec(getPlatform(), 0, thread, 0, "pc = 0x00400000;"); tb.exec(getPlatform(), 0, thread, 0, "pc = 0x00400000;");
} }
activateTrace(); activateTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR); controlService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR);
waitForSwing(); waitForSwing();
TraceSchedule step1 = TraceSchedule.parse("0:t0-1"); TraceSchedule step1 = TraceSchedule.parse("0:t0-1");
@ -226,7 +226,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
@Test @Test
public void testWriteEmuRegisterAfterStep() throws Throwable { public void testWriteEmuRegisterAfterStep() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_TRACE); controlService.setCurrentMode(tb.trace, ControlMode.RW_TRACE);
TraceThread thread; TraceThread thread;
try (Transaction tx = tb.startTransaction()) { try (Transaction tx = tb.startTransaction()) {
@ -240,7 +240,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
tb.exec(getPlatform(), 0, thread, 0, "pc = 0x00400000;"); tb.exec(getPlatform(), 0, thread, 0, "pc = 0x00400000;");
} }
activateTrace(); activateTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR); controlService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR);
waitForSwing(); waitForSwing();
TraceSchedule step1 = TraceSchedule.parse("0:t0-1"); TraceSchedule step1 = TraceSchedule.parse("0:t0-1");
@ -266,7 +266,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
@Test @Test
public void testWriteEmuMemoryTwice() throws Throwable { public void testWriteEmuMemoryTwice() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR); controlService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR);
try (Transaction tx = tb.startTransaction()) { try (Transaction tx = tb.startTransaction()) {
// NB. TraceManager should automatically activate the first thread // NB. TraceManager should automatically activate the first thread
@ -295,7 +295,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
@Test @Test
public void testWriteEmuRegisterTwice() throws Throwable { public void testWriteEmuRegisterTwice() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR); controlService.setCurrentMode(tb.trace, ControlMode.RW_EMULATOR);
TraceThread thread; TraceThread thread;
try (Transaction tx = tb.startTransaction()) { try (Transaction tx = tb.startTransaction()) {
@ -326,7 +326,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
public void testWriteTraceMemory() throws Throwable { public void testWriteTraceMemory() throws Throwable {
// NB. Definitely no thread required // NB. Definitely no thread required
createAndOpenTrace(); createAndOpenTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_TRACE); controlService.setCurrentMode(tb.trace, ControlMode.RW_TRACE);
activateTrace(); activateTrace();
waitForSwing(); waitForSwing();
@ -349,7 +349,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
public void testWriteTraceRegisterNoThreadErr() throws Throwable { public void testWriteTraceRegisterNoThreadErr() throws Throwable {
// NB. Definitely no thread required // NB. Definitely no thread required
createAndOpenTrace(); createAndOpenTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_TRACE); controlService.setCurrentMode(tb.trace, ControlMode.RW_TRACE);
activateTrace(); activateTrace();
waitForSwing(); waitForSwing();
@ -365,7 +365,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
public void testWriteTraceRegister() throws Throwable { public void testWriteTraceRegister() throws Throwable {
// NB. Definitely no thread required // NB. Definitely no thread required
createAndOpenTrace(); createAndOpenTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RW_TRACE); controlService.setCurrentMode(tb.trace, ControlMode.RW_TRACE);
TraceThread thread; TraceThread thread;
try (Transaction tx = tb.startTransaction()) { try (Transaction tx = tb.startTransaction()) {
@ -398,7 +398,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
activateTrace(); activateTrace();
traceManager.activateThread(recorder.getTraceThread(mb.testThread1)); traceManager.activateThread(recorder.getTraceThread(mb.testThread1));
waitForSwing(); waitForSwing();
editingService.setCurrentMode(recorder.getTrace(), ControlMode.RW_TARGET); controlService.setCurrentMode(recorder.getTrace(), ControlMode.RW_TARGET);
StateEditor editor = createStateEditor(); StateEditor editor = createStateEditor();
assertTrue(editor.isVariableEditable(tb.addr(0x00400000), 4)); assertTrue(editor.isVariableEditable(tb.addr(0x00400000), 4));
@ -418,7 +418,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
waitForSwing(); waitForSwing();
traceManager.activateThread(recorder.getTraceThread(mb.testThread1)); traceManager.activateThread(recorder.getTraceThread(mb.testThread1));
waitForSwing(); waitForSwing();
editingService.setCurrentMode(recorder.getTrace(), ControlMode.RW_TARGET); controlService.setCurrentMode(recorder.getTrace(), ControlMode.RW_TARGET);
StateEditor editor = createStateEditor(); StateEditor editor = createStateEditor();
assertTrue(editor.isRegisterEditable(r0)); assertTrue(editor.isRegisterEditable(r0));
@ -437,7 +437,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
TraceThread thread = waitForValue(() -> recorder.getTraceThread(mb.testThread1)); TraceThread thread = waitForValue(() -> recorder.getTraceThread(mb.testThread1));
traceManager.activateThread(thread); traceManager.activateThread(thread);
waitForSwing(); waitForSwing();
editingService.setCurrentMode(recorder.getTrace(), ControlMode.RW_TARGET); controlService.setCurrentMode(recorder.getTrace(), ControlMode.RW_TARGET);
StateEditor editor = createStateEditor(); StateEditor editor = createStateEditor();
waitForPass(() -> assertTrue(editor.isRegisterEditable(r0))); waitForPass(() -> assertTrue(editor.isRegisterEditable(r0)));
@ -463,15 +463,15 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
traceManager.activateThread(recorder.getTraceThread(mb.testThread1)); traceManager.activateThread(recorder.getTraceThread(mb.testThread1));
waitForSwing(); waitForSwing();
editingService.setCurrentMode(tb.trace, ControlMode.RW_TARGET); controlService.setCurrentMode(tb.trace, ControlMode.RW_TARGET);
waitForSwing(); waitForSwing();
assertEquals(recorder.getSnap(), traceManager.getCurrentSnap()); assertEquals(recorder.getSnap(), traceManager.getCurrentSnap());
traceManager.activateSnap(traceManager.getCurrentSnap() - 1); traceManager.activateSnap(traceManager.getCurrentSnap() - 1);
waitForSwing(); waitForSwing();
assertEquals(ControlMode.RW_EMULATOR, editingService.getCurrentMode(tb.trace)); assertEquals(ControlMode.RW_EMULATOR, controlService.getCurrentMode(tb.trace));
editingService.setCurrentMode(tb.trace, ControlMode.RW_TARGET); controlService.setCurrentMode(tb.trace, ControlMode.RW_TARGET);
waitForSwing(); waitForSwing();
assertEquals(recorder.getSnap(), traceManager.getCurrentSnap()); assertEquals(recorder.getSnap(), traceManager.getCurrentSnap());
} }
@ -481,7 +481,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
createAndOpenTrace(); createAndOpenTrace();
activateTrace(); activateTrace();
waitForSwing(); waitForSwing();
editingService.setCurrentMode(tb.trace, ControlMode.RW_TARGET); controlService.setCurrentMode(tb.trace, ControlMode.RW_TARGET);
waitForSwing(); waitForSwing();
StateEditor editor = createStateEditor(); StateEditor editor = createStateEditor();
@ -496,7 +496,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
createAndOpenTrace(); createAndOpenTrace();
activateTrace(); activateTrace();
waitForSwing(); waitForSwing();
editingService.setCurrentMode(tb.trace, ControlMode.RW_TARGET); controlService.setCurrentMode(tb.trace, ControlMode.RW_TARGET);
waitForSwing(); waitForSwing();
StateEditor editor = createStateEditor(); StateEditor editor = createStateEditor();
@ -510,7 +510,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
public void testWriteReadOnlyMemoryErr() throws Throwable { public void testWriteReadOnlyMemoryErr() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
activateTrace(); activateTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RO_TARGET); controlService.setCurrentMode(tb.trace, ControlMode.RO_TARGET);
StateEditor editor = createStateEditor(); StateEditor editor = createStateEditor();
assertFalse(editor.isVariableEditable(tb.addr(0x00400000), 4)); assertFalse(editor.isVariableEditable(tb.addr(0x00400000), 4));
@ -523,7 +523,7 @@ public class DebuggerControlServiceTest extends AbstractGhidraHeadedDebuggerTest
public void testWriteReadOnlyRegisterErr() throws Throwable { public void testWriteReadOnlyRegisterErr() throws Throwable {
createAndOpenTrace(); createAndOpenTrace();
activateTrace(); activateTrace();
editingService.setCurrentMode(tb.trace, ControlMode.RO_TARGET); controlService.setCurrentMode(tb.trace, ControlMode.RO_TARGET);
StateEditor editor = createStateEditor(); StateEditor editor = createStateEditor();
assertFalse(editor.isRegisterEditable(r0)); assertFalse(editor.isRegisterEditable(r0));