Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
sakiodre committed Jun 29, 2023
2 parents f29d46e + 1db18df commit c06ca14
Show file tree
Hide file tree
Showing 71 changed files with 3,404 additions and 2,538 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ protected PtySession sessionUsingJavaLeader(String[] args, Map<String, String> e
return new LocalProcessPtySession(builder.start());
}
catch (Exception e) {
Msg.error(this, "Could not start process with args " + args, e);
Msg.error(this, "Could not start process with args " + Arrays.toString(args), e);
throw e;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ protected void registerInterface(Class<? extends TargetObject> iface) {
}
if (!Arrays.equals(paramClasses, method.getParameterTypes())) {
throw new AssertionError("@" + annotationType.getSimpleName() +
" methods must have typed parameters: " + paramClasses);
" methods must have typed parameters: " + Arrays.toString(paramClasses));
}
MethodHandle handle;
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,12 @@
import ghidra.framework.plugintool.*;
import ghidra.framework.plugintool.annotation.AutoConfigStateField;
import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.address.AddressSpace;
import ghidra.trace.model.*;
import ghidra.trace.model.Trace.TraceMemoryStateChangeType;
import ghidra.trace.model.Trace.TraceSnapshotChangeType;
import ghidra.trace.model.memory.TraceMemoryState;
import ghidra.trace.model.program.TraceProgramView;
import ghidra.trace.model.time.TraceSnapshot;
import ghidra.util.Msg;
import ghidra.util.Swing;
Expand Down Expand Up @@ -249,7 +251,20 @@ public void goToCoordinates(DebuggerCoordinates coordinates) {
// NB. provider should call contextChanged, updating actions
}

protected boolean isConsistent() {
TraceProgramView view = current.getView();
if (view == null || visible.isEmpty()) {
return true; // Some have special logic for empty
}
AddressSpace space = visible.getFirstRange().getAddressSpace();
int id = space.getSpaceID();
return space == view.getAddressFactory().getAddressSpace(id);
}

protected void doAutoRead() {
if (!isConsistent()) {
return;
}
autoSpec.readMemory(tool, current, visible).exceptionally(ex -> {
Msg.error(this, "Could not auto-read memory: " + ex);
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,9 @@ default Address doComputeTraceAddress(PluginTool tool, DebuggerCoordinates coord
if (!thread.getLifespan().contains(snap)) {
return null;
}
TraceMemorySpace regs =
trace.getMemoryManager().getMemoryRegisterSpace(thread, frame, false);
TraceMemorySpace regs = reg.getAddressSpace().isRegisterSpace()
? trace.getMemoryManager().getMemoryRegisterSpace(thread, frame, false)
: trace.getMemoryManager().getMemorySpace(reg.getAddressSpace(), false);
if (regs == null) {
return null;
}
Expand Down Expand Up @@ -106,10 +107,10 @@ default boolean affectedByBytesChange(TraceAddressSpace space,
return false;
}
Register register = computeRegister(coordinates);
if (register == null) {
AddressSpace as = space.getAddressSpace();
if (register == null || register.getAddressSpace() != as) {
return false;
}
AddressSpace as = space.getAddressSpace();
AddressRange regRng = coordinates.getPlatform()
.getConventionalRegisterRange(as.isRegisterSpace() ? as : null, register);
return range.getRange().intersects(regRng);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,9 +309,9 @@ private boolean isVisible(TraceAddressSpace space, TraceAddressSnapRange range)
}

private void refreshRange(AddressRange range) {
TraceMemorySpace space = getRegisterMemorySpace(false);
TraceMemorySpace mem = getRegisterMemorySpace(range.getAddressSpace(), false);
// ... If I got an event for it, it ought to exist.
assert space != null;
assert mem != null;

// TODO: Just certain rows?
regsTableModel.fireTableDataChanged();
Expand Down Expand Up @@ -852,7 +852,7 @@ boolean canWriteRegister(Register register) {
}

BigInteger getRegisterValue(Register register) {
TraceMemorySpace regs = getRegisterMemorySpace(false);
TraceMemorySpace regs = getRegisterMemorySpace(register.getAddressSpace(), false);
if (regs == null) {
return BigInteger.ZERO;
}
Expand Down Expand Up @@ -921,13 +921,14 @@ void writeRegisterDataType(Register register, DataType dataType) {
dataType = new PointerTypedef(null, ptrType.getDataType(), ptrType.getLength(),
ptrType.getDataTypeManager(), space);
}
TraceCodeSpace space = getRegisterMemorySpace(true).getCodeSpace(true);
TraceCodeSpace code =
getRegisterMemorySpace(register.getAddressSpace(), true).getCodeSpace(true);
long snap = current.getViewSnap();
TracePlatform platform = current.getPlatform();
space.definedUnits()
code.definedUnits()
.clear(platform, Lifespan.at(snap), register, TaskMonitor.DUMMY);
if (dataType != null) {
space.definedData().create(platform, Lifespan.nowOn(snap), register, dataType);
code.definedData().create(platform, Lifespan.nowOn(snap), register, dataType);
}
}
catch (CodeUnitInsertionException | CancelledException e) {
Expand Down Expand Up @@ -998,11 +999,13 @@ String getRegisterValueRepresentation(Register register) {
* values are populated.
*/
void prepareRegisterSpace() {
if (current.getThread() != null &&
current.getTrace().getObjectManager().getRootSchema() != null) {
try (Transaction tx =
current.getTrace().openTransaction("Create/initialize register space")) {
getRegisterMemorySpace(true);
Trace trace = current.getTrace();
if (current.getThread() != null && trace.getObjectManager().getRootSchema() != null) {
AddressSpace regSpace = current.getPlatform().getAddressFactory().getRegisterSpace();
if (regSpace != null) {
try (Transaction tx = trace.openTransaction("Create/initialize register space")) {
getRegisterMemorySpace(regSpace, true);
}
}
}
}
Expand All @@ -1023,15 +1026,19 @@ void recomputeViewKnown() {
.unionedAddresses(snap -> mem.getAddressesWithState(snap,
platform.mapGuestToHost(platform.getLanguage().getRegisterAddresses()),
state -> state == TraceMemoryState.KNOWN));
TraceMemorySpace regs = getRegisterMemorySpace(false);
AddressSpace regSpace = current.getPlatform().getAddressFactory().getRegisterSpace();
if (regSpace == null) {
viewKnown = new AddressSet(viewKnownMem);
return;
}
TraceMemorySpace regs = getRegisterMemorySpace(regSpace, false);
if (regs == null) {
viewKnown = new AddressSet(viewKnownMem);
return;
}
AddressSetView hostRegs =
platform.mapGuestToHost(platform.getLanguage().getRegisterAddresses());
AddressSetView overlayRegs =
TraceRegisterUtils.getOverlaySet(regs.getAddressSpace(), hostRegs);
AddressSetView overlayRegs = TraceRegisterUtils.getOverlaySet(regSpace, hostRegs);
AddressSetView viewKnownRegs = view.getViewport()
.unionedAddresses(snap -> regs.getAddressesWithState(snap, overlayRegs,
state -> state == TraceMemoryState.KNOWN));
Expand All @@ -1042,7 +1049,7 @@ boolean isRegisterKnown(Register register) {
if (viewKnown == null) {
return false;
}
TraceMemorySpace regs = getRegisterMemorySpace(false);
TraceMemorySpace regs = getRegisterMemorySpace(register.getAddressSpace(), false);
if (regs == null && register.getAddressSpace().isRegisterSpace()) {
return false;
}
Expand All @@ -1061,8 +1068,10 @@ boolean isRegisterChanged(Register register) {
if (!isRegisterKnown(register)) {
return false;
}
TraceMemorySpace curSpace = getRegisterMemorySpace(current, false);
TraceMemorySpace prevSpace = getRegisterMemorySpace(previous, false);
TraceMemorySpace curSpace =
getRegisterMemorySpace(current, register.getAddressSpace(), false);
TraceMemorySpace prevSpace =
getRegisterMemorySpace(previous, register.getAddressSpace(), false);
if (prevSpace == null) {
return false;
}
Expand Down Expand Up @@ -1124,7 +1133,12 @@ public LinkedHashSet<Register> computeDefaultRegisterFavorites(TracePlatform pla
}

protected static TraceMemorySpace getRegisterMemorySpace(DebuggerCoordinates coords,
boolean createIfAbsent) {
AddressSpace space, boolean createIfAbsent) {
if (!space.isRegisterSpace()) {
return coords.getTrace()
.getMemoryManager()
.getMemorySpace(space, createIfAbsent);
}
TraceThread thread = coords.getThread();
if (thread == null) {
return null;
Expand All @@ -1134,8 +1148,9 @@ protected static TraceMemorySpace getRegisterMemorySpace(DebuggerCoordinates coo
.getMemoryRegisterSpace(thread, coords.getFrame(), createIfAbsent);
}

protected TraceMemorySpace getRegisterMemorySpace(boolean createIfAbsent) {
return getRegisterMemorySpace(current, createIfAbsent);
protected TraceMemorySpace getRegisterMemorySpace(AddressSpace space,
boolean createIfAbsent) {
return getRegisterMemorySpace(current, space, createIfAbsent);
}

protected TraceCodeSpace getRegisterCodeSpace(boolean createIfAbsent) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -353,14 +353,15 @@ protected void doSetSyntheticStack() {
currentStack = null;

Trace curTrace = current.getTrace();
TraceMemorySpace regs =
curTrace.getMemoryManager().getMemoryRegisterSpace(current.getThread(), false);
if (regs == null) {
Register pc = curTrace.getBaseLanguage().getProgramCounter();
if (pc == null) {
contextChanged();
return;
}
Register pc = curTrace.getBaseLanguage().getProgramCounter();
if (pc == null) {
TraceMemorySpace regs = pc.getAddressSpace().isRegisterSpace()
? curTrace.getMemoryManager().getMemoryRegisterSpace(current.getThread(), false)
: curTrace.getMemoryManager().getMemorySpace(pc.getAddressSpace(), false);
if (regs == null) {
contextChanged();
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,9 @@ protected void disassembleRegPcVal(TraceThread thread, int frameLevel, long pcSn
TraceData pcUnit = null;
try (Transaction tx =
trace.openTransaction("Disassemble: PC is code pointer")) {
TraceCodeSpace regCode = codeManager.getCodeRegisterSpace(thread, frameLevel, true);
TraceCodeSpace regCode = pc.getAddressSpace().isRegisterSpace()
? codeManager.getCodeRegisterSpace(thread, frameLevel, true)
: codeManager.getCodeSpace(pc.getAddressSpace(), true);
// TODO: Should be same platform as pc, not necessarily base
AddressSpace space = trace.getBaseAddressFactory().getDefaultAddressSpace();
PointerTypedef type = new PointerTypedef(null, VoidDataType.dataType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ public boolean applyTo(DomainObject obj, TaskMonitor monitor) {

DataType existingDT = startData.getDataType();
int startIndex = startData.getComponentIndex();
Data lastComp = parent.getComponentAt(
Data lastComp = parent.getComponentContaining(
(int) (startData.getMinAddress().subtract(parent.getMinAddress()) + length - 1));
int endIndex = lastComp.getComponentIndex();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ String pullNameThrough(CurrentState state, Address address, Namespace space) {
if (data == null) {
return null;
}
data = data.getComponentAt((int) address.subtract(data.getAddress()));
data = data.getComponentContaining((int) address.subtract(data.getAddress()));
if (data == null) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,22 @@ public class StoredAnalyzerTimes implements CustomOption {
private String[] names;

@Override
public void readState(SaveState saveState) {
public void readState(GProperties properties) {
taskTimes.clear();
for (String taskName : saveState.getNames()) {
for (String taskName : properties.getNames()) {
if (CustomOption.CUSTOM_OPTION_CLASS_NAME_KEY.equals(taskName)) {
continue; // skip this reserved key
}
taskTimes.put(taskName, saveState.getLong(taskName, 0));
taskTimes.put(taskName, properties.getLong(taskName, 0));
}
names = null;
totalTime = null;
}

@Override
public void writeState(SaveState saveState) {
public void writeState(GProperties properties) {
for (String taskName : taskTimes.keySet()) {
saveState.putLong(taskName, taskTimes.get(taskName));
properties.putLong(taskName, taskTimes.get(taskName));
}
}

Expand Down Expand Up @@ -164,7 +164,7 @@ public StoredAnalyzerTimes clone() {
public static StoredAnalyzerTimes getStoredAnalyzerTimes(Program program) {
Options options = program.getOptions(OPTIONS_LIST);
StoredAnalyzerTimes times = (StoredAnalyzerTimes) options
.getCustomOption(StoredAnalyzerTimes.OPTION_NAME, new StoredAnalyzerTimes());
.getCustomOption(StoredAnalyzerTimes.OPTION_NAME, new StoredAnalyzerTimes());
return times.clone();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package ghidra.app.plugin.core.searchmem.mask;

import java.util.Arrays;

/**
* Stores information about the instruction and mask.
*
Expand Down Expand Up @@ -54,7 +56,7 @@ public MaskValue(byte[] mask, byte[] value, String textRepresentation) {
@Override
public String toString() {
String rep = textRepresentation == null ? "" : textRepresentation;
return getClass().getSimpleName() + " - " + rep + " [mask=" + mask + ", value=" + value +
return getClass().getSimpleName() + " - " + rep + " [mask=" + Arrays.toString(mask) + ", value=" + Arrays.toString(value) +
"]";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,10 @@
*/
package ghidra.app.util.bin.format.elf;

import java.io.IOException;
import java.util.*;
import java.util.function.Consumer;

import java.io.IOException;

import ghidra.app.util.bin.*;
import ghidra.app.util.bin.format.elf.ElfRelocationTable.TableFormat;
import ghidra.app.util.bin.format.elf.extend.ElfExtensionFactory;
Expand Down Expand Up @@ -136,21 +135,19 @@ void logError(String msg) {
protected void initElfHeader() throws ElfException {
try {

if (!Arrays.equals(ElfConstants.MAGIC_BYTES,
provider.readBytes(0, ElfConstants.MAGIC_BYTES.length))) {
throw new ElfException("Not a valid ELF executable.");
}
e_ident_magic_num = ElfConstants.MAGIC_NUM;
e_ident_magic_str = ElfConstants.MAGIC_STR;

determineHeaderEndianess();

// reader uses unbounded provider wrapper to allow handling of missing/truncated headers
reader = new BinaryReader(new UnlimitedByteProviderWrapper(provider),
hasLittleEndianHeaders);

e_ident_magic_num = reader.readNextByte();
e_ident_magic_str = reader.readNextAsciiString(ElfConstants.MAGIC_STR_LEN);

boolean magicMatch = ElfConstants.MAGIC_NUM == e_ident_magic_num &&
ElfConstants.MAGIC_STR.equalsIgnoreCase(e_ident_magic_str);

if (!magicMatch) {
throw new ElfException("Not a valid ELF executable.");
}
reader.setPointerIndex(ElfConstants.MAGIC_BYTES.length);

e_ident_class = reader.readNextByte();
e_ident_data = reader.readNextByte();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,9 @@ public final class SectionNames {
public final static String IMPORT_POINTERS = "__pointers";
/** Section dedicated to holding global program variables */
public final static String PROGRAM_VARS = "__program_vars";

/** Section containing dyld_chained_starts_offsets structure */
public final static String CHAIN_STARTS = "__chain_starts";
/** Section containing chained fixups */
public final static String THREAD_STARTS = "__thread_starts";
}
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,9 @@ public void markupRawBinary(MachHeader header, FlatProgramAPI api, Address baseA
try {
super.markupRawBinary(header, api, baseAddress, parentModule, monitor, log);

List<Address> addrs =
api.getCurrentProgram().getMemory().locateAddressesForFileOffset(getDataOffset());
List<Address> addrs = api.getCurrentProgram()
.getMemory()
.locateAddressesForFileOffset(getLinkerDataOffset());
if (addrs.size() <= 0) {
throw new Exception("Chain Header does not exist in program");
}
Expand Down
Loading

0 comments on commit c06ca14

Please sign in to comment.