mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
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:
commit
d0e8b2faad
1 changed files with 9 additions and 18 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue