mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 19:42:36 +02:00
GP-0: Fix control service.
This commit is contained in:
parent
f9103016b1
commit
0e826aa1c7
2 changed files with 42 additions and 26 deletions
|
@ -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();
|
||||||
|
|
|
@ -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));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue