Revision fe1479c3 target-arm/translate.c

b/target-arm/translate.c
5536 5536
    return 0;
5537 5537
}
5538 5538

  
5539
static int disas_cp14_read(CPUState * env, DisasContext *s, uint32_t insn)
5540
{
5541
    int crn = (insn >> 16) & 0xf;
5542
    int crm = insn & 0xf;
5543
    int op1 = (insn >> 21) & 7;
5544
    int op2 = (insn >> 5) & 7;
5545
    int rt = (insn >> 12) & 0xf;
5546
    TCGv tmp;
5547

  
5548
    if (arm_feature(env, ARM_FEATURE_THUMB2EE)) {
5549
        if (op1 == 6 && crn == 0 && crm == 0 && op2 == 0) {
5550
            /* TEECR */
5551
            if (IS_USER(s))
5552
                return 1;
5553
            tmp = load_cpu_field(teecr);
5554
            store_reg(s, rt, tmp);
5555
            return 0;
5556
        }
5557
        if (op1 == 6 && crn == 1 && crm == 0 && op2 == 0) {
5558
            /* TEEHBR */
5559
            if (IS_USER(s) && (env->teecr & 1))
5560
                return 1;
5561
            tmp = load_cpu_field(teehbr);
5562
            store_reg(s, rt, tmp);
5563
            return 0;
5564
        }
5565
    }
5566
    fprintf(stderr, "Unknown cp14 read op1:%d crn:%d crm:%d op2:%d\n",
5567
            op1, crn, crm, op2);
5568
    return 1;
5569
}
5570

  
5571
static int disas_cp14_write(CPUState * env, DisasContext *s, uint32_t insn)
5572
{
5573
    int crn = (insn >> 16) & 0xf;
5574
    int crm = insn & 0xf;
5575
    int op1 = (insn >> 21) & 7;
5576
    int op2 = (insn >> 5) & 7;
5577
    int rt = (insn >> 12) & 0xf;
5578
    TCGv tmp;
5579

  
5580
    if (arm_feature(env, ARM_FEATURE_THUMB2EE)) {
5581
        if (op1 == 6 && crn == 0 && crm == 0 && op2 == 0) {
5582
            /* TEECR */
5583
            if (IS_USER(s))
5584
                return 1;
5585
            tmp = load_reg(s, rt);
5586
            gen_helper_set_teecr(cpu_env, tmp);
5587
            dead_tmp(tmp);
5588
            return 0;
5589
        }
5590
        if (op1 == 6 && crn == 1 && crm == 0 && op2 == 0) {
5591
            /* TEEHBR */
5592
            if (IS_USER(s) && (env->teecr & 1))
5593
                return 1;
5594
            tmp = load_reg(s, rt);
5595
            store_cpu_field(tmp, teehbr);
5596
            return 0;
5597
        }
5598
    }
5599
    fprintf(stderr, "Unknown cp14 write op1:%d crn:%d crm:%d op2:%d\n",
5600
            op1, crn, crm, op2);
5601
    return 1;
5602
}
5603

  
5539 5604
static int disas_coproc_insn(CPUState * env, DisasContext *s, uint32_t insn)
5540 5605
{
5541 5606
    int cpnum;
......
5557 5622
    case 10:
5558 5623
    case 11:
5559 5624
	return disas_vfp_insn (env, s, insn);
5625
    case 14:
5626
        /* Coprocessors 7-15 are architecturally reserved by ARM.
5627
           Unfortunately Intel decided to ignore this.  */
5628
        if (arm_feature(env, ARM_FEATURE_XSCALE))
5629
            goto board;
5630
        if (insn & (1 << 20))
5631
            return disas_cp14_read(env, s, insn);
5632
        else
5633
            return disas_cp14_write(env, s, insn);
5560 5634
    case 15:
5561 5635
	return disas_cp15_insn (env, s, insn);
5562 5636
    default:
5637
    board:
5563 5638
	/* Unknown coprocessor.  See if the board has hooked it.  */
5564 5639
	return disas_cp_insn (env, s, insn);
5565 5640
    }

Also available in: Unified diff