target/ppc: Update tlbie to check privilege level based on GTSE
The Guest Translation Shootdown Enable (GTSE) bit in the Logical Partition Control Register (LPCR) can be set to enable a guest to use the tlbie instruction directly to invalidate translations. When the GTSE bit is set then the tlbie instruction is supervisor privileged, otherwise it is hypervisor privileged. Add a guest translation shootdown enable (gtse) field to the diassembly context and use this to check the correct privilege level at code generation time. Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
6de833070c
commit
c6fd28fd57
@ -218,6 +218,7 @@ struct DisasContext {
|
|||||||
bool vsx_enabled;
|
bool vsx_enabled;
|
||||||
bool spe_enabled;
|
bool spe_enabled;
|
||||||
bool tm_enabled;
|
bool tm_enabled;
|
||||||
|
bool gtse;
|
||||||
ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */
|
ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */
|
||||||
int singlestep_enabled;
|
int singlestep_enabled;
|
||||||
uint64_t insns_flags;
|
uint64_t insns_flags;
|
||||||
@ -4538,7 +4539,12 @@ static void gen_tlbie(DisasContext *ctx)
|
|||||||
GEN_PRIV;
|
GEN_PRIV;
|
||||||
#else
|
#else
|
||||||
TCGv_i32 t1;
|
TCGv_i32 t1;
|
||||||
CHK_HV;
|
|
||||||
|
if (ctx->gtse) {
|
||||||
|
CHK_SV; /* If gtse is set then tblie is supervisor privileged */
|
||||||
|
} else {
|
||||||
|
CHK_HV; /* Else hypervisor privileged */
|
||||||
|
}
|
||||||
|
|
||||||
if (NARROW_MODE(ctx)) {
|
if (NARROW_MODE(ctx)) {
|
||||||
TCGv t0 = tcg_temp_new();
|
TCGv t0 = tcg_temp_new();
|
||||||
@ -7252,6 +7258,7 @@ void gen_intermediate_code(CPUPPCState *env, struct TranslationBlock *tb)
|
|||||||
ctx.tm_enabled = false;
|
ctx.tm_enabled = false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
ctx.gtse = !!(env->spr[SPR_LPCR] & LPCR_GTSE);
|
||||||
if ((env->flags & POWERPC_FLAG_SE) && msr_se)
|
if ((env->flags & POWERPC_FLAG_SE) && msr_se)
|
||||||
ctx.singlestep_enabled = CPU_SINGLE_STEP;
|
ctx.singlestep_enabled = CPU_SINGLE_STEP;
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user