aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2023-06-14 00:16:23 +1000
committerNicholas Piggin <npiggin@gmail.com>2024-03-13 02:47:04 +1000
commit678b6f1af75ef42f510495a81fe8562e872e9daf (patch)
treec2c3a476280782fc624e689ac14eef1e835d577d
parent99ea316e2a6180a8318f47a25c4a13d80ecf8ba4 (diff)
downloadqemu-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.c5
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);
}