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:
Suraj Jitindar Singh 2017-05-02 16:37:15 +10:00 committed by David Gibson
parent 6de833070c
commit c6fd28fd57

View File

@ -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