Commit 1579a72ec5957297786ba5928e60571f4ab2f844

Authored by ths
1 parent f7cfb2a1

Fix RDHWR handling. Code formatting. Don't use *_direct versions to raise

exceptions.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2611 c046a42c-6fe2-441c-8c8c-71466251a162
target-mips/op.c
@@ -336,7 +336,7 @@ void op_addo (void) @@ -336,7 +336,7 @@ void op_addo (void)
336 T0 = (int32_t)T0 + (int32_t)T1; 336 T0 = (int32_t)T0 + (int32_t)T1;
337 if (((tmp ^ T1 ^ (-1)) & (T0 ^ T1)) >> 31) { 337 if (((tmp ^ T1 ^ (-1)) & (T0 ^ T1)) >> 31) {
338 /* operands of same sign, result different sign */ 338 /* operands of same sign, result different sign */
339 - CALL_FROM_TB1(do_raise_exception_direct, EXCP_OVERFLOW); 339 + CALL_FROM_TB1(do_raise_exception, EXCP_OVERFLOW);
340 } 340 }
341 T0 = (int32_t)T0; 341 T0 = (int32_t)T0;
342 RETURN(); 342 RETURN();
@@ -356,7 +356,7 @@ void op_subo (void) @@ -356,7 +356,7 @@ void op_subo (void)
356 T0 = (int32_t)T0 - (int32_t)T1; 356 T0 = (int32_t)T0 - (int32_t)T1;
357 if (((tmp ^ T1) & (tmp ^ T0)) >> 31) { 357 if (((tmp ^ T1) & (tmp ^ T0)) >> 31) {
358 /* operands of different sign, first operand and result different sign */ 358 /* operands of different sign, first operand and result different sign */
359 - CALL_FROM_TB1(do_raise_exception_direct, EXCP_OVERFLOW); 359 + CALL_FROM_TB1(do_raise_exception, EXCP_OVERFLOW);
360 } 360 }
361 T0 = (int32_t)T0; 361 T0 = (int32_t)T0;
362 RETURN(); 362 RETURN();
@@ -402,7 +402,7 @@ void op_daddo (void) @@ -402,7 +402,7 @@ void op_daddo (void)
402 T0 += T1; 402 T0 += T1;
403 if (((tmp ^ T1 ^ (-1)) & (T0 ^ T1)) >> 63) { 403 if (((tmp ^ T1 ^ (-1)) & (T0 ^ T1)) >> 63) {
404 /* operands of same sign, result different sign */ 404 /* operands of same sign, result different sign */
405 - CALL_FROM_TB1(do_raise_exception_direct, EXCP_OVERFLOW); 405 + CALL_FROM_TB1(do_raise_exception, EXCP_OVERFLOW);
406 } 406 }
407 RETURN(); 407 RETURN();
408 } 408 }
@@ -421,7 +421,7 @@ void op_dsubo (void) @@ -421,7 +421,7 @@ void op_dsubo (void)
421 T0 = (int64_t)T0 - (int64_t)T1; 421 T0 = (int64_t)T0 - (int64_t)T1;
422 if (((tmp ^ T1) & (tmp ^ T0)) >> 63) { 422 if (((tmp ^ T1) & (tmp ^ T0)) >> 63) {
423 /* operands of different sign, first operand and result different sign */ 423 /* operands of different sign, first operand and result different sign */
424 - CALL_FROM_TB1(do_raise_exception_direct, EXCP_OVERFLOW); 424 + CALL_FROM_TB1(do_raise_exception, EXCP_OVERFLOW);
425 } 425 }
426 RETURN(); 426 RETURN();
427 } 427 }
@@ -1650,7 +1650,7 @@ void op_cp0_enabled(void) @@ -1650,7 +1650,7 @@ void op_cp0_enabled(void)
1650 { 1650 {
1651 if (!(env->CP0_Status & (1 << CP0St_CU0)) && 1651 if (!(env->CP0_Status & (1 << CP0St_CU0)) &&
1652 (env->hflags & MIPS_HFLAG_UM)) { 1652 (env->hflags & MIPS_HFLAG_UM)) {
1653 - CALL_FROM_TB2(do_raise_exception_direct_err, EXCP_CpU, 0); 1653 + CALL_FROM_TB2(do_raise_exception_err, EXCP_CpU, 0);
1654 } 1654 }
1655 RETURN(); 1655 RETURN();
1656 } 1656 }
@@ -1658,7 +1658,7 @@ void op_cp0_enabled(void) @@ -1658,7 +1658,7 @@ void op_cp0_enabled(void)
1658 void op_cp1_enabled(void) 1658 void op_cp1_enabled(void)
1659 { 1659 {
1660 if (!(env->CP0_Status & (1 << CP0St_CU1))) { 1660 if (!(env->CP0_Status & (1 << CP0St_CU1))) {
1661 - CALL_FROM_TB2(do_raise_exception_direct_err, EXCP_CpU, 1); 1661 + CALL_FROM_TB2(do_raise_exception_err, EXCP_CpU, 1);
1662 } 1662 }
1663 RETURN(); 1663 RETURN();
1664 } 1664 }
@@ -2063,7 +2063,7 @@ void op_ei (void) @@ -2063,7 +2063,7 @@ void op_ei (void)
2063 void op_trap (void) 2063 void op_trap (void)
2064 { 2064 {
2065 if (T0) { 2065 if (T0) {
2066 - CALL_FROM_TB1(do_raise_exception_direct, EXCP_TRAP); 2066 + CALL_FROM_TB1(do_raise_exception, EXCP_TRAP);
2067 } 2067 }
2068 RETURN(); 2068 RETURN();
2069 } 2069 }
@@ -2116,37 +2116,67 @@ void op_deret (void) @@ -2116,37 +2116,67 @@ void op_deret (void)
2116 2116
2117 void op_rdhwr_cpunum(void) 2117 void op_rdhwr_cpunum(void)
2118 { 2118 {
2119 - if (env->CP0_HWREna & (1 << 0))  
2120 - T0 = env->CP0_EBase & 0x2ff; 2119 + if (!(env->hflags & MIPS_HFLAG_UM) ||
  2120 + (env->CP0_HWREna & (1 << 0)) ||
  2121 + (env->CP0_Status & (1 << CP0St_CU0)))
  2122 + T0 = env->CP0_EBase & 0x3ff;
2121 else 2123 else
2122 - CALL_FROM_TB1(do_raise_exception_direct, EXCP_RI); 2124 + CALL_FROM_TB1(do_raise_exception, EXCP_RI);
2123 RETURN(); 2125 RETURN();
2124 } 2126 }
2125 2127
2126 void op_rdhwr_synci_step(void) 2128 void op_rdhwr_synci_step(void)
2127 { 2129 {
2128 - if (env->CP0_HWREna & (1 << 1))  
2129 - T0 = env->SYNCI_Step; 2130 + if (!(env->hflags & MIPS_HFLAG_UM) ||
  2131 + (env->CP0_HWREna & (1 << 1)) ||
  2132 + (env->CP0_Status & (1 << CP0St_CU0)))
  2133 + T0 = env->SYNCI_Step;
2130 else 2134 else
2131 - CALL_FROM_TB1(do_raise_exception_direct, EXCP_RI); 2135 + CALL_FROM_TB1(do_raise_exception, EXCP_RI);
2132 RETURN(); 2136 RETURN();
2133 } 2137 }
2134 2138
2135 void op_rdhwr_cc(void) 2139 void op_rdhwr_cc(void)
2136 { 2140 {
2137 - if (env->CP0_HWREna & (1 << 2))  
2138 - T0 = env->CP0_Count; 2141 + if (!(env->hflags & MIPS_HFLAG_UM) ||
  2142 + (env->CP0_HWREna & (1 << 2)) ||
  2143 + (env->CP0_Status & (1 << CP0St_CU0)))
  2144 + T0 = env->CP0_Count;
2139 else 2145 else
2140 - CALL_FROM_TB1(do_raise_exception_direct, EXCP_RI); 2146 + CALL_FROM_TB1(do_raise_exception, EXCP_RI);
2141 RETURN(); 2147 RETURN();
2142 } 2148 }
2143 2149
2144 void op_rdhwr_ccres(void) 2150 void op_rdhwr_ccres(void)
2145 { 2151 {
2146 - if (env->CP0_HWREna & (1 << 3))  
2147 - T0 = env->CCRes; 2152 + if (!(env->hflags & MIPS_HFLAG_UM) ||
  2153 + (env->CP0_HWREna & (1 << 3)) ||
  2154 + (env->CP0_Status & (1 << CP0St_CU0)))
  2155 + T0 = env->CCRes;
2148 else 2156 else
2149 - CALL_FROM_TB1(do_raise_exception_direct, EXCP_RI); 2157 + CALL_FROM_TB1(do_raise_exception, EXCP_RI);
  2158 + RETURN();
  2159 +}
  2160 +
  2161 +void op_rdhwr_unimpl30(void)
  2162 +{
  2163 + if (!(env->hflags & MIPS_HFLAG_UM) ||
  2164 + (env->CP0_HWREna & (1 << 30)) ||
  2165 + (env->CP0_Status & (1 << CP0St_CU0)))
  2166 + T0 = 0;
  2167 + else
  2168 + CALL_FROM_TB1(do_raise_exception, EXCP_RI);
  2169 + RETURN();
  2170 +}
  2171 +
  2172 +void op_rdhwr_unimpl31(void)
  2173 +{
  2174 + if (!(env->hflags & MIPS_HFLAG_UM) ||
  2175 + (env->CP0_HWREna & (1 << 31)) ||
  2176 + (env->CP0_Status & (1 << CP0St_CU0)))
  2177 + T0 = 0;
  2178 + else
  2179 + CALL_FROM_TB1(do_raise_exception, EXCP_RI);
2150 RETURN(); 2180 RETURN();
2151 } 2181 }
2152 2182
target-mips/translate.c
@@ -1762,7 +1762,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel) @@ -1762,7 +1762,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel)
1762 break; 1762 break;
1763 default: 1763 default:
1764 goto die; 1764 goto die;
1765 - } 1765 + }
1766 break; 1766 break;
1767 case 4: 1767 case 4:
1768 switch (sel) { 1768 switch (sel) {
@@ -1776,7 +1776,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel) @@ -1776,7 +1776,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel)
1776 // break; 1776 // break;
1777 default: 1777 default:
1778 goto die; 1778 goto die;
1779 - } 1779 + }
1780 break; 1780 break;
1781 case 5: 1781 case 5:
1782 switch (sel) { 1782 switch (sel) {
@@ -1790,7 +1790,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel) @@ -1790,7 +1790,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel)
1790 break; 1790 break;
1791 default: 1791 default:
1792 goto die; 1792 goto die;
1793 - } 1793 + }
1794 break; 1794 break;
1795 case 6: 1795 case 6:
1796 switch (sel) { 1796 switch (sel) {
@@ -1820,7 +1820,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel) @@ -1820,7 +1820,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel)
1820 // break; 1820 // break;
1821 default: 1821 default:
1822 goto die; 1822 goto die;
1823 - } 1823 + }
1824 break; 1824 break;
1825 case 7: 1825 case 7:
1826 switch (sel) { 1826 switch (sel) {
@@ -1830,7 +1830,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel) @@ -1830,7 +1830,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel)
1830 break; 1830 break;
1831 default: 1831 default:
1832 goto die; 1832 goto die;
1833 - } 1833 + }
1834 break; 1834 break;
1835 case 8: 1835 case 8:
1836 switch (sel) { 1836 switch (sel) {
@@ -1861,7 +1861,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel) @@ -1861,7 +1861,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel)
1861 break; 1861 break;
1862 default: 1862 default:
1863 goto die; 1863 goto die;
1864 - } 1864 + }
1865 break; 1865 break;
1866 case 11: 1866 case 11:
1867 switch (sel) { 1867 switch (sel) {
@@ -1914,7 +1914,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel) @@ -1914,7 +1914,7 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel)
1914 break; 1914 break;
1915 default: 1915 default:
1916 goto die; 1916 goto die;
1917 - } 1917 + }
1918 break; 1918 break;
1919 case 15: 1919 case 15:
1920 switch (sel) { 1920 switch (sel) {
@@ -2521,7 +2521,7 @@ static void gen_mtc0 (DisasContext *ctx, int reg, int sel) @@ -2521,7 +2521,7 @@ static void gen_mtc0 (DisasContext *ctx, int reg, int sel)
2521 break; 2521 break;
2522 default: 2522 default:
2523 goto die; 2523 goto die;
2524 - } 2524 + }
2525 break; 2525 break;
2526 case 16: 2526 case 16:
2527 switch (sel) { 2527 switch (sel) {
@@ -2955,7 +2955,7 @@ static void gen_dmfc0 (DisasContext *ctx, int reg, int sel) @@ -2955,7 +2955,7 @@ static void gen_dmfc0 (DisasContext *ctx, int reg, int sel)
2955 break; 2955 break;
2956 default: 2956 default:
2957 goto die; 2957 goto die;
2958 - } 2958 + }
2959 break; 2959 break;
2960 case 4: 2960 case 4:
2961 switch (sel) { 2961 switch (sel) {
@@ -4703,83 +4703,92 @@ static void decode_opc (CPUState *env, DisasContext *ctx) @@ -4703,83 +4703,92 @@ static void decode_opc (CPUState *env, DisasContext *ctx)
4703 } 4703 }
4704 break; 4704 break;
4705 case OPC_SPECIAL3: 4705 case OPC_SPECIAL3:
4706 - op1 = MASK_SPECIAL3(ctx->opcode);  
4707 - switch (op1) {  
4708 - case OPC_EXT:  
4709 - case OPC_INS:  
4710 - gen_bitops(ctx, op1, rt, rs, sa, rd); 4706 + op1 = MASK_SPECIAL3(ctx->opcode);
  4707 + switch (op1) {
  4708 + case OPC_EXT:
  4709 + case OPC_INS:
  4710 + gen_bitops(ctx, op1, rt, rs, sa, rd);
  4711 + break;
  4712 + case OPC_BSHFL:
  4713 + op2 = MASK_BSHFL(ctx->opcode);
  4714 + switch (op2) {
  4715 + case OPC_WSBH:
  4716 + GEN_LOAD_REG_TN(T1, rt);
  4717 + gen_op_wsbh();
  4718 + break;
  4719 + case OPC_SEB:
  4720 + GEN_LOAD_REG_TN(T1, rt);
  4721 + gen_op_seb();
  4722 + break;
  4723 + case OPC_SEH:
  4724 + GEN_LOAD_REG_TN(T1, rt);
  4725 + gen_op_seh();
  4726 + break;
  4727 + default: /* Invalid */
  4728 + MIPS_INVAL("bshfl");
  4729 + generate_exception(ctx, EXCP_RI);
  4730 + break;
  4731 + }
  4732 + GEN_STORE_TN_REG(rd, T0);
4711 break; 4733 break;
4712 - case OPC_BSHFL:  
4713 - op2 = MASK_BSHFL(ctx->opcode);  
4714 - switch (op2) {  
4715 - case OPC_WSBH:  
4716 - GEN_LOAD_REG_TN(T1, rt);  
4717 - gen_op_wsbh(); 4734 + case OPC_RDHWR:
  4735 + switch (rd) {
  4736 + case 0:
  4737 + gen_op_rdhwr_cpunum();
4718 break; 4738 break;
4719 - case OPC_SEB:  
4720 - GEN_LOAD_REG_TN(T1, rt);  
4721 - gen_op_seb(); 4739 + case 1:
  4740 + gen_op_rdhwr_synci_step();
4722 break; 4741 break;
4723 - case OPC_SEH:  
4724 - GEN_LOAD_REG_TN(T1, rt);  
4725 - gen_op_seh(); 4742 + case 2:
  4743 + gen_op_rdhwr_cc();
4726 break; 4744 break;
4727 - default: /* Invalid */  
4728 - MIPS_INVAL("bshfl");  
4729 - generate_exception(ctx, EXCP_RI); 4745 + case 3:
  4746 + gen_op_rdhwr_ccres();
4730 break; 4747 break;
4731 - }  
4732 - GEN_STORE_TN_REG(rd, T0);  
4733 - break;  
4734 - case OPC_RDHWR:  
4735 - switch (rd) {  
4736 - case 0:  
4737 - gen_op_rdhwr_cpunum();  
4738 - break;  
4739 - case 1:  
4740 - gen_op_rdhwr_synci_step();  
4741 - break;  
4742 - case 2:  
4743 - gen_op_rdhwr_cc();  
4744 - break;  
4745 - case 3:  
4746 - gen_op_rdhwr_ccres();  
4747 - break; 4748 + case 29:
4748 #if defined (CONFIG_USER_ONLY) 4749 #if defined (CONFIG_USER_ONLY)
4749 - case 29:  
4750 - gen_op_tls_value ();  
4751 - GEN_STORE_TN_REG(rt, T0);  
4752 - break; 4750 + gen_op_tls_value ();
  4751 +#else
  4752 + generate_exception(ctx, EXCP_RI);
4753 #endif 4753 #endif
4754 - default: /* Invalid */  
4755 - MIPS_INVAL("rdhwr");  
4756 - generate_exception(ctx, EXCP_RI);  
4757 - break;  
4758 - }  
4759 - GEN_STORE_TN_REG(rt, T0);  
4760 - break; 4754 + break;
  4755 + case 30:
  4756 + /* Implementation dependent */;
  4757 + gen_op_rdhwr_unimpl30();
  4758 + break;
  4759 + case 31:
  4760 + /* Implementation dependent */;
  4761 + gen_op_rdhwr_unimpl31();
  4762 + break;
  4763 + default: /* Invalid */
  4764 + MIPS_INVAL("rdhwr");
  4765 + generate_exception(ctx, EXCP_RI);
  4766 + break;
  4767 + }
  4768 + GEN_STORE_TN_REG(rt, T0);
  4769 + break;
4761 #ifdef TARGET_MIPS64 4770 #ifdef TARGET_MIPS64
4762 - case OPC_DEXTM ... OPC_DEXT:  
4763 - case OPC_DINSM ... OPC_DINS:  
4764 - gen_bitops(ctx, op1, rt, rs, sa, rd); 4771 + case OPC_DEXTM ... OPC_DEXT:
  4772 + case OPC_DINSM ... OPC_DINS:
  4773 + gen_bitops(ctx, op1, rt, rs, sa, rd);
4765 break; 4774 break;
4766 - case OPC_DBSHFL:  
4767 - op2 = MASK_DBSHFL(ctx->opcode);  
4768 - switch (op2) {  
4769 - case OPC_DSBH:  
4770 - GEN_LOAD_REG_TN(T1, rt);  
4771 - gen_op_dsbh();  
4772 - break;  
4773 - case OPC_DSHD:  
4774 - GEN_LOAD_REG_TN(T1, rt);  
4775 - gen_op_dshd();  
4776 - break; 4775 + case OPC_DBSHFL:
  4776 + op2 = MASK_DBSHFL(ctx->opcode);
  4777 + switch (op2) {
  4778 + case OPC_DSBH:
  4779 + GEN_LOAD_REG_TN(T1, rt);
  4780 + gen_op_dsbh();
  4781 + break;
  4782 + case OPC_DSHD:
  4783 + GEN_LOAD_REG_TN(T1, rt);
  4784 + gen_op_dshd();
  4785 + break;
4777 default: /* Invalid */ 4786 default: /* Invalid */
4778 MIPS_INVAL("dbshfl"); 4787 MIPS_INVAL("dbshfl");
4779 generate_exception(ctx, EXCP_RI); 4788 generate_exception(ctx, EXCP_RI);
4780 break; 4789 break;
4781 - }  
4782 - GEN_STORE_TN_REG(rd, T0); 4790 + }
  4791 + GEN_STORE_TN_REG(rd, T0);
4783 #endif 4792 #endif
4784 default: /* Invalid */ 4793 default: /* Invalid */
4785 MIPS_INVAL("special3"); 4794 MIPS_INVAL("special3");