mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
GP-2761: Fix register editing under new conventions when names don't match case.
This commit is contained in:
parent
8d6cf5e310
commit
e6c3713d3c
12 changed files with 226 additions and 54 deletions
|
@ -102,15 +102,21 @@ public interface InternalTracePlatform extends TracePlatform {
|
|||
|
||||
@Override
|
||||
default PathMatcher getConventionalRegisterPath(TargetObjectSchema schema, List<String> path,
|
||||
Register register) {
|
||||
String name) {
|
||||
PathMatcher matcher = schema.searchFor(TargetRegister.class, path, true);
|
||||
if (matcher.isEmpty()) {
|
||||
return matcher;
|
||||
}
|
||||
String name = getConventionalRegisterObjectName(register);
|
||||
return matcher.applyKeys(Align.RIGHT, List.of(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
default PathMatcher getConventionalRegisterPath(TargetObjectSchema schema, List<String> path,
|
||||
Register register) {
|
||||
return getConventionalRegisterPath(schema, path,
|
||||
getConventionalRegisterObjectName(register));
|
||||
}
|
||||
|
||||
@Override
|
||||
default PathMatcher getConventionalRegisterPath(TraceObject container, Register register) {
|
||||
return getConventionalRegisterPath(container.getTargetSchema(),
|
||||
|
|
|
@ -270,7 +270,7 @@ public class DBTraceMemorySpace
|
|||
|
||||
@Override
|
||||
public DBTraceCodeSpace getCodeSpace(boolean createIfAbsent) {
|
||||
if (space.isRegisterSpace()) {
|
||||
if (space.isRegisterSpace() && !space.isOverlaySpace()) {
|
||||
return trace.getCodeManager().getCodeRegisterSpace(thread, frameLevel, createIfAbsent);
|
||||
}
|
||||
return trace.getCodeManager().getCodeSpace(space, createIfAbsent);
|
||||
|
|
|
@ -40,7 +40,6 @@ import ghidra.util.LockHold;
|
|||
import ghidra.util.Msg;
|
||||
import ghidra.util.database.*;
|
||||
import ghidra.util.database.annot.*;
|
||||
import ghidra.util.exception.DuplicateNameException;
|
||||
import ghidra.util.exception.VersionException;
|
||||
import ghidra.util.task.TaskMonitor;
|
||||
|
||||
|
@ -207,8 +206,9 @@ public abstract class AbstractDBTraceSpaceBasedManager<M extends DBTraceSpaceBas
|
|||
|
||||
protected M getForRegisterSpace(TraceThread thread, int frameLevel, boolean createIfAbsent) {
|
||||
trace.getThreadManager().assertIsMine(thread);
|
||||
if (thread instanceof TraceObjectThread objThread) {
|
||||
return getForRegisterSpaceObjectThread(objThread, frameLevel, createIfAbsent);
|
||||
if (trace.getObjectManager().hasSchema()) {
|
||||
return getForRegisterSpaceObjectThread((TraceObjectThread) thread, frameLevel,
|
||||
createIfAbsent);
|
||||
}
|
||||
Pair<TraceThread, Integer> frame = ImmutablePair.of(thread, frameLevel);
|
||||
if (!createIfAbsent) {
|
||||
|
|
|
@ -182,6 +182,17 @@ public interface TracePlatform {
|
|||
*/
|
||||
String getConventionalRegisterObjectName(Register register);
|
||||
|
||||
/**
|
||||
* Get the expected path where an object defining the register value would be
|
||||
*
|
||||
* @param schema the schema of the register container
|
||||
* @param path the path to the register container
|
||||
* @param name the name of the register on the target
|
||||
* @return the path matcher, possibly empty
|
||||
*/
|
||||
PathMatcher getConventionalRegisterPath(TargetObjectSchema schema, List<String> path,
|
||||
String name);
|
||||
|
||||
/**
|
||||
* Get the expected path where an object defining the register value would be
|
||||
*
|
||||
|
|
|
@ -140,24 +140,31 @@ public enum TraceRegisterUtils {
|
|||
return new RegisterValue(register, addr.getOffsetAsBigInteger());
|
||||
}
|
||||
|
||||
public static RegisterValue combineWithTraceBaseRegisterValue(RegisterValue rv,
|
||||
TracePlatform platform, long snap, TraceMemorySpace regs, boolean requireKnown) {
|
||||
public static RegisterValue combineWithTraceParentRegisterValue(Register parent,
|
||||
RegisterValue rv, TracePlatform platform, long snap, TraceMemorySpace regs,
|
||||
boolean requireKnown) {
|
||||
Register reg = rv.getRegister();
|
||||
if (reg.isBaseRegister()) {
|
||||
if (reg == parent) {
|
||||
return rv;
|
||||
}
|
||||
if (regs == null) {
|
||||
if (requireKnown) {
|
||||
throw new IllegalStateException("Must fetch base register before setting a child");
|
||||
throw new IllegalStateException("Must fetch " + parent + " before setting " + reg);
|
||||
}
|
||||
return rv.getBaseRegisterValue();
|
||||
return rv.getRegisterValue(parent);
|
||||
}
|
||||
if (requireKnown) {
|
||||
if (TraceMemoryState.KNOWN != regs.getState(platform, snap, reg.getBaseRegister())) {
|
||||
throw new IllegalStateException("Must fetch base register before setting a child");
|
||||
throw new IllegalStateException("Must fetch " + parent + " before setting " + reg);
|
||||
}
|
||||
}
|
||||
return regs.getValue(platform, snap, reg.getBaseRegister()).combineValues(rv);
|
||||
return regs.getValue(platform, snap, parent).combineValues(rv);
|
||||
}
|
||||
|
||||
public static RegisterValue combineWithTraceBaseRegisterValue(RegisterValue rv,
|
||||
TracePlatform platform, long snap, TraceMemorySpace regs, boolean requireKnown) {
|
||||
return combineWithTraceParentRegisterValue(rv.getRegister().getBaseRegister(), rv, platform,
|
||||
snap, regs, requireKnown);
|
||||
}
|
||||
|
||||
public static ByteBuffer prepareBuffer(Register register) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue