mirror of
https://github.com/NationalSecurityAgency/ghidra
synced 2024-10-13 13:43:00 +00:00
GP-1822: backing out register changes, making Objects handle Strings
This commit is contained in:
parent
41c17c0ea2
commit
9ae62b1e63
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue