mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-06 03:50:02 +02:00
GP-1822: backing out register changes, making Objects handle Strings
This commit is contained in:
parent
41c17c0ea2
commit
9ae62b1e63
6 changed files with 50 additions and 16 deletions
|
@ -30,7 +30,6 @@ import ghidra.dbg.target.TargetRegisterBank;
|
||||||
import ghidra.dbg.target.schema.*;
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
import ghidra.dbg.target.schema.TargetObjectSchema.ResyncMode;
|
||||||
import ghidra.dbg.util.ConversionUtils;
|
import ghidra.dbg.util.ConversionUtils;
|
||||||
import ghidra.program.model.address.AddressSpace;
|
|
||||||
|
|
||||||
@TargetObjectSchemaInfo(
|
@TargetObjectSchemaInfo(
|
||||||
name = "RegisterContainer",
|
name = "RegisterContainer",
|
||||||
|
@ -105,7 +104,6 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<? extends Map<String, byte[]>> readRegistersNamed(
|
public CompletableFuture<? extends Map<String, byte[]>> readRegistersNamed(
|
||||||
Collection<String> names) {
|
Collection<String> names) {
|
||||||
AddressSpace space = getModel().getAddressSpace("ram");
|
|
||||||
return model.gateFuture(thread.listRegisters().thenCompose(regs -> {
|
return model.gateFuture(thread.listRegisters().thenCompose(regs -> {
|
||||||
if (regs.size() != registersByName.size() || getCachedElements().isEmpty()) {
|
if (regs.size() != registersByName.size() || getCachedElements().isEmpty()) {
|
||||||
return requestElements(false);
|
return requestElements(false);
|
||||||
|
@ -138,8 +136,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
||||||
if (value.longValue() != 0) {
|
if (value.longValue() != 0) {
|
||||||
String newval = reg.getName() + " : " + value.toString(16);
|
String newval = reg.getName() + " : " + value.toString(16);
|
||||||
reg.changeAttributes(List.of(), Map.of( //
|
reg.changeAttributes(List.of(), Map.of( //
|
||||||
DISPLAY_ATTRIBUTE_NAME, newval, //
|
DISPLAY_ATTRIBUTE_NAME, newval //
|
||||||
"Address", space.getAddress(value.longValue()) //
|
|
||||||
), "Refreshed");
|
), "Refreshed");
|
||||||
reg.setModified(!value.toString(16).equals(oldval));
|
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.TargetRegister;
|
||||||
import ghidra.dbg.target.schema.*;
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.dbg.util.PathUtils;
|
import ghidra.dbg.util.PathUtils;
|
||||||
import ghidra.program.model.address.Address;
|
|
||||||
|
|
||||||
@TargetObjectSchemaInfo(
|
@TargetObjectSchemaInfo(
|
||||||
name = "RegisterDescriptor",
|
name = "RegisterDescriptor",
|
||||||
|
@ -34,7 +33,6 @@ import ghidra.program.model.address.Address;
|
||||||
@TargetAttributeType(
|
@TargetAttributeType(
|
||||||
name = TargetRegister.CONTAINER_ATTRIBUTE_NAME,
|
name = TargetRegister.CONTAINER_ATTRIBUTE_NAME,
|
||||||
type = DbgModelTargetRegisterContainerImpl.class),
|
type = DbgModelTargetRegisterContainerImpl.class),
|
||||||
@TargetAttributeType(name = "Address", type = Address.class),
|
|
||||||
@TargetAttributeType(type = Void.class) })
|
@TargetAttributeType(type = Void.class) })
|
||||||
public class DbgModelTargetRegisterImpl extends DbgModelTargetObjectImpl
|
public class DbgModelTargetRegisterImpl extends DbgModelTargetObjectImpl
|
||||||
implements DbgModelTargetRegister {
|
implements DbgModelTargetRegister {
|
||||||
|
|
|
@ -25,15 +25,12 @@ import ghidra.dbg.target.TargetObject;
|
||||||
import ghidra.dbg.target.TargetRegister;
|
import ghidra.dbg.target.TargetRegister;
|
||||||
import ghidra.dbg.target.schema.*;
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.dbg.util.PathUtils;
|
import ghidra.dbg.util.PathUtils;
|
||||||
import ghidra.program.model.address.Address;
|
|
||||||
import ghidra.program.model.address.AddressSpace;
|
|
||||||
|
|
||||||
@TargetObjectSchemaInfo(
|
@TargetObjectSchemaInfo(
|
||||||
name = "RegisterValue",
|
name = "RegisterValue",
|
||||||
elements = {
|
elements = {
|
||||||
@TargetElementType(type = Void.class) },
|
@TargetElementType(type = Void.class) },
|
||||||
attributes = {
|
attributes = {
|
||||||
@TargetAttributeType(name = "Address", type = Address.class),
|
|
||||||
@TargetAttributeType(type = Void.class) })
|
@TargetAttributeType(type = Void.class) })
|
||||||
public class GdbModelTargetStackFrameRegister
|
public class GdbModelTargetStackFrameRegister
|
||||||
extends DefaultTargetObject<TargetObject, GdbModelTargetStackFrameRegisterContainer>
|
extends DefaultTargetObject<TargetObject, GdbModelTargetStackFrameRegisterContainer>
|
||||||
|
@ -85,12 +82,10 @@ public class GdbModelTargetStackFrameRegister
|
||||||
boolean modified = (bigval.longValue() != 0 && value.equals(oldval));
|
boolean modified = (bigval.longValue() != 0 && value.equals(oldval));
|
||||||
|
|
||||||
String newval = getName() + " : " + value;
|
String newval = getName() + " : " + value;
|
||||||
AddressSpace space = getModel().getAddressSpace("ram");
|
|
||||||
changeAttributes(List.of(), Map.of( //
|
changeAttributes(List.of(), Map.of( //
|
||||||
VALUE_ATTRIBUTE_NAME, value, //
|
VALUE_ATTRIBUTE_NAME, value, //
|
||||||
DISPLAY_ATTRIBUTE_NAME, newval, //
|
DISPLAY_ATTRIBUTE_NAME, newval, //
|
||||||
MODIFIED_ATTRIBUTE_NAME, modified, //
|
MODIFIED_ATTRIBUTE_NAME, modified //
|
||||||
"Address", space.getAddress(bigval.longValue()) //
|
|
||||||
), "Value Updated");
|
), "Value Updated");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ import agent.lldb.model.iface2.LldbModelTargetStackFrameRegister;
|
||||||
import ghidra.dbg.target.schema.*;
|
import ghidra.dbg.target.schema.*;
|
||||||
import ghidra.dbg.util.ConversionUtils;
|
import ghidra.dbg.util.ConversionUtils;
|
||||||
import ghidra.dbg.util.PathUtils;
|
import ghidra.dbg.util.PathUtils;
|
||||||
import ghidra.program.model.address.AddressSpace;
|
|
||||||
|
|
||||||
@TargetObjectSchemaInfo(
|
@TargetObjectSchemaInfo(
|
||||||
name = "RegisterValue",
|
name = "RegisterValue",
|
||||||
|
@ -105,15 +104,13 @@ public class LldbModelTargetStackFrameRegisterImpl
|
||||||
}
|
}
|
||||||
BigInteger val = new BigInteger(value, 16);
|
BigInteger val = new BigInteger(value, 16);
|
||||||
byte[] bytes = ConversionUtils.bigIntegerToBytes((int) getRegister().GetByteSize(), val);
|
byte[] bytes = ConversionUtils.bigIntegerToBytes((int) getRegister().GetByteSize(), val);
|
||||||
AddressSpace space = getModel().getAddressSpace("ram");
|
|
||||||
changeAttributes(List.of(), Map.of( //
|
changeAttributes(List.of(), Map.of( //
|
||||||
VALUE_ATTRIBUTE_NAME, value //
|
VALUE_ATTRIBUTE_NAME, value //
|
||||||
), "Refreshed");
|
), "Refreshed");
|
||||||
if (val.longValue() != 0) {
|
if (val.longValue() != 0) {
|
||||||
String newval = getDescription(0);
|
String newval = getDescription(0);
|
||||||
changeAttributes(List.of(), Map.of( //
|
changeAttributes(List.of(), Map.of( //
|
||||||
DISPLAY_ATTRIBUTE_NAME, newval, //
|
DISPLAY_ATTRIBUTE_NAME, newval //
|
||||||
"Address", space.getAddress(val.longValue()) //
|
|
||||||
), "Refreshed");
|
), "Refreshed");
|
||||||
setModified(!value.equals(oldValue));
|
setModified(!value.equals(oldValue));
|
||||||
}
|
}
|
||||||
|
|
|
@ -296,6 +296,10 @@ public class ObjectTable<R> implements ObjectPane {
|
||||||
Long lval = (Long) value;
|
Long lval = (Long) value;
|
||||||
addr = container.getTargetObject().getModel().getAddress("ram", lval);
|
addr = container.getTargetObject().getModel().getAddress("ram", lval);
|
||||||
}
|
}
|
||||||
|
if (value instanceof String) {
|
||||||
|
String sval = (String) value;
|
||||||
|
addr = stringToAddress(container.getTargetObject(), addr, sval);
|
||||||
|
}
|
||||||
if (modelService != null) {
|
if (modelService != null) {
|
||||||
TraceRecorder recorder =
|
TraceRecorder recorder =
|
||||||
modelService.getRecorderForSuccessor(container.getTargetObject());
|
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;
|
Long lval = (Long) value;
|
||||||
addr = selectedObject.getModel().getAddress("ram", lval);
|
addr = selectedObject.getModel().getAddress("ram", lval);
|
||||||
}
|
}
|
||||||
|
if (value instanceof String) {
|
||||||
|
String sval = (String) value;
|
||||||
|
addr = stringToAddress(selectedObject, addr, sval);
|
||||||
|
}
|
||||||
if (modelService != null && addr != null) {
|
if (modelService != null && addr != null) {
|
||||||
TraceRecorder recorder = modelService.getRecorderForSuccessor(selectedObject);
|
TraceRecorder recorder = modelService.getRecorderForSuccessor(selectedObject);
|
||||||
DebuggerMemoryMapper memoryMapper = recorder.getMemoryMapper();
|
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…
Add table
Add a link
Reference in a new issue