Revision 8c0fdd85 target-mips/translate.c

b/target-mips/translate.c
1371 1371
        rn = "EntryLo0";
1372 1372
        break;
1373 1373
    case 3:
1374
       /* also CONF */
1374 1375
        gen_op_mfc0_entrylo1();
1375 1376
        rn = "EntryLo1";
1376 1377
        break;
......
1386 1387
        gen_op_mfc0_wired();
1387 1388
        rn = "Wired";
1388 1389
        break;
1390
    case 7:
1391
//        gen_op_mfc0_info();
1392
        rn = "Info";
1393
        break;
1389 1394
    case 8:
1390 1395
        gen_op_mfc0_badvaddr();
1391 1396
        rn = "BadVaddr";
......
1445 1450
        gen_op_mfc0_watchhi();
1446 1451
        rn = "WatchHi";
1447 1452
        break;
1453
    case 20:
1454
       /* 64 bit only */
1455
//        gen_op_mfc0_xcontext();
1456
        rn = "XContext";
1457
        break;
1458
    case 21:
1459
//        gen_op_mfc0_framemask();
1460
        rn = "Framemask";
1461
        break;
1462
    case 22:
1463
//        gen_op_mfc0_diagnostic();
1464
        rn = "'Diagnostic";
1465
        break;
1448 1466
    case 23:
1449 1467
        gen_op_mfc0_debug();
1450 1468
        rn = "Debug";
......
1453 1471
        gen_op_mfc0_depc();
1454 1472
        rn = "DEPC";
1455 1473
        break;
1474
    case 25:
1475
//        gen_op_mfc0_performance();
1476
        rn = "Performance";
1477
        break;
1478
    case 26:
1479
//        gen_op_mfc0_ecc();
1480
        rn = "ECC";
1481
        break;
1482
    case 27:
1483
//        gen_op_mfc0_cacheerr();
1484
        rn = "CacheErr";
1485
        break;
1456 1486
    case 28:
1457 1487
        switch (sel) {
1458 1488
        case 0:
......
1468 1498
            goto die;
1469 1499
        }
1470 1500
        break;
1501
    case 29:
1502
//        gen_op_mfc0_taghi();
1503
        rn = "TagHi";
1504
        break;
1471 1505
    case 30:
1472 1506
        gen_op_mfc0_errorepc();
1473 1507
        rn = "ErrorEPC";
......
1498 1532
    generate_exception(ctx, EXCP_RI);
1499 1533
}
1500 1534

  
1535
static void gen_mtc0 (DisasContext *ctx, int reg, int sel)
1536
{
1537
    const unsigned char *rn;
1538
    uint32_t val, old;
1539

  
1540
    if (sel != 0 && reg != 16 && reg != 28) {
1541
        val = -1;
1542
        old = -1;
1543
        rn = "invalid";
1544
        goto die;
1545
    }
1546
    switch (reg) {
1547
    case 0:
1548
        gen_op_mtc0_index();
1549
        rn = "Index";
1550
        break;
1551
    case 1:
1552
// ignore or except?
1553
        rn = "Random";
1554
        break;
1555
    case 2:
1556
        gen_op_mtc0_entrylo0();
1557
        rn = "EntryLo0";
1558
        break;
1559
    case 3:
1560
        gen_op_mtc0_entrylo1();
1561
        rn = "EntryLo1";
1562
        break;
1563
    case 4:
1564
        gen_op_mtc0_context();
1565
        rn = "Context";
1566
        break;
1567
    case 5:
1568
        gen_op_mtc0_pagemask();
1569
        rn = "PageMask";
1570
        break;
1571
    case 6:
1572
        gen_op_mtc0_wired();
1573
        rn = "Wired";
1574
        break;
1575
    case 7:
1576
// ignore or except?
1577
        rn = "Info";
1578
        break;
1579
    case 8:
1580
// ignore or except?
1581
        rn = "BadVaddr";
1582
        break;
1583
    case 9:
1584
        gen_op_mtc0_count();
1585
        rn = "Count";
1586
        break;
1587
    case 10:
1588
        gen_op_mtc0_entryhi();
1589
        rn = "EntryHi";
1590
        break;
1591
    case 11:
1592
        gen_op_mtc0_compare();
1593
        rn = "Compare";
1594
        break;
1595
    case 12:
1596
        gen_op_mtc0_status();
1597
        rn = "Status";
1598
        break;
1599
    case 13:
1600
        gen_op_mtc0_cause();
1601
        rn = "Cause";
1602
        break;
1603
    case 14:
1604
        gen_op_mtc0_epc();
1605
        rn = "EPC";
1606
        break;
1607
    case 15:
1608
// ignore or except?
1609
        rn = "PRid";
1610
        break;
1611
    case 16:
1612
        switch (sel) {
1613
        case 0:
1614
           gen_op_mtc0_config0();
1615
            rn = "Config0";
1616
            break;
1617
        default:
1618
            rn = "Invalid config selector";
1619
            goto die;
1620
        }
1621
        break;
1622
    case 17:
1623
// ignore or except?
1624
        rn = "LLaddr";
1625
        break;
1626
    case 18:
1627
        gen_op_mtc0_watchlo();
1628
        rn = "WatchLo";
1629
        break;
1630
    case 19:
1631
        gen_op_mtc0_watchhi();
1632
        rn = "WatchHi";
1633
        break;
1634
    case 20:
1635
       /* 64 bit only */
1636
//     gen_op_mtc0_xcontext();
1637
        rn = "XContext";
1638
        break;
1639
    case 21:
1640
//        gen_op_mtc0_framemask();
1641
        rn = "Framemask";
1642
       break;
1643
    case 22:
1644
// ignore or except?
1645
        rn = "Diagnostic";
1646
       break;
1647
    case 23:
1648
        gen_op_mtc0_debug();
1649
        rn = "Debug";
1650
        break;
1651
    case 24:
1652
        gen_op_mtc0_depc();
1653
        rn = "DEPC";
1654
        break;
1655
    case 25:
1656
// ignore or except?
1657
        rn = "Performance";
1658
       break;
1659
    case 26:
1660
// ignore or except?
1661
        rn = "ECC";
1662
       break;
1663
    case 27:
1664
// ignore or except?
1665
        rn = "CacheErr";
1666
       break;
1667
    case 28:
1668
        switch (sel) {
1669
        case 0:
1670
            gen_op_mtc0_taglo();
1671
            rn = "TagLo";
1672
            break;
1673
        default:
1674
            rn = "invalid sel";
1675
            goto die;
1676
        }
1677
        break;
1678
    case 29:
1679
//     gen_op_mtc0_taghi();
1680
        rn = "TagHi";
1681
       break;
1682
    case 30:
1683
        gen_op_mtc0_errorepc();
1684
        rn = "ErrorEPC";
1685
        break;
1686
    case 31:
1687
        gen_op_mtc0_desave();
1688
        rn = "DESAVE";
1689
        break;
1690
    default:
1691
        rn = "unknown";
1692
       goto die;
1693
    }
1694
#if defined MIPS_DEBUG_DISAS
1695
    if (loglevel & CPU_LOG_TB_IN_ASM) {
1696
        fprintf(logfile, "%08x mtc0 %s => %08x (%d %d)\n",
1697
                env->PC, rn, T0, reg, sel);
1698
    }
1699
#endif
1700
    return;
1701

  
1702
die:
1703
#if defined MIPS_DEBUG_DISAS
1704
    if (loglevel & CPU_LOG_TB_IN_ASM) {
1705
        fprintf(logfile, "%08x mtc0 %s => %08x (%d %d)\n",
1706
                env->PC, rn, T0, reg, sel);
1707
    }
1708
#endif
1709
    generate_exception(ctx, EXCP_RI);
1710
}
1711

  
1501 1712
static void gen_cp0 (DisasContext *ctx, uint16_t opc, int rt, int rd)
1502 1713
{
1503 1714
    const unsigned char *opn = "unk";
......
1529 1740
        save_cpu_state(ctx, 1);
1530 1741
        ctx->pc -= 4;
1531 1742
        GEN_LOAD_REG_TN(T0, rt);
1532
        gen_op_mtc0(rd, ctx->opcode & 0x7);
1743
        gen_mtc0(ctx, rd, ctx->opcode & 0x7);
1533 1744
        /* Stop translation as we may have switched the execution mode */
1534 1745
        ctx->bstate = BS_STOP;
1535 1746
        opn = "mtc0";

Also available in: Unified diff