On processors which don't support MSR_EP bit, loadvm command set exception prefix to an incorrect value and so guest OS freezes.
In cpu_post_load() there is:
/* Invalidate all msr bits except MSR_TGPR/MSR_HVB before restoring */
msr = env->msr;
env->msr ^= ~((1ULL << MSR_TGPR) | MSR_HVB);
ppc_store_msr(env, msr);
While hreg_store_msr() (called by ppc_store_msr) contains:
value &= env->msr_mask;
...
if (unlikely((value >> MSR_EP) & 1) != msr_ep) {
/* Change the exception prefix on PowerPC 601 */
...
where msr_ep is ((env->msr >> MSR_EP) & 1).
If MSR_EP bit in msr_mask is zero, then MSR_EP in 'value' bit is zero, and MSR_EP bit in env->msr is 1. Condition '(value >> MSR_EP) & 1) != msr_ep' is true and so qemu changes exception prefix.
AFAIU we should multiply env->msr by msr_mask, but I am not sure where we should do it: inside hreg_store_msr or outside. This is why this patch is RFC.
Current version of the patch adds msr_mask multiplication before the hreg_store_msr call.
Kurban
Kurban Mallachiev (1):
target-ppc: Don't invalidate non-supported msr bits
target/ppc/machine.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
--
2.15.0