Commit e83ce550688af60cd5f5f78db4071eaa4858065f

Authored by blueswir1
1 parent 4487fd34

Implement no-fault loads

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5148 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 36 additions and 8 deletions
target-sparc/op_helper.c
... ... @@ -1402,10 +1402,17 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1402 1402 address_mask(env, &addr);
1403 1403  
1404 1404 switch (asi) {
1405   - case 0x80: // Primary
1406 1405 case 0x82: // Primary no-fault
1407   - case 0x88: // Primary LE
1408 1406 case 0x8a: // Primary no-fault LE
  1407 + if (page_check_range(addr, size, PAGE_READ) == -1) {
  1408 +#ifdef DEBUG_ASI
  1409 + dump_asi("read ", last_addr, asi, size, ret);
  1410 +#endif
  1411 + return 0;
  1412 + }
  1413 + // Fall through
  1414 + case 0x80: // Primary
  1415 + case 0x88: // Primary LE
1409 1416 {
1410 1417 switch(size) {
1411 1418 case 1:
... ... @@ -1424,10 +1431,17 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1424 1431 }
1425 1432 }
1426 1433 break;
1427   - case 0x81: // Secondary
1428 1434 case 0x83: // Secondary no-fault
1429   - case 0x89: // Secondary LE
1430 1435 case 0x8b: // Secondary no-fault LE
  1436 + if (page_check_range(addr, size, PAGE_READ) == -1) {
  1437 +#ifdef DEBUG_ASI
  1438 + dump_asi("read ", last_addr, asi, size, ret);
  1439 +#endif
  1440 + return 0;
  1441 + }
  1442 + // Fall through
  1443 + case 0x81: // Secondary
  1444 + case 0x89: // Secondary LE
1431 1445 // XXX
1432 1446 break;
1433 1447 default:
... ... @@ -1564,12 +1578,19 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1564 1578  
1565 1579 helper_check_align(addr, size - 1);
1566 1580 switch (asi) {
  1581 + case 0x82: // Primary no-fault
  1582 + case 0x8a: // Primary no-fault LE
  1583 + if (cpu_get_phys_page_debug(env, addr) == -1ULL) {
  1584 +#ifdef DEBUG_ASI
  1585 + dump_asi("read ", last_addr, asi, size, ret);
  1586 +#endif
  1587 + return 0;
  1588 + }
  1589 + // Fall through
1567 1590 case 0x10: // As if user primary
1568 1591 case 0x18: // As if user primary LE
1569 1592 case 0x80: // Primary
1570   - case 0x82: // Primary no-fault
1571 1593 case 0x88: // Primary LE
1572   - case 0x8a: // Primary no-fault LE
1573 1594 if ((asi & 0x80) && (env->pstate & PS_PRIV)) {
1574 1595 if ((env->def->features & CPU_FEATURE_HYPV)
1575 1596 && env->hpstate & HS_PRIV) {
... ... @@ -1650,15 +1671,22 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1650 1671 // Only ldda allowed
1651 1672 raise_exception(TT_ILL_INSN);
1652 1673 return 0;
  1674 + case 0x83: // Secondary no-fault
  1675 + case 0x8b: // Secondary no-fault LE
  1676 + if (cpu_get_phys_page_debug(env, addr) == -1ULL) {
  1677 +#ifdef DEBUG_ASI
  1678 + dump_asi("read ", last_addr, asi, size, ret);
  1679 +#endif
  1680 + return 0;
  1681 + }
  1682 + // Fall through
1653 1683 case 0x04: // Nucleus
1654 1684 case 0x0c: // Nucleus Little Endian (LE)
1655 1685 case 0x11: // As if user secondary
1656 1686 case 0x19: // As if user secondary LE
1657 1687 case 0x4a: // UPA config
1658 1688 case 0x81: // Secondary
1659   - case 0x83: // Secondary no-fault
1660 1689 case 0x89: // Secondary LE
1661   - case 0x8b: // Secondary no-fault LE
1662 1690 // XXX
1663 1691 break;
1664 1692 case 0x45: // LSU
... ...