Merge remote-tracking branch

'origin/GP-6642_ghidorahrex_HCS12_BRN_fix--SQUASHED' into patch
 (Closes #9001)
This commit is contained in:
Ryan Kurtz
2026-06-08 15:25:05 -04:00
2 changed files with 9 additions and 19 deletions

View File

@@ -271,7 +271,7 @@ macro setHCSphysPage(addr) {
(zext(isPpage) * (0x400000 | ((zext(PPAGE) << 14 ) ^ 0x8000))) +
(zext(isPpage_FF) * (0x400000 | ((0x3FC000) ^ 0xC000))) ;
}
@elif defined(HCS12) && SIZE=="3"
@elif defined(HCS12) && SIZE=="3"
macro setHCSphysPage(addr) {
local a3:3 = zext(addr);
@@ -1961,11 +1961,9 @@ with : XGATE=0 {
}
# branch never is a two-byte nop
SkipNextInstr: dest is epsilon [ dest = inst_next + 1; ] { export *[RAM]:1 dest; }
:BRN SkipNextInstr is Prefix18=0 & op8=0x21 & SkipNextInstr
:BRN rel8 is Prefix18=0 & op8=0x21; rel8
{
goto SkipNextInstr;
}
:BRSET opr8a_8, msk8, rel8 is Prefix18=0 & op8=0x4E; opr8a_8; msk8; rel8

View File

@@ -17,19 +17,11 @@ package ghidra.app.plugin.core.analysis;
import java.math.BigInteger;
import ghidra.app.services.AbstractAnalyzer;
import ghidra.app.services.AnalysisPriority;
import ghidra.app.services.AnalyzerType;
import ghidra.app.services.*;
import ghidra.app.util.importer.MessageLog;
import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.lang.Processor;
import ghidra.program.model.lang.Register;
import ghidra.program.model.lang.RegisterValue;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.FunctionIterator;
import ghidra.program.model.listing.Instruction;
import ghidra.program.model.listing.InstructionIterator;
import ghidra.program.model.listing.Program;
import ghidra.program.model.lang.*;
import ghidra.program.model.listing.*;
import ghidra.program.model.symbol.SourceType;
import ghidra.util.Msg;
import ghidra.util.exception.CancelledException;
@@ -53,9 +45,8 @@ public class HCS12ConventionAnalyzer extends AbstractAnalyzer {
public boolean canAnalyze(Program program) {
// Only analyze HCS-12 / HCS-12X Programs
Processor processor = program.getLanguage().getProcessor();
boolean canDo = "HCS-12".equals(processor.toString()) ||
"HCS-12X".equals(processor.toString());
String procName = processor.toString();
boolean canDo = "HCS-12".equals(procName) || "HCS-12X".equals(procName);
if (canDo) {
xgate = program.getRegister("XGATE");
}
@@ -64,12 +55,13 @@ public class HCS12ConventionAnalyzer extends AbstractAnalyzer {
}
void checkReturn(Program program, Instruction instr) {
String mnemonic = instr.getMnemonicString().toLowerCase();
if (instr == null || !instr.getFlowType().isTerminal()) {
return;
}
String mnemonic = instr.getMnemonicString().toLowerCase();
// if XGATE set on instruction is XGATE
RegisterValue xgateValue = program.getProgramContext().getRegisterValue(xgate, instr.getMinAddress());
if (xgateValue != null && xgateValue.hasValue() && xgateValue.getUnsignedValue().equals(BigInteger.ONE)) {