Revision c326b979 target-arm/translate.c

b/target-arm/translate.c
6355 6355
    return 0;
6356 6356
}
6357 6357

  
6358
static int disas_cp14_read(CPUARMState * env, DisasContext *s, uint32_t insn)
6359
{
6360
    int crn = (insn >> 16) & 0xf;
6361
    int crm = insn & 0xf;
6362
    int op1 = (insn >> 21) & 7;
6363
    int op2 = (insn >> 5) & 7;
6364
    int rt = (insn >> 12) & 0xf;
6365
    TCGv tmp;
6366

  
6367
    if (arm_feature(env, ARM_FEATURE_THUMB2EE)) {
6368
        if (op1 == 6 && crn == 0 && crm == 0 && op2 == 0) {
6369
            /* TEECR */
6370
            if (IS_USER(s))
6371
                return 1;
6372
            tmp = load_cpu_field(teecr);
6373
            store_reg(s, rt, tmp);
6374
            return 0;
6375
        }
6376
        if (op1 == 6 && crn == 1 && crm == 0 && op2 == 0) {
6377
            /* TEEHBR */
6378
            if (IS_USER(s) && (env->teecr & 1))
6379
                return 1;
6380
            tmp = load_cpu_field(teehbr);
6381
            store_reg(s, rt, tmp);
6382
            return 0;
6383
        }
6384
    }
6385
    return 1;
6386
}
6387

  
6388
static int disas_cp14_write(CPUARMState * env, DisasContext *s, uint32_t insn)
6389
{
6390
    int crn = (insn >> 16) & 0xf;
6391
    int crm = insn & 0xf;
6392
    int op1 = (insn >> 21) & 7;
6393
    int op2 = (insn >> 5) & 7;
6394
    int rt = (insn >> 12) & 0xf;
6395
    TCGv tmp;
6396

  
6397
    if (arm_feature(env, ARM_FEATURE_THUMB2EE)) {
6398
        if (op1 == 6 && crn == 0 && crm == 0 && op2 == 0) {
6399
            /* TEECR */
6400
            if (IS_USER(s))
6401
                return 1;
6402
            tmp = load_reg(s, rt);
6403
            gen_helper_set_teecr(cpu_env, tmp);
6404
            tcg_temp_free_i32(tmp);
6405
            return 0;
6406
        }
6407
        if (op1 == 6 && crn == 1 && crm == 0 && op2 == 0) {
6408
            /* TEEHBR */
6409
            if (IS_USER(s) && (env->teecr & 1))
6410
                return 1;
6411
            tmp = load_reg(s, rt);
6412
            store_cpu_field(tmp, teehbr);
6413
            return 0;
6414
        }
6415
    }
6416
    return 1;
6417
}
6418

  
6419 6358
static int disas_coproc_insn(CPUARMState * env, DisasContext *s, uint32_t insn)
6420 6359
{
6421 6360
    int cpnum, is64, crn, crm, opc1, opc2, isread, rt, rt2;
......
6591 6530
     * to ARMCPRegInfo.
6592 6531
     */
6593 6532
    switch (cpnum) {
6594
    case 14:
6595
        if (insn & (1 << 20))
6596
            return disas_cp14_read(env, s, insn);
6597
        else
6598
            return disas_cp14_write(env, s, insn);
6599 6533
    case 15:
6600 6534
	return disas_cp15_insn (env, s, insn);
6601 6535
    default:

Also available in: Unified diff