diff options
author | Nicholas Piggin <npiggin@gmail.com> | 2023-06-14 00:16:23 +1000 |
---|---|---|
committer | Nicholas Piggin <npiggin@gmail.com> | 2024-03-13 02:47:04 +1000 |
commit | 678b6f1af75ef42f510495a81fe8562e872e9daf (patch) | |
tree | c2c3a476280782fc624e689ac14eef1e835d577d | |
parent | 99ea316e2a6180a8318f47a25c4a13d80ecf8ba4 (diff) | |
download | qemu-678b6f1af75ef42f510495a81fe8562e872e9daf.zip qemu-678b6f1af75ef42f510495a81fe8562e872e9daf.tar.gz qemu-678b6f1af75ef42f510495a81fe8562e872e9daf.tar.bz2 |
target/ppc: Prevent supervisor from modifying MSR[ME]
Prevent guest state modifying the MSR[ME] bit. Per ISA:
An attempt to modify MSR[ME] in privileged but non-hypervisor state
is ignored (i.e., the bit is not changed).
Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
-rw-r--r-- | target/ppc/helper_regs.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/target/ppc/helper_regs.c b/target/ppc/helper_regs.c index 410b39c..2525898 100644 --- a/target/ppc/helper_regs.c +++ b/target/ppc/helper_regs.c @@ -264,6 +264,11 @@ int hreg_store_msr(CPUPPCState *env, target_ulong value, int alter_hv) value &= ~MSR_HVB; value |= env->msr & MSR_HVB; } + /* Attempt to modify MSR[ME] in guest state is ignored */ + if (is_book3s_arch2x(env) && !(env->msr & MSR_HVB)) { + value &= ~(1 << MSR_ME); + value |= env->msr & (1 << MSR_ME); + } if ((value ^ env->msr) & (R_MSR_IR_MASK | R_MSR_DR_MASK)) { cpu_interrupt_exittb(cs); } |