Revision 4cc35614 target-arm/helper.c
b/target-arm/helper.c | ||
---|---|---|
2475 | 2475 |
(env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27) |
2476 | 2476 |
| (env->thumb << 5) | ((env->condexec_bits & 3) << 25) |
2477 | 2477 |
| ((env->condexec_bits & 0xfc) << 8) |
2478 |
| (env->GE << 16); |
|
2478 |
| (env->GE << 16) | env->daif;
|
|
2479 | 2479 |
} |
2480 | 2480 |
|
2481 | 2481 |
void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask) |
... | ... | |
2502 | 2502 |
env->GE = (val >> 16) & 0xf; |
2503 | 2503 |
} |
2504 | 2504 |
|
2505 |
env->daif &= ~(CPSR_AIF & mask); |
|
2506 |
env->daif |= val & CPSR_AIF & mask; |
|
2507 |
|
|
2505 | 2508 |
if ((env->uncached_cpsr ^ val) & mask & CPSR_M) { |
2506 | 2509 |
if (bad_mode_switch(env, val & CPSR_M)) { |
2507 | 2510 |
/* Attempt to switch to an invalid mode: this is UNPREDICTABLE. |
... | ... | |
2963 | 2966 |
env->condexec_bits = 0; |
2964 | 2967 |
/* Switch to the new mode, and to the correct instruction set. */ |
2965 | 2968 |
env->uncached_cpsr = (env->uncached_cpsr & ~CPSR_M) | new_mode; |
2966 |
env->uncached_cpsr |= mask;
|
|
2969 |
env->daif |= mask;
|
|
2967 | 2970 |
/* this is a lie, as the was no c1_sys on V4T/V5, but who cares |
2968 | 2971 |
* and we should just guard the thumb mode on V4 */ |
2969 | 2972 |
if (arm_feature(env, ARM_FEATURE_V4T)) { |
... | ... | |
3636 | 3639 |
case 9: /* PSP */ |
3637 | 3640 |
return env->v7m.current_sp ? env->regs[13] : env->v7m.other_sp; |
3638 | 3641 |
case 16: /* PRIMASK */ |
3639 |
return (env->uncached_cpsr & CPSR_I) != 0;
|
|
3642 |
return (env->daif & PSTATE_I) != 0;
|
|
3640 | 3643 |
case 17: /* BASEPRI */ |
3641 | 3644 |
case 18: /* BASEPRI_MAX */ |
3642 | 3645 |
return env->v7m.basepri; |
3643 | 3646 |
case 19: /* FAULTMASK */ |
3644 |
return (env->uncached_cpsr & CPSR_F) != 0;
|
|
3647 |
return (env->daif & PSTATE_F) != 0;
|
|
3645 | 3648 |
case 20: /* CONTROL */ |
3646 | 3649 |
return env->v7m.control; |
3647 | 3650 |
default: |
... | ... | |
3688 | 3691 |
env->v7m.other_sp = val; |
3689 | 3692 |
break; |
3690 | 3693 |
case 16: /* PRIMASK */ |
3691 |
if (val & 1) |
|
3692 |
env->uncached_cpsr |= CPSR_I; |
|
3693 |
else |
|
3694 |
env->uncached_cpsr &= ~CPSR_I; |
|
3694 |
if (val & 1) { |
|
3695 |
env->daif |= PSTATE_I; |
|
3696 |
} else { |
|
3697 |
env->daif &= ~PSTATE_I; |
|
3698 |
} |
|
3695 | 3699 |
break; |
3696 | 3700 |
case 17: /* BASEPRI */ |
3697 | 3701 |
env->v7m.basepri = val & 0xff; |
... | ... | |
3702 | 3706 |
env->v7m.basepri = val; |
3703 | 3707 |
break; |
3704 | 3708 |
case 19: /* FAULTMASK */ |
3705 |
if (val & 1) |
|
3706 |
env->uncached_cpsr |= CPSR_F; |
|
3707 |
else |
|
3708 |
env->uncached_cpsr &= ~CPSR_F; |
|
3709 |
if (val & 1) { |
|
3710 |
env->daif |= PSTATE_F; |
|
3711 |
} else { |
|
3712 |
env->daif &= ~PSTATE_F; |
|
3713 |
} |
|
3709 | 3714 |
break; |
3710 | 3715 |
case 20: /* CONTROL */ |
3711 | 3716 |
env->v7m.control = val & 3; |
Also available in: Unified diff