| 4394 | } |
| 4395 | |
| 4396 | static DecodeStatus DecodeMSRMask(MCInst *Inst, unsigned Val, |
| 4397 | uint64_t Address, const void *Decoder) |
| 4398 | { |
| 4399 | DecodeStatus S = MCDisassembler_Success; |
| 4400 | |
| 4401 | if (ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMClass)) { |
| 4402 | unsigned ValLow = Val & 0xff; |
| 4403 | |
| 4404 | // Validate the SYSm value first. |
| 4405 | switch (ValLow) { |
| 4406 | case 0: // apsr |
| 4407 | case 1: // iapsr |
| 4408 | case 2: // eapsr |
| 4409 | case 3: // xpsr |
| 4410 | case 5: // ipsr |
| 4411 | case 6: // epsr |
| 4412 | case 7: // iepsr |
| 4413 | case 8: // msp |
| 4414 | case 9: // psp |
| 4415 | case 16: // primask |
| 4416 | case 20: // control |
| 4417 | break; |
| 4418 | case 17: // basepri |
| 4419 | case 18: // basepri_max |
| 4420 | case 19: // faultmask |
| 4421 | if (!ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops)) |
| 4422 | // Values basepri, basepri_max and faultmask are only valid for v7m. |
| 4423 | return MCDisassembler_Fail; |
| 4424 | break; |
| 4425 | case 0x8a: // msplim_ns |
| 4426 | case 0x8b: // psplim_ns |
| 4427 | case 0x91: // basepri_ns |
| 4428 | case 0x93: // faultmask_ns |
| 4429 | if (!ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8MMainlineOps)) |
| 4430 | return MCDisassembler_Fail; |
| 4431 | // LLVM_FALLTHROUGH; |
| 4432 | case 10: // msplim |
| 4433 | case 11: // psplim |
| 4434 | case 0x88: // msp_ns |
| 4435 | case 0x89: // psp_ns |
| 4436 | case 0x90: // primask_ns |
| 4437 | case 0x94: // control_ns |
| 4438 | case 0x98: // sp_ns |
| 4439 | if (!ARM_getFeatureBits(Inst->csh->mode, ARM_Feature8MSecExt)) |
| 4440 | return MCDisassembler_Fail; |
| 4441 | break; |
| 4442 | default: |
| 4443 | return MCDisassembler_SoftFail; |
| 4444 | } |
| 4445 | |
| 4446 | if (MCInst_getOpcode(Inst) == ARM_t2MSR_M) { |
| 4447 | unsigned Mask = fieldFromInstruction_4(Val, 10, 2); |
| 4448 | if (!ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops)) { |
| 4449 | // The ARMv6-M MSR bits {11-10} can be only 0b10, other values are |
| 4450 | // unpredictable. |
| 4451 | if (Mask != 2) |
| 4452 | S = MCDisassembler_SoftFail; |
| 4453 | } else { |
nothing calls this directly
no test coverage detected
searching dependent graphs…