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