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:
parent
27a69bb088
commit
e8906f3529
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user