ARM: Implement a version of mcr and mrc that works in user mode.
This commit is contained in:
parent
e91e6ff9a4
commit
6101e1b062
|
@ -137,6 +137,8 @@ let {{
|
||||||
case MISCREG_BPIALL:
|
case MISCREG_BPIALL:
|
||||||
return new WarnUnimplemented(
|
return new WarnUnimplemented(
|
||||||
isRead ? "mrc bpiall" : "mcr bpiall", machInst);
|
isRead ? "mrc bpiall" : "mcr bpiall", machInst);
|
||||||
|
|
||||||
|
// Write only.
|
||||||
case MISCREG_TLBIALLIS:
|
case MISCREG_TLBIALLIS:
|
||||||
case MISCREG_TLBIMVAIS:
|
case MISCREG_TLBIMVAIS:
|
||||||
case MISCREG_TLBIASIDIS:
|
case MISCREG_TLBIASIDIS:
|
||||||
|
@ -157,6 +159,23 @@ let {{
|
||||||
return new Mcr15(machInst, (IntRegIndex)miscReg, rt);
|
return new Mcr15(machInst, (IntRegIndex)miscReg, rt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Read only in user mode.
|
||||||
|
case MISCREG_TPIDRURO:
|
||||||
|
if (isRead) {
|
||||||
|
return new Mrc15User(machInst, rt, (IntRegIndex)miscReg);
|
||||||
|
} else {
|
||||||
|
return new Mcr15(machInst, (IntRegIndex)miscReg, rt);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read/write in user mode.
|
||||||
|
case MISCREG_TPIDRURW:
|
||||||
|
if (isRead) {
|
||||||
|
return new Mrc15User(machInst, rt, (IntRegIndex)miscReg);
|
||||||
|
} else {
|
||||||
|
return new Mcr15User(machInst, (IntRegIndex)miscReg, rt);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read/write, priveleged only.
|
||||||
default:
|
default:
|
||||||
if (isRead) {
|
if (isRead) {
|
||||||
return new Mrc15(machInst, rt, (IntRegIndex)miscReg);
|
return new Mrc15(machInst, rt, (IntRegIndex)miscReg);
|
||||||
|
|
|
@ -614,6 +614,20 @@ let {{
|
||||||
decoder_output += RegRegOpConstructor.subst(mcr15Iop)
|
decoder_output += RegRegOpConstructor.subst(mcr15Iop)
|
||||||
exec_output += PredOpExecute.subst(mcr15Iop)
|
exec_output += PredOpExecute.subst(mcr15Iop)
|
||||||
|
|
||||||
|
mrc15UserIop = InstObjParams("mrc", "Mrc15User", "RegRegOp",
|
||||||
|
{ "code": "Dest = MiscOp1;",
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegRegOpDeclare.subst(mrc15UserIop)
|
||||||
|
decoder_output += RegRegOpConstructor.subst(mrc15UserIop)
|
||||||
|
exec_output += PredOpExecute.subst(mrc15UserIop)
|
||||||
|
|
||||||
|
mcr15UserIop = InstObjParams("mcr", "Mcr15User", "RegRegOp",
|
||||||
|
{ "code": "MiscDest = Op1",
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegRegOpDeclare.subst(mcr15UserIop)
|
||||||
|
decoder_output += RegRegOpConstructor.subst(mcr15UserIop)
|
||||||
|
exec_output += PredOpExecute.subst(mcr15UserIop)
|
||||||
|
|
||||||
enterxCode = '''
|
enterxCode = '''
|
||||||
FNPC = NPC | (1ULL << PcJBitShift) | (1ULL << PcTBitShift);
|
FNPC = NPC | (1ULL << PcJBitShift) | (1ULL << PcTBitShift);
|
||||||
'''
|
'''
|
||||||
|
|
Loading…
Reference in a new issue