mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-06-01 12:58:13 +08:00
Merge remote-tracking branch 'origin/GP-2714_ARM_external_issue--SQUASHED' into Ghidra_10.2
This commit is contained in:
+3
-3
@@ -186,10 +186,11 @@ public class ArmAnalyzer extends ConstantPropagationAnalyzer {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (refType.isCall() && refType.isComputed()) {
|
else if (refType.isCall() && refType.isComputed() && !address.isExternalAddress()) {
|
||||||
// must disassemble right now, because TB flag could get set back at end of blx
|
// must disassemble right now, because TB flag could get set back at end of blx
|
||||||
doArmThumbDisassembly(program, instr, context, address, instr.getFlowType(),
|
doArmThumbDisassembly(program, instr, context, address, instr.getFlowType(),
|
||||||
true, monitor);
|
true, monitor);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.evaluateReference(context, instr, pcodeop, address, size, refType);
|
return super.evaluateReference(context, instr, pcodeop, address, size, refType);
|
||||||
@@ -826,8 +827,7 @@ public class ArmAnalyzer extends ConstantPropagationAnalyzer {
|
|||||||
// this is here so the reference gets created, but not - disassembled if it is in a bad part of memory.
|
// this is here so the reference gets created, but not - disassembled if it is in a bad part of memory.
|
||||||
// something computed it into the memory
|
// something computed it into the memory
|
||||||
MemoryBlock block = program.getMemory().getBlock(target);
|
MemoryBlock block = program.getMemory().getBlock(target);
|
||||||
if (block == null || !block.isExecute() || !block.isInitialized() ||
|
if (block == null || !block.isExecute() || !block.isInitialized() || block.isExternalBlock()) {
|
||||||
block.getName().equals(MemoryBlock.EXTERNAL_BLOCK_NAME)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-7
@@ -273,7 +273,7 @@ public class MipsAddressAnalyzer extends ConstantPropagationAnalyzer {
|
|||||||
if (target == (addr.getOffset() + 1) && !instr.getFlowType().isCall()) {
|
if (target == (addr.getOffset() + 1) && !instr.getFlowType().isCall()) {
|
||||||
instr.setFlowOverride(FlowOverride.CALL);
|
instr.setFlowOverride(FlowOverride.CALL);
|
||||||
// need to trigger disassembly below! if not already
|
// need to trigger disassembly below! if not already
|
||||||
MipsExtDisassembly(program, instr, context, addr.add(1), monitor);
|
mipsExtDisassembly(program, instr, context, addr.add(1), monitor);
|
||||||
|
|
||||||
// need to trigger re-function creation!
|
// need to trigger re-function creation!
|
||||||
Function f = program.getFunctionManager().getFunctionContaining(
|
Function f = program.getFunctionManager().getFunctionContaining(
|
||||||
@@ -387,7 +387,7 @@ public class MipsAddressAnalyzer extends ConstantPropagationAnalyzer {
|
|||||||
|
|
||||||
if ((refType.isJump() || refType.isCall()) & refType.isComputed()) {
|
if ((refType.isJump() || refType.isCall()) & refType.isComputed()) {
|
||||||
//if (refType.isJump() || refType.isCall()) {
|
//if (refType.isJump() || refType.isCall()) {
|
||||||
addr = MipsExtDisassembly(program, instr, context, address, monitor);
|
addr = mipsExtDisassembly(program, instr, context, address, monitor);
|
||||||
//addr = flowISA(program, instr, context, address);
|
//addr = flowISA(program, instr, context, address);
|
||||||
if (addr == null) {
|
if (addr == null) {
|
||||||
addr = address;
|
addr = address;
|
||||||
@@ -396,7 +396,7 @@ public class MipsAddressAnalyzer extends ConstantPropagationAnalyzer {
|
|||||||
|
|
||||||
// if this is a call, some processors use the register value
|
// if this is a call, some processors use the register value
|
||||||
// used in the call for PIC calculations
|
// used in the call for PIC calculations
|
||||||
if (refType.isCall()) {
|
if (refType.isCall() && !addr.isExternalAddress()) {
|
||||||
// set the called function to have a constant value for this register
|
// set the called function to have a constant value for this register
|
||||||
// WARNING: This might not always be the case, if called directly or with a different register
|
// WARNING: This might not always be the case, if called directly or with a different register
|
||||||
// But then it won't matter, because the function won't depend on the registers value.
|
// But then it won't matter, because the function won't depend on the registers value.
|
||||||
@@ -501,17 +501,16 @@ public class MipsAddressAnalyzer extends ConstantPropagationAnalyzer {
|
|||||||
return resultSet;
|
return resultSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
Address MipsExtDisassembly(Program program, Instruction instruction, VarnodeContext context,
|
Address mipsExtDisassembly(Program program, Instruction instruction, VarnodeContext context,
|
||||||
Address target, TaskMonitor monitor) {
|
Address target, TaskMonitor monitor) {
|
||||||
if (target == null) {
|
if (target == null || target.isExternalAddress()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Address addr = flowISA(program, instruction, context, target);
|
Address addr = flowISA(program, instruction, context, target);
|
||||||
if (addr != null) {
|
if (addr != null) {
|
||||||
MemoryBlock block = program.getMemory().getBlock(addr);
|
MemoryBlock block = program.getMemory().getBlock(addr);
|
||||||
if (block == null || !block.isExecute() || !block.isInitialized() ||
|
if (block == null || !block.isExecute() || !block.isInitialized() || block.isExternalBlock()) {
|
||||||
block.getName().equals(MemoryBlock.EXTERNAL_BLOCK_NAME)) {
|
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -86,6 +86,10 @@ public class Pic16Analyzer extends ConstantPropagationAnalyzer {
|
|||||||
int size, RefType refType) {
|
int size, RefType refType) {
|
||||||
AddressSpace space = address.getAddressSpace();
|
AddressSpace space = address.getAddressSpace();
|
||||||
|
|
||||||
|
if (address.isExternalAddress()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (space.hasMappedRegisters()) {
|
if (space.hasMappedRegisters()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -82,6 +82,10 @@ public class SH4AddressAnalyzer extends ConstantPropagationAnalyzer {
|
|||||||
public boolean evaluateReference(VarnodeContext context, Instruction instr, int pcodeop,
|
public boolean evaluateReference(VarnodeContext context, Instruction instr, int pcodeop,
|
||||||
Address address, int size, RefType refType) {
|
Address address, int size, RefType refType) {
|
||||||
|
|
||||||
|
if (address.isExternalAddress()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// if this is a call, some processors use the register value
|
// if this is a call, some processors use the register value
|
||||||
// used in the call for PIC calculations
|
// used in the call for PIC calculations
|
||||||
if (refType.isCall()) {
|
if (refType.isCall()) {
|
||||||
|
|||||||
+4
@@ -54,6 +54,10 @@ public class SH4EarlyAddressAnalyzer extends SH4AddressAnalyzer {
|
|||||||
// if this is a call, some processors use the register value
|
// if this is a call, some processors use the register value
|
||||||
// used in the call for PIC calculations
|
// used in the call for PIC calculations
|
||||||
if (refType.isFlow()) {
|
if (refType.isFlow()) {
|
||||||
|
if (address.isExternalAddress()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// set the called function to have a constant value for this register
|
// set the called function to have a constant value for this register
|
||||||
// WARNING: This might not always be the case, if called directly or with a different register
|
// WARNING: This might not always be the case, if called directly or with a different register
|
||||||
// But then it won't matter, because the function won't depend on the registers value.
|
// But then it won't matter, because the function won't depend on the registers value.
|
||||||
|
|||||||
Reference in New Issue
Block a user