ghidra/Ghidra/Processors/PowerPC/data/languages/quicciii.sinc
2023-05-05 11:13:03 -04:00

122 lines
3.5 KiB
Text

# These instructions show up in the Freescale PowerQUICC III instruction manual
# (not present elsewhere)
define pcodeop dataCacheBlockClearLock;
define pcodeop prefetchDataCacheBlockLockSet;
define pcodeop prefetchDataCacheBlockLockSetX;
define pcodeop debuggerNotifyHalt;
define pcodeop instructionCacheBlockClearLock;
define pcodeop queryInstructionCacheBlockLock;
define pcodeop prefetchInstructionCacheBlockLockSetX;
define pcodeop moveFromAPIDIndirect;
define pcodeop moveFromPerformanceMonitorRegister;
define pcodeop moveToPerformanceMonitorRegister;
define pcodeop invalidateTLB;
#dcblc 0,0,r0 #FIXME
:dcblc CT,RA_OR_ZERO,B is OP=31 & CT & B & XOP_1_10=390 & BIT_0=0 & RA_OR_ZERO
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + B;
dataCacheBlockClearLock(ea);
}
#dcbtls 0,0,r0 #FIXME
:dcbtls CT,RA_OR_ZERO,B is OP=31 & CT & B & XOP_1_10=166 & BIT_0=0 & RA_OR_ZERO
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + B;
prefetchDataCacheBlockLockSet(ea);
}
#dcbtstls 0,0,r0 #FIXME
:dcbtstls CT,RA_OR_ZERO,B is OP=31 & CT & B & XOP_1_10=134 & BIT_0=0 & RA_OR_ZERO
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + B;
prefetchDataCacheBlockLockSetX(ea);
}
#dnh 0,0 #FIXME
:dnh DUI,DUIS is $(NOTVLE) & OP=19 & DUI & DUIS & XOP_1_10=198 & BIT_0=0
{
debuggerNotifyHalt(DUI:1,DUIS:2);
}
#icblc 0,0,r0 #FIXME
:icblc CT,RA_OR_ZERO,B is OP=31 & CT & B & XOP_1_10=230 & BIT_0=0 & RA_OR_ZERO
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + B;
instructionCacheBlockClearLock(CT:1,ea);
}
:icblq CT,RA_OR_ZERO,B is OP=31 & CT & B & XOP_1_10=198 & BIT_0=1 & RA_OR_ZERO
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + B;
cr0 = queryInstructionCacheBlockLock(CT:1,ea);
}
#icbtls 0,0,r0 #FIXME
:icbtls CT,RA_OR_ZERO,B is OP=31 & CT & B & XOP_1_10=486 & BIT_0=0 & RA_OR_ZERO
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + B;
prefetchInstructionCacheBlockLockSetX(ea);
}
:isel^CC_X_OPm D,RA_OR_ZERO,B,CC_X_OP is OP=31 & D & RA_OR_ZERO & B & CC_X_OP & CC_X_OPm & XOP_1_5=15
{
local tmp:$(REGISTER_SIZE) = RA_OR_ZERO;
D = B;
if (!CC_X_OP) goto inst_next;
D = tmp;
# D = (zext(CC_X_OP) * RA_OR_ZERO) + (zext(!CC_X_OP) * B);
}
#mfapidi r0,r1 #FIXME
:mfapidi D,A is $(NOTVLE) & OP=31 & D & A & XOP_1_10=275
{
D = moveFromAPIDIndirect(A);
}
pmrn: pmr is BITS_16_20 & BITS_11_15 [ pmr = BITS_11_15 << 5 | BITS_16_20; ] { tmp:2 = pmr; export tmp; }
#mfpmr r0,? #FIXME
:mfpmr D,pmrn is OP=31 & D & pmrn & XOP_1_10=334 & BIT_0=0
{
D = moveFromPerformanceMonitorRegister(pmrn);
}
#mtpmr r0,? #FIXME
:mtpmr pmrn,S is OP=31 & S & pmrn & XOP_1_10=462 & BIT_0=0
{
moveToPerformanceMonitorRegister(pmrn, S);
}
#rfdi #FIXME
:rfdi is $(NOTVLE) & OP=19 & XOP_1_10=39
{
MSR = returnFromDebugInterrupt(MSR, spr23f); #DSRR1
local ra = spr23e; #DSRR0
return[ra];
}
#rfmci #FIXME
:rfmci is $(NOTVLE) & OP=19 & XOP_0_10=76
{
MSR = returnFromMachineCheckInterrupt(MSR, spr23b); #MCSRR1
local ra = spr23a; #MCSRR0
return[ra];
}
# PowerISA II: 6.11.4.9 TLB Management Instructions
# CMT: TLB Invalidate Local Indexed [Category: Embedded.Phased In]]
# FORM: X-form
define pcodeop TLBInvalidateLocalIndexed; # Outputs/affect TBD
:tlbilx BITS_21_22,RA_OR_ZERO,RB_OR_ZERO is $(NOTVLE) & OP=31 & CRFD=0 & BITS_21_22 & RA_OR_ZERO & RB_OR_ZERO & XOP_1_10=18 & BIT_0=0 {
TLBInvalidateLocalIndexed(BITS_21_22:1,RA_OR_ZERO,RB_OR_ZERO);
}
#tlbivax 0,r0 #FIXME
:tlbivax RA_OR_ZERO,B is OP=31 & RA_OR_ZERO & B & XOP_1_10=786
{
ea:$(REGISTER_SIZE) = RA_OR_ZERO + B;
invalidateTLB(ea);
}