Revision efdef95f

b/target-ppc/cpu.h
779 779
target_ulong ppc_load_slb (CPUPPCState *env, int slb_nr);
780 780
target_ulong ppc_load_sr (CPUPPCState *env, int sr_nr);
781 781
int ppc_store_slb (CPUPPCState *env, target_ulong rb, target_ulong rs);
782
int ppc_load_slb_esid (CPUPPCState *env, target_ulong rb, target_ulong *rt);
783
int ppc_load_slb_vsid (CPUPPCState *env, target_ulong rb, target_ulong *rt);
782 784
#endif /* defined(TARGET_PPC64) */
783 785
void ppc_store_sr (CPUPPCState *env, int srnum, target_ulong value);
784 786
#endif /* !defined(CONFIG_USER_ONLY) */
b/target-ppc/helper.c
774 774

  
775 775
    return 0;
776 776
}
777

  
778
int ppc_load_slb_esid (CPUPPCState *env, target_ulong rb, target_ulong *rt)
779
{
780
    int slot = rb & 0xfff;
781
    ppc_slb_t *slb = &env->slb[slot];
782

  
783
    if (slot >= env->slb_nr) {
784
        return -1;
785
    }
786

  
787
    *rt = slb->esid;
788
    return 0;
789
}
790

  
791
int ppc_load_slb_vsid (CPUPPCState *env, target_ulong rb, target_ulong *rt)
792
{
793
    int slot = rb & 0xfff;
794
    ppc_slb_t *slb = &env->slb[slot];
795

  
796
    if (slot >= env->slb_nr) {
797
        return -1;
798
    }
799

  
800
    *rt = slb->vsid;
801
    return 0;
802
}
777 803
#endif /* defined(TARGET_PPC64) */
778 804

  
779 805
/* Perform segment based translation */
b/target-ppc/helper.h
341 341
DEF_HELPER_FLAGS_1(tlbie, TCG_CALL_CONST, void, tl)
342 342
#if defined(TARGET_PPC64)
343 343
DEF_HELPER_FLAGS_2(store_slb, TCG_CALL_CONST, void, tl, tl)
344
DEF_HELPER_1(load_slb_esid, tl, tl)
345
DEF_HELPER_1(load_slb_vsid, tl, tl)
344 346
DEF_HELPER_FLAGS_0(slbia, TCG_CALL_CONST, void)
345 347
DEF_HELPER_FLAGS_1(slbie, TCG_CALL_CONST, void, tl)
346 348
#endif
b/target-ppc/op_helper.c
3753 3753
    }
3754 3754
}
3755 3755

  
3756
target_ulong helper_load_slb_esid (target_ulong rb)
3757
{
3758
    target_ulong rt;
3759

  
3760
    if (ppc_load_slb_esid(env, rb, &rt) < 0) {
3761
        helper_raise_exception_err(POWERPC_EXCP_PROGRAM, POWERPC_EXCP_INVAL);
3762
    }
3763
    return rt;
3764
}
3765

  
3766
target_ulong helper_load_slb_vsid (target_ulong rb)
3767
{
3768
    target_ulong rt;
3769

  
3770
    if (ppc_load_slb_vsid(env, rb, &rt) < 0) {
3771
        helper_raise_exception_err(POWERPC_EXCP_PROGRAM, POWERPC_EXCP_INVAL);
3772
    }
3773
    return rt;
3774
}
3775

  
3756 3776
void helper_slbia (void)
3757 3777
{
3758 3778
    ppc_slb_invalidate_all(env);
b/target-ppc/translate.c
4227 4227
#endif
4228 4228
}
4229 4229

  
4230
static void gen_slbmfee(DisasContext *ctx)
4231
{
4232
#if defined(CONFIG_USER_ONLY)
4233
    gen_inval_exception(ctx, POWERPC_EXCP_PRIV_REG);
4234
#else
4235
    if (unlikely(!ctx->mem_idx)) {
4236
        gen_inval_exception(ctx, POWERPC_EXCP_PRIV_REG);
4237
        return;
4238
    }
4239
    gen_helper_load_slb_esid(cpu_gpr[rS(ctx->opcode)],
4240
                             cpu_gpr[rB(ctx->opcode)]);
4241
#endif
4242
}
4243

  
4244
static void gen_slbmfev(DisasContext *ctx)
4245
{
4246
#if defined(CONFIG_USER_ONLY)
4247
    gen_inval_exception(ctx, POWERPC_EXCP_PRIV_REG);
4248
#else
4249
    if (unlikely(!ctx->mem_idx)) {
4250
        gen_inval_exception(ctx, POWERPC_EXCP_PRIV_REG);
4251
        return;
4252
    }
4253
    gen_helper_load_slb_vsid(cpu_gpr[rS(ctx->opcode)],
4254
                             cpu_gpr[rB(ctx->opcode)]);
4255
#endif
4256
}
4230 4257
#endif /* defined(TARGET_PPC64) */
4231 4258

  
4232 4259
/***                      Lookaside buffer management                      ***/
......
8300 8327
GEN_HANDLER2(mtsr_64b, "mtsr", 0x1F, 0x12, 0x06, 0x0010F801, PPC_SEGMENT_64B),
8301 8328
GEN_HANDLER2(mtsrin_64b, "mtsrin", 0x1F, 0x12, 0x07, 0x001F0001,
8302 8329
             PPC_SEGMENT_64B),
8303
GEN_HANDLER2(slbmte, "slbmte", 0x1F, 0x12, 0x0C, 0x00000000, PPC_SEGMENT_64B),
8330
GEN_HANDLER2(slbmte, "slbmte", 0x1F, 0x12, 0x0C, 0x001F0001, PPC_SEGMENT_64B),
8331
GEN_HANDLER2(slbmfee, "slbmfee", 0x1F, 0x13, 0x1C, 0x001F0001, PPC_SEGMENT_64B),
8332
GEN_HANDLER2(slbmfev, "slbmfev", 0x1F, 0x13, 0x1A, 0x001F0001, PPC_SEGMENT_64B),
8304 8333
#endif
8305 8334
GEN_HANDLER(tlbia, 0x1F, 0x12, 0x0B, 0x03FFFC01, PPC_MEM_TLBIA),
8306 8335
GEN_HANDLER(tlbiel, 0x1F, 0x12, 0x08, 0x03FF0001, PPC_MEM_TLBIE),

Also available in: Unified diff