Merge branch 'GT-0_ghidra1_PR-2018_SamL98_writeStackValue'

Conflicts:
	Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java
This commit is contained in:
ghidra1 2020-07-16 16:45:07 -04:00
commit d0e8b2faad

View file

@ -32,7 +32,8 @@ import ghidra.program.model.lang.*;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;
import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryBlock;
import ghidra.program.model.mem.MemoryConflictException; import ghidra.program.model.mem.MemoryConflictException;
import ghidra.util.*; import ghidra.util.DataConverter;
import ghidra.util.Msg;
import ghidra.util.exception.CancelledException; import ghidra.util.exception.CancelledException;
import ghidra.util.exception.DuplicateNameException; import ghidra.util.exception.DuplicateNameException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@ -50,6 +51,8 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration
private MemoryFaultHandler faultHandler; private MemoryFaultHandler faultHandler;
private DataConverter converter;
private BreakCallBack addressBreak = new BreakCallBack() { private BreakCallBack addressBreak = new BreakCallBack() {
@Override @Override
public boolean addressCallback(Address addr) { public boolean addressCallback(Address addr) {
@ -66,6 +69,8 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration
stackMemorySpace = program.getCompilerSpec().getStackBaseSpace(); stackMemorySpace = program.getCompilerSpec().getStackBaseSpace();
emulator = new Emulator(this); emulator = new Emulator(this);
converter = DataConverter.getInstance(program.getMemory().isBigEndian());
} }
public void dispose() { public void dispose() {
@ -271,10 +276,7 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration
throws Exception { throws Exception {
long offset = readRegister(stackPtrReg).longValue() + relativeOffset; long offset = readRegister(stackPtrReg).longValue() + relativeOffset;
byte[] bytes = readMemory(stackMemorySpace.getAddress(offset), size); byte[] bytes = readMemory(stackMemorySpace.getAddress(offset), size);
if (program.getMemory().isBigEndian()) { return converter.getBigInteger(bytes, size, signed);
return BigEndianDataConverter.INSTANCE.getBigInteger(bytes, size, signed);
}
return LittleEndianDataConverter.INSTANCE.getBigInteger(bytes, size, signed);
} }
/** /**
@ -287,12 +289,7 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration
public void writeStackValue(int relativeOffset, int size, long value) throws Exception { public void writeStackValue(int relativeOffset, int size, long value) throws Exception {
long offset = readRegister(stackPtrReg).longValue() + relativeOffset; long offset = readRegister(stackPtrReg).longValue() + relativeOffset;
byte[] bytes = new byte[size]; byte[] bytes = new byte[size];
if (program.getMemory().isBigEndian()) { converter.getBytes(value, size, bytes, 0);
BigEndianDataConverter.INSTANCE.getBytes(value, bytes);
}
else {
LittleEndianDataConverter.INSTANCE.getBytes(value, bytes);
}
writeMemory(stackMemorySpace.getAddress(offset), bytes); writeMemory(stackMemorySpace.getAddress(offset), bytes);
} }
@ -306,13 +303,7 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration
public void writeStackValue(int relativeOffset, int size, BigInteger value) throws Exception { public void writeStackValue(int relativeOffset, int size, BigInteger value) throws Exception {
// TODO: verify that sign byte is not added to size of bytes // TODO: verify that sign byte is not added to size of bytes
long offset = readRegister(stackPtrReg).longValue() + relativeOffset; long offset = readRegister(stackPtrReg).longValue() + relativeOffset;
byte[] bytes; byte[] bytes = converter.getBytes(value, size);
if (program.getMemory().isBigEndian()) {
bytes = BigEndianDataConverter.INSTANCE.getBytes(value, size);
}
else {
bytes = LittleEndianDataConverter.INSTANCE.getBytes(value, size);
}
writeMemory(stackMemorySpace.getAddress(offset), bytes); writeMemory(stackMemorySpace.getAddress(offset), bytes);
} }