Merge remote-tracking branch 'origin/patch'

This commit is contained in:
ghidra1 2023-08-07 16:26:15 -04:00
commit 388e990ea3
6 changed files with 40 additions and 31 deletions

View file

@ -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;
}
}