PPC: E500: Set ESR values

When an exception occurs on BookE, we need to set ESR bits to expose
to the guest information on what exactly happened. Add the obvious ones.

Reported-by: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
This commit is contained in:
Alexander Graf 2011-08-23 06:55:44 +02:00 committed by Edgar E. Iglesias
parent 27a69bb088
commit e8906f3529

View File

@ -2484,16 +2484,19 @@ static inline void powerpc_excp(CPUState *env, int excp_model, int excp)
if (lpes1 == 0) if (lpes1 == 0)
new_msr |= (target_ulong)MSR_HVB; new_msr |= (target_ulong)MSR_HVB;
msr |= 0x00080000; msr |= 0x00080000;
env->spr[SPR_BOOKE_ESR] = ESR_PIL;
break; break;
case POWERPC_EXCP_PRIV: case POWERPC_EXCP_PRIV:
if (lpes1 == 0) if (lpes1 == 0)
new_msr |= (target_ulong)MSR_HVB; new_msr |= (target_ulong)MSR_HVB;
msr |= 0x00040000; msr |= 0x00040000;
env->spr[SPR_BOOKE_ESR] = ESR_PPR;
break; break;
case POWERPC_EXCP_TRAP: case POWERPC_EXCP_TRAP:
if (lpes1 == 0) if (lpes1 == 0)
new_msr |= (target_ulong)MSR_HVB; new_msr |= (target_ulong)MSR_HVB;
msr |= 0x00020000; msr |= 0x00020000;
env->spr[SPR_BOOKE_ESR] = ESR_PTR;
break; break;
default: default:
/* Should never occur */ /* Should never occur */
@ -2556,16 +2559,19 @@ static inline void powerpc_excp(CPUState *env, int excp_model, int excp)
cpu_abort(env, "Debug exception is not implemented yet !\n"); cpu_abort(env, "Debug exception is not implemented yet !\n");
goto store_next; goto store_next;
case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavailable */ case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavailable */
env->spr[SPR_BOOKE_ESR] = ESR_SPV;
goto store_current; goto store_current;
case POWERPC_EXCP_EFPDI: /* Embedded floating-point data interrupt */ case POWERPC_EXCP_EFPDI: /* Embedded floating-point data interrupt */
/* XXX: TODO */ /* XXX: TODO */
cpu_abort(env, "Embedded floating point data exception " cpu_abort(env, "Embedded floating point data exception "
"is not implemented yet !\n"); "is not implemented yet !\n");
env->spr[SPR_BOOKE_ESR] = ESR_SPV;
goto store_next; goto store_next;
case POWERPC_EXCP_EFPRI: /* Embedded floating-point round interrupt */ case POWERPC_EXCP_EFPRI: /* Embedded floating-point round interrupt */
/* XXX: TODO */ /* XXX: TODO */
cpu_abort(env, "Embedded floating point round exception " cpu_abort(env, "Embedded floating point round exception "
"is not implemented yet !\n"); "is not implemented yet !\n");
env->spr[SPR_BOOKE_ESR] = ESR_SPV;
goto store_next; goto store_next;
case POWERPC_EXCP_EPERFM: /* Embedded performance monitor interrupt */ case POWERPC_EXCP_EPERFM: /* Embedded performance monitor interrupt */
/* XXX: TODO */ /* XXX: TODO */