GP-1822: backing out register changes, making Objects handle Strings

This commit is contained in:
d-millar 2022-03-17 18:51:05 -04:00
parent 41c17c0ea2
commit 9ae62b1e63
6 changed files with 50 additions and 16 deletions

View file

@ -30,7 +30,6 @@ import ghidra.dbg.target.TargetRegisterBank;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
import ghidra.dbg.util.ConversionUtils;
import ghidra.program.model.address.AddressSpace;
@TargetObjectSchemaInfo(
name = "RegisterContainer",
@ -105,7 +104,6 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
@Override
public CompletableFuture<? extends Map<String, byte[]>> readRegistersNamed(
Collection<String> names) {
AddressSpace space = getModel().getAddressSpace("ram");
return model.gateFuture(thread.listRegisters().thenCompose(regs -> {
if (regs.size() != registersByName.size() || getCachedElements().isEmpty()) {
return requestElements(false);
@ -138,8 +136,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
if (value.longValue() != 0) {
String newval = reg.getName() + " : " + value.toString(16);
reg.changeAttributes(List.of(), Map.of( //
DISPLAY_ATTRIBUTE_NAME, newval, //
"Address", space.getAddress(value.longValue()) //
DISPLAY_ATTRIBUTE_NAME, newval //
), "Refreshed");
reg.setModified(!value.toString(16).equals(oldval));
}

View file

@ -24,7 +24,6 @@ import agent.dbgeng.model.iface2.DbgModelTargetRegisterContainerAndBank;
import ghidra.dbg.target.TargetRegister;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.util.PathUtils;
import ghidra.program.model.address.Address;
@TargetObjectSchemaInfo(
name = "RegisterDescriptor",
@ -34,7 +33,6 @@ import ghidra.program.model.address.Address;
@TargetAttributeType(
name = TargetRegister.CONTAINER_ATTRIBUTE_NAME,
type = DbgModelTargetRegisterContainerImpl.class),
@TargetAttributeType(name = "Address", type = Address.class),
@TargetAttributeType(type = Void.class) })
public class DbgModelTargetRegisterImpl extends DbgModelTargetObjectImpl
implements DbgModelTargetRegister {

View file

@ -25,15 +25,12 @@ import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.TargetRegister;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.util.PathUtils;
import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressSpace;
@TargetObjectSchemaInfo(
name = "RegisterValue",
elements = {
@TargetElementType(type = Void.class) },
attributes = {
@TargetAttributeType(name = "Address", type = Address.class),
@TargetAttributeType(type = Void.class) })
public class GdbModelTargetStackFrameRegister
extends DefaultTargetObject<TargetObject, GdbModelTargetStackFrameRegisterContainer>
@ -85,12 +82,10 @@ public class GdbModelTargetStackFrameRegister
boolean modified = (bigval.longValue() != 0 && value.equals(oldval));
String newval = getName() + " : " + value;
AddressSpace space = getModel().getAddressSpace("ram");
changeAttributes(List.of(), Map.of( //
VALUE_ATTRIBUTE_NAME, value, //
DISPLAY_ATTRIBUTE_NAME, newval, //
MODIFIED_ATTRIBUTE_NAME, modified, //
"Address", space.getAddress(bigval.longValue()) //
MODIFIED_ATTRIBUTE_NAME, modified //
), "Value Updated");
}

View file

@ -25,7 +25,6 @@ import agent.lldb.model.iface2.LldbModelTargetStackFrameRegister;
import ghidra.dbg.target.schema.*;
import ghidra.dbg.util.ConversionUtils;
import ghidra.dbg.util.PathUtils;
import ghidra.program.model.address.AddressSpace;
@TargetObjectSchemaInfo(
name = "RegisterValue",
@ -105,15 +104,13 @@ public class LldbModelTargetStackFrameRegisterImpl
}
BigInteger val = new BigInteger(value, 16);
byte[] bytes = ConversionUtils.bigIntegerToBytes((int) getRegister().GetByteSize(), val);
AddressSpace space = getModel().getAddressSpace("ram");
changeAttributes(List.of(), Map.of( //
VALUE_ATTRIBUTE_NAME, value //
), "Refreshed");
if (val.longValue() != 0) {
String newval = getDescription(0);
changeAttributes(List.of(), Map.of( //
DISPLAY_ATTRIBUTE_NAME, newval, //
"Address", space.getAddress(val.longValue()) //
DISPLAY_ATTRIBUTE_NAME, newval //
), "Refreshed");
setModified(!value.equals(oldValue));
}

View file

@ -296,6 +296,10 @@ public class ObjectTable<R> implements ObjectPane {
Long lval = (Long) value;
addr = container.getTargetObject().getModel().getAddress("ram", lval);
}
if (value instanceof String) {
String sval = (String) value;
addr = stringToAddress(container.getTargetObject(), addr, sval);
}
if (modelService != null) {
TraceRecorder recorder =
modelService.getRecorderForSuccessor(container.getTargetObject());
@ -306,4 +310,23 @@ public class ObjectTable<R> implements ObjectPane {
}
}
private Address stringToAddress(TargetObject selectedObject, Address addr, String sval) {
try {
Long lval = Long.decode(sval);
addr = selectedObject.getModel().getAddress("ram", lval);
}
catch (NumberFormatException nfe) {
// IGNORE
}
if (addr == null) {
try {
Long lval = Long.decode("0x" + sval);
addr = selectedObject.getModel().getAddress("ram", lval);
}
catch (NumberFormatException nfe) {
// IGNORE
}
}
return addr;
}
}

View file

@ -426,6 +426,10 @@ public class ObjectTree implements ObjectPane {
Long lval = (Long) value;
addr = selectedObject.getModel().getAddress("ram", lval);
}
if (value instanceof String) {
String sval = (String) value;
addr = stringToAddress(selectedObject, addr, sval);
}
if (modelService != null && addr != null) {
TraceRecorder recorder = modelService.getRecorderForSuccessor(selectedObject);
DebuggerMemoryMapper memoryMapper = recorder.getMemoryMapper();
@ -434,4 +438,24 @@ public class ObjectTree implements ObjectPane {
}
}
}
private Address stringToAddress(TargetObject selectedObject, Address addr, String sval) {
try {
Long lval = Long.decode(sval);
addr = selectedObject.getModel().getAddress("ram", lval);
}
catch (NumberFormatException nfe) {
// IGNORE
}
if (addr == null) {
try {
Long lval = Long.decode("0x" + sval);
addr = selectedObject.getModel().getAddress("ram", lval);
}
catch (NumberFormatException nfe) {
// IGNORE
}
}
return addr;
}
}