mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
Merge remote-tracking branch 'origin/patch'
This commit is contained in:
commit
388e990ea3
6 changed files with 40 additions and 31 deletions
|
@ -424,9 +424,8 @@ public class PseudoDisassembler {
|
|||
AddressSet body = new AddressSet();
|
||||
AddressSet instrStarts = new AddressSet();
|
||||
|
||||
if (hasLowBitCodeModeInAddrValues(program)) {
|
||||
entryPoint = setTargeContextForDisassembly(procContext, entryPoint);
|
||||
}
|
||||
entryPoint = setTargetContextForDisassembly(procContext, entryPoint);
|
||||
|
||||
Address target = entryPoint;
|
||||
|
||||
ArrayList<Address> targetList = new ArrayList<>(); // list of valid targets
|
||||
|
@ -662,9 +661,8 @@ public class PseudoDisassembler {
|
|||
AddressSet instrStarts = new AddressSet();
|
||||
AddressSetView execSet = memory.getExecuteSet();
|
||||
|
||||
if (hasLowBitCodeModeInAddrValues(program)) {
|
||||
entryPoint = setTargeContextForDisassembly(procContext, entryPoint);
|
||||
}
|
||||
entryPoint = setTargetContextForDisassembly(procContext, entryPoint);
|
||||
|
||||
Address target = entryPoint;
|
||||
|
||||
ArrayList<Address> targetList = new ArrayList<>(); // list of valid targets
|
||||
|
@ -1078,25 +1076,29 @@ public class PseudoDisassembler {
|
|||
* @param addr the raw address
|
||||
* @return the correct address to disassemble at if it needs to be aligned
|
||||
*/
|
||||
public static Address setTargeContextForDisassembly(Program program, Address addr) {
|
||||
public static Address setTargetContextForDisassembly(Program program, Address addr) {
|
||||
if (!addr.isMemoryAddress()) {
|
||||
Msg.error(PseudoDisassembler.class,
|
||||
"Invalid attempt to adjust disassembler context at " + addr.toString(true));
|
||||
return addr;
|
||||
}
|
||||
|
||||
long offset = addr.getOffset();
|
||||
if ((offset & 1) == 0) {
|
||||
return addr;
|
||||
}
|
||||
|
||||
Register lowBitCodeMode = program.getRegister(LOW_BIT_CODE_MODE_REGISTER_NAME);
|
||||
if (lowBitCodeMode == null) {
|
||||
return addr;
|
||||
}
|
||||
long offset = addr.getOffset();
|
||||
if ((offset & 1) == 1) {
|
||||
addr = addr.getNewAddress(addr.getOffset() & ~0x1);
|
||||
try {
|
||||
program.getProgramContext().setValue(lowBitCodeMode, addr, addr, BigInteger.ONE);
|
||||
}
|
||||
catch (ContextChangeException e) {
|
||||
// shouldn't happen
|
||||
}
|
||||
|
||||
addr = addr.getNewAddress(addr.getOffset() & ~0x1);
|
||||
try {
|
||||
program.getProgramContext().setValue(lowBitCodeMode, addr, addr, BigInteger.ONE);
|
||||
}
|
||||
catch (ContextChangeException e) {
|
||||
// shouldn't happen
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
@ -1111,23 +1113,29 @@ public class PseudoDisassembler {
|
|||
* @return the correct disassembly location if the address needed to be adjusted.
|
||||
*/
|
||||
|
||||
public Address setTargeContextForDisassembly(PseudoDisassemblerContext procContext,
|
||||
public static Address setTargetContextForDisassembly(DisassemblerContext procContext,
|
||||
Address addr) {
|
||||
if (!addr.isMemoryAddress()) {
|
||||
Msg.error(this,
|
||||
Msg.error(PseudoDisassembler.class,
|
||||
"Invalid attempt to adjust disassembler context at " + addr.toString(true));
|
||||
return addr;
|
||||
}
|
||||
Register lowBitCodeMode = program.getRegister(LOW_BIT_CODE_MODE_REGISTER_NAME);
|
||||
|
||||
long offset = addr.getOffset();
|
||||
if ((offset & 1) == 0) {
|
||||
return addr;
|
||||
}
|
||||
|
||||
Register lowBitCodeMode = procContext.getRegister(LOW_BIT_CODE_MODE_REGISTER_NAME);
|
||||
if (lowBitCodeMode == null) {
|
||||
return addr;
|
||||
}
|
||||
long offset = addr.getOffset();
|
||||
if ((offset & 1) == 1) {
|
||||
addr = addr.getNewAddress(addr.getOffset() & ~0x1);
|
||||
procContext.setValue(lowBitCodeMode, addr, BigInteger.ONE);
|
||||
}
|
||||
return addr.getNewAddress(addr.getOffset() & ~0x1);
|
||||
|
||||
// Set context and revise addr (clear lsb of offset)
|
||||
addr = addr.getNewAddress(addr.getOffset() & ~0x1);
|
||||
RegisterValue val = new RegisterValue(lowBitCodeMode, BigInteger.ONE);
|
||||
procContext.setFutureRegisterValue(addr, val);
|
||||
return addr;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue