Commit 3cc6237083cd40247e060c1fcf403a2d9ccbaf92
1 parent
c4decf37
ppc fixes (Jocelyn Mayer)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1297 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
101 additions
and
67 deletions
target-ppc/cpu.h
target-ppc/helper.c
| ... | ... | @@ -18,10 +18,6 @@ |
| 18 | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 19 | 19 | */ |
| 20 | 20 | #include "exec.h" |
| 21 | -#if defined (USE_OPEN_FIRMWARE) | |
| 22 | -#include <time.h> | |
| 23 | -#include "of.h" | |
| 24 | -#endif | |
| 25 | 21 | |
| 26 | 22 | //#define DEBUG_MMU |
| 27 | 23 | //#define DEBUG_BATS |
| ... | ... | @@ -688,18 +684,6 @@ void do_interrupt (CPUState *env) |
| 688 | 684 | } |
| 689 | 685 | /* Generate informations in save/restore registers */ |
| 690 | 686 | switch (excp) { |
| 691 | - case EXCP_OFCALL: | |
| 692 | -#if defined (USE_OPEN_FIRMWARE) | |
| 693 | - env->gpr[3] = OF_client_entry((void *)env->gpr[3]); | |
| 694 | -#endif | |
| 695 | - return; | |
| 696 | - case EXCP_RTASCALL: | |
| 697 | -#if defined (USE_OPEN_FIRMWARE) | |
| 698 | - printf("RTAS call !\n"); | |
| 699 | - env->gpr[3] = RTAS_entry((void *)env->gpr[3]); | |
| 700 | - printf("RTAS call done\n"); | |
| 701 | -#endif | |
| 702 | - return; | |
| 703 | 687 | case EXCP_NONE: |
| 704 | 688 | /* Do nothing */ |
| 705 | 689 | #if defined (DEBUG_EXCEPTIONS) | ... | ... |
target-ppc/op.c
| ... | ... | @@ -697,9 +697,9 @@ PPC_OP(addzeo) |
| 697 | 697 | PPC_OP(divw) |
| 698 | 698 | { |
| 699 | 699 | if ((Ts0 == INT32_MIN && Ts1 == -1) || Ts1 == 0) { |
| 700 | - Ts0 = (-1) * (T0 >> 31); | |
| 700 | + T0 = (int32_t)((-1) * (T0 >> 31)); | |
| 701 | 701 | } else { |
| 702 | - Ts0 /= Ts1; | |
| 702 | + T0 = (Ts0 / Ts1); | |
| 703 | 703 | } |
| 704 | 704 | RETURN(); |
| 705 | 705 | } |
| ... | ... | @@ -712,7 +712,7 @@ PPC_OP(divwo) |
| 712 | 712 | T0 = (-1) * (T0 >> 31); |
| 713 | 713 | } else { |
| 714 | 714 | xer_ov = 0; |
| 715 | - Ts0 /= Ts1; | |
| 715 | + T0 = (Ts0 / Ts1); | |
| 716 | 716 | } |
| 717 | 717 | RETURN(); |
| 718 | 718 | } |
| ... | ... | @@ -744,7 +744,7 @@ PPC_OP(divwuo) |
| 744 | 744 | /* multiply high word */ |
| 745 | 745 | PPC_OP(mulhw) |
| 746 | 746 | { |
| 747 | - Ts0 = ((int64_t)Ts0 * (int64_t)Ts1) >> 32; | |
| 747 | + T0 = ((int64_t)Ts0 * (int64_t)Ts1) >> 32; | |
| 748 | 748 | RETURN(); |
| 749 | 749 | } |
| 750 | 750 | |
| ... | ... | @@ -758,7 +758,7 @@ PPC_OP(mulhwu) |
| 758 | 758 | /* multiply low immediate */ |
| 759 | 759 | PPC_OP(mulli) |
| 760 | 760 | { |
| 761 | - Ts0 *= SPARAM(1); | |
| 761 | + T0 = (Ts0 * SPARAM(1)); | |
| 762 | 762 | RETURN(); |
| 763 | 763 | } |
| 764 | 764 | |
| ... | ... | @@ -779,7 +779,7 @@ PPC_OP(mullwo) |
| 779 | 779 | } else { |
| 780 | 780 | xer_ov = 0; |
| 781 | 781 | } |
| 782 | - Ts0 = res; | |
| 782 | + T0 = (int32_t)res; | |
| 783 | 783 | RETURN(); |
| 784 | 784 | } |
| 785 | 785 | |
| ... | ... | @@ -787,7 +787,7 @@ PPC_OP(mullwo) |
| 787 | 787 | PPC_OP(neg) |
| 788 | 788 | { |
| 789 | 789 | if (T0 != 0x80000000) { |
| 790 | - Ts0 = -Ts0; | |
| 790 | + T0 = -Ts0; | |
| 791 | 791 | } |
| 792 | 792 | RETURN(); |
| 793 | 793 | } |
| ... | ... | @@ -799,7 +799,7 @@ PPC_OP(nego) |
| 799 | 799 | xer_so = 1; |
| 800 | 800 | } else { |
| 801 | 801 | xer_ov = 0; |
| 802 | - Ts0 = -Ts0; | |
| 802 | + T0 = -Ts0; | |
| 803 | 803 | } |
| 804 | 804 | RETURN(); |
| 805 | 805 | } |
| ... | ... | @@ -1047,14 +1047,14 @@ PPC_OP(eqv) |
| 1047 | 1047 | /* extend sign byte */ |
| 1048 | 1048 | PPC_OP(extsb) |
| 1049 | 1049 | { |
| 1050 | - Ts0 = (int8_t)(Ts0); | |
| 1050 | + T0 = (int32_t)((int8_t)(Ts0)); | |
| 1051 | 1051 | RETURN(); |
| 1052 | 1052 | } |
| 1053 | 1053 | |
| 1054 | 1054 | /* extend sign half word */ |
| 1055 | 1055 | PPC_OP(extsh) |
| 1056 | 1056 | { |
| 1057 | - Ts0 = (int16_t)(Ts0); | |
| 1057 | + T0 = (int32_t)((int16_t)(Ts0)); | |
| 1058 | 1058 | RETURN(); |
| 1059 | 1059 | } |
| 1060 | 1060 | |
| ... | ... | @@ -1175,8 +1175,8 @@ PPC_OP(sraw) |
| 1175 | 1175 | /* shift right algebraic word immediate */ |
| 1176 | 1176 | PPC_OP(srawi) |
| 1177 | 1177 | { |
| 1178 | - Ts1 = Ts0; | |
| 1179 | - Ts0 = Ts0 >> PARAM(1); | |
| 1178 | + T1 = T0; | |
| 1179 | + T0 = (Ts0 >> PARAM(1)); | |
| 1180 | 1180 | if (Ts1 < 0 && (Ts1 & PARAM(2)) != 0) { |
| 1181 | 1181 | xer_ca = 1; |
| 1182 | 1182 | } else { |
| ... | ... | @@ -1207,7 +1207,7 @@ PPC_OP(fadd) |
| 1207 | 1207 | /* fadds - fadds. */ |
| 1208 | 1208 | PPC_OP(fadds) |
| 1209 | 1209 | { |
| 1210 | - FTS0 += FTS1; | |
| 1210 | + FT0 = FTS0 + FTS1; | |
| 1211 | 1211 | RETURN(); |
| 1212 | 1212 | } |
| 1213 | 1213 | |
| ... | ... | @@ -1221,7 +1221,7 @@ PPC_OP(fsub) |
| 1221 | 1221 | /* fsubs - fsubs. */ |
| 1222 | 1222 | PPC_OP(fsubs) |
| 1223 | 1223 | { |
| 1224 | - FTS0 -= FTS1; | |
| 1224 | + FT0 = FTS0 - FTS1; | |
| 1225 | 1225 | RETURN(); |
| 1226 | 1226 | } |
| 1227 | 1227 | |
| ... | ... | @@ -1235,7 +1235,7 @@ PPC_OP(fmul) |
| 1235 | 1235 | /* fmuls - fmuls. */ |
| 1236 | 1236 | PPC_OP(fmuls) |
| 1237 | 1237 | { |
| 1238 | - FTS0 *= FTS1; | |
| 1238 | + FT0 = FTS0 * FTS1; | |
| 1239 | 1239 | RETURN(); |
| 1240 | 1240 | } |
| 1241 | 1241 | |
| ... | ... | @@ -1249,7 +1249,7 @@ PPC_OP(fdiv) |
| 1249 | 1249 | /* fdivs - fdivs. */ |
| 1250 | 1250 | PPC_OP(fdivs) |
| 1251 | 1251 | { |
| 1252 | - FTS0 /= FTS1; | |
| 1252 | + FT0 = FTS0 / FTS1; | |
| 1253 | 1253 | RETURN(); |
| 1254 | 1254 | } |
| 1255 | 1255 | |
| ... | ... | @@ -1299,7 +1299,7 @@ PPC_OP(fmadd) |
| 1299 | 1299 | /* fmadds - fmadds. */ |
| 1300 | 1300 | PPC_OP(fmadds) |
| 1301 | 1301 | { |
| 1302 | - FTS0 = (FTS0 * FTS1) + FTS2; | |
| 1302 | + FT0 = (FTS0 * FTS1) + FTS2; | |
| 1303 | 1303 | RETURN(); |
| 1304 | 1304 | } |
| 1305 | 1305 | |
| ... | ... | @@ -1313,7 +1313,7 @@ PPC_OP(fmsub) |
| 1313 | 1313 | /* fmsubs - fmsubs. */ |
| 1314 | 1314 | PPC_OP(fmsubs) |
| 1315 | 1315 | { |
| 1316 | - FTS0 = (FTS0 * FTS1) - FTS2; | |
| 1316 | + FT0 = (FTS0 * FTS1) - FTS2; | |
| 1317 | 1317 | RETURN(); |
| 1318 | 1318 | } |
| 1319 | 1319 | |
| ... | ... | @@ -1349,7 +1349,7 @@ PPC_OP(fnmsubs) |
| 1349 | 1349 | /* frsp - frsp. */ |
| 1350 | 1350 | PPC_OP(frsp) |
| 1351 | 1351 | { |
| 1352 | - FTS0 = FT0; | |
| 1352 | + FT0 = (float)FT0; | |
| 1353 | 1353 | RETURN(); |
| 1354 | 1354 | } |
| 1355 | 1355 | ... | ... |
target-ppc/op_helper.c
| ... | ... | @@ -188,10 +188,17 @@ void do_load_fpscr (void) |
| 188 | 188 | } u; |
| 189 | 189 | int i; |
| 190 | 190 | |
| 191 | - u.s.u[0] = 0; | |
| 192 | - u.s.u[1] = 0; | |
| 191 | +#ifdef WORDS_BIGENDIAN | |
| 192 | +#define WORD0 0 | |
| 193 | +#define WORD1 1 | |
| 194 | +#else | |
| 195 | +#define WORD0 1 | |
| 196 | +#define WORD1 0 | |
| 197 | +#endif | |
| 198 | + u.s.u[WORD0] = 0; | |
| 199 | + u.s.u[WORD1] = 0; | |
| 193 | 200 | for (i = 0; i < 8; i++) |
| 194 | - u.s.u[1] |= env->fpscr[i] << (4 * i); | |
| 201 | + u.s.u[WORD1] |= env->fpscr[i] << (4 * i); | |
| 195 | 202 | FT0 = u.d; |
| 196 | 203 | } |
| 197 | 204 | |
| ... | ... | @@ -210,10 +217,10 @@ void do_store_fpscr (uint32_t mask) |
| 210 | 217 | |
| 211 | 218 | u.d = FT0; |
| 212 | 219 | if (mask & 0x80) |
| 213 | - env->fpscr[0] = (env->fpscr[0] & 0x9) | ((u.s.u[1] >> 28) & ~0x9); | |
| 220 | + env->fpscr[0] = (env->fpscr[0] & 0x9) | ((u.s.u[WORD1] >> 28) & ~0x9); | |
| 214 | 221 | for (i = 1; i < 7; i++) { |
| 215 | 222 | if (mask & (1 << (7 - i))) |
| 216 | - env->fpscr[i] = (u.s.u[1] >> (4 * (7 - i))) & 0xF; | |
| 223 | + env->fpscr[i] = (u.s.u[WORD1] >> (4 * (7 - i))) & 0xF; | |
| 217 | 224 | } |
| 218 | 225 | /* TODO: update FEX & VX */ |
| 219 | 226 | /* Set rounding mode */ | ... | ... |
target-ppc/translate.c
| ... | ... | @@ -134,12 +134,13 @@ typedef struct DisasContext { |
| 134 | 134 | target_ulong nip; |
| 135 | 135 | uint32_t opcode; |
| 136 | 136 | uint32_t exception; |
| 137 | - /* Execution mode */ | |
| 137 | + /* Routine used to access memory */ | |
| 138 | + int mem_idx; | |
| 139 | + /* Translation flags */ | |
| 138 | 140 | #if !defined(CONFIG_USER_ONLY) |
| 139 | 141 | int supervisor; |
| 140 | 142 | #endif |
| 141 | - /* Routine used to access memory */ | |
| 142 | - int mem_idx; | |
| 143 | + int fpu_enabled; | |
| 143 | 144 | } DisasContext; |
| 144 | 145 | |
| 145 | 146 | typedef struct opc_handler_t { |
| ... | ... | @@ -330,19 +331,6 @@ GEN_HANDLER(stop, 0x06, 0x00, 0xFF, 0x03FFFFC1, PPC_COMMON) |
| 330 | 331 | RET_EXCP(ctx, EXCP_HLT, 0); |
| 331 | 332 | } |
| 332 | 333 | |
| 333 | -/* Special opcode to call open-firmware */ | |
| 334 | -GEN_HANDLER(of_enter, 0x06, 0x01, 0xFF, 0x03FFFFC1, PPC_COMMON) | |
| 335 | -{ | |
| 336 | - RET_EXCP(ctx, EXCP_OFCALL, 0); | |
| 337 | -} | |
| 338 | - | |
| 339 | -/* Special opcode to call RTAS */ | |
| 340 | -GEN_HANDLER(rtas_enter, 0x06, 0x02, 0xFF, 0x03FFFFC1, PPC_COMMON) | |
| 341 | -{ | |
| 342 | - printf("RTAS entry point !\n"); | |
| 343 | - RET_EXCP(ctx, EXCP_RTASCALL, 0); | |
| 344 | -} | |
| 345 | - | |
| 346 | 334 | static opc_handler_t invalid_handler = { |
| 347 | 335 | .inval = 0xFFFFFFFF, |
| 348 | 336 | .type = PPC_NONE, |
| ... | ... | @@ -764,6 +752,10 @@ __GEN_LOGICAL2(srw, 0x18, 0x10); |
| 764 | 752 | #define _GEN_FLOAT_ACB(name, op1, op2) \ |
| 765 | 753 | GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, PPC_FLOAT) \ |
| 766 | 754 | { \ |
| 755 | + if (!ctx->fpu_enabled) { \ | |
| 756 | + RET_EXCP(ctx, EXCP_NO_FP, 0); \ | |
| 757 | + return; \ | |
| 758 | + } \ | |
| 767 | 759 | gen_op_reset_scrfx(); \ |
| 768 | 760 | gen_op_load_fpr_FT0(rA(ctx->opcode)); \ |
| 769 | 761 | gen_op_load_fpr_FT1(rC(ctx->opcode)); \ |
| ... | ... | @@ -781,6 +773,10 @@ _GEN_FLOAT_ACB(name##s, 0x3B, op2); |
| 781 | 773 | #define _GEN_FLOAT_AB(name, op1, op2, inval) \ |
| 782 | 774 | GEN_HANDLER(f##name, op1, op2, 0xFF, inval, PPC_FLOAT) \ |
| 783 | 775 | { \ |
| 776 | + if (!ctx->fpu_enabled) { \ | |
| 777 | + RET_EXCP(ctx, EXCP_NO_FP, 0); \ | |
| 778 | + return; \ | |
| 779 | + } \ | |
| 784 | 780 | gen_op_reset_scrfx(); \ |
| 785 | 781 | gen_op_load_fpr_FT0(rA(ctx->opcode)); \ |
| 786 | 782 | gen_op_load_fpr_FT1(rB(ctx->opcode)); \ |
| ... | ... | @@ -796,6 +792,10 @@ _GEN_FLOAT_AB(name##s, 0x3B, op2, inval); |
| 796 | 792 | #define _GEN_FLOAT_AC(name, op1, op2, inval) \ |
| 797 | 793 | GEN_HANDLER(f##name, op1, op2, 0xFF, inval, PPC_FLOAT) \ |
| 798 | 794 | { \ |
| 795 | + if (!ctx->fpu_enabled) { \ | |
| 796 | + RET_EXCP(ctx, EXCP_NO_FP, 0); \ | |
| 797 | + return; \ | |
| 798 | + } \ | |
| 799 | 799 | gen_op_reset_scrfx(); \ |
| 800 | 800 | gen_op_load_fpr_FT0(rA(ctx->opcode)); \ |
| 801 | 801 | gen_op_load_fpr_FT1(rC(ctx->opcode)); \ |
| ... | ... | @@ -811,6 +811,10 @@ _GEN_FLOAT_AC(name##s, 0x3B, op2, inval); |
| 811 | 811 | #define GEN_FLOAT_B(name, op2, op3) \ |
| 812 | 812 | GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, PPC_FLOAT) \ |
| 813 | 813 | { \ |
| 814 | + if (!ctx->fpu_enabled) { \ | |
| 815 | + RET_EXCP(ctx, EXCP_NO_FP, 0); \ | |
| 816 | + return; \ | |
| 817 | + } \ | |
| 814 | 818 | gen_op_reset_scrfx(); \ |
| 815 | 819 | gen_op_load_fpr_FT0(rB(ctx->opcode)); \ |
| 816 | 820 | gen_op_f##name(); \ |
| ... | ... | @@ -822,6 +826,10 @@ GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, PPC_FLOAT) \ |
| 822 | 826 | #define GEN_FLOAT_BS(name, op2) \ |
| 823 | 827 | GEN_HANDLER(f##name, 0x3F, op2, 0xFF, 0x001F07C0, PPC_FLOAT) \ |
| 824 | 828 | { \ |
| 829 | + if (!ctx->fpu_enabled) { \ | |
| 830 | + RET_EXCP(ctx, EXCP_NO_FP, 0); \ | |
| 831 | + return; \ | |
| 832 | + } \ | |
| 825 | 833 | gen_op_reset_scrfx(); \ |
| 826 | 834 | gen_op_load_fpr_FT0(rB(ctx->opcode)); \ |
| 827 | 835 | gen_op_f##name(); \ |
| ... | ... | @@ -853,6 +861,10 @@ GEN_FLOAT_BS(sqrt, 0x16); |
| 853 | 861 | |
| 854 | 862 | GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) |
| 855 | 863 | { |
| 864 | + if (!ctx->fpu_enabled) { | |
| 865 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 866 | + return; | |
| 867 | + } | |
| 856 | 868 | gen_op_reset_scrfx(); |
| 857 | 869 | gen_op_load_fpr_FT0(rB(ctx->opcode)); |
| 858 | 870 | gen_op_fsqrts(); |
| ... | ... | @@ -883,6 +895,10 @@ GEN_FLOAT_B(rsp, 0x0C, 0x00); |
| 883 | 895 | /* fcmpo */ |
| 884 | 896 | GEN_HANDLER(fcmpo, 0x3F, 0x00, 0x00, 0x00600001, PPC_FLOAT) |
| 885 | 897 | { |
| 898 | + if (!ctx->fpu_enabled) { | |
| 899 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 900 | + return; | |
| 901 | + } | |
| 886 | 902 | gen_op_reset_scrfx(); |
| 887 | 903 | gen_op_load_fpr_FT0(rA(ctx->opcode)); |
| 888 | 904 | gen_op_load_fpr_FT1(rB(ctx->opcode)); |
| ... | ... | @@ -893,6 +909,10 @@ GEN_HANDLER(fcmpo, 0x3F, 0x00, 0x00, 0x00600001, PPC_FLOAT) |
| 893 | 909 | /* fcmpu */ |
| 894 | 910 | GEN_HANDLER(fcmpu, 0x3F, 0x00, 0x01, 0x00600001, PPC_FLOAT) |
| 895 | 911 | { |
| 912 | + if (!ctx->fpu_enabled) { | |
| 913 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 914 | + return; | |
| 915 | + } | |
| 896 | 916 | gen_op_reset_scrfx(); |
| 897 | 917 | gen_op_load_fpr_FT0(rA(ctx->opcode)); |
| 898 | 918 | gen_op_load_fpr_FT1(rB(ctx->opcode)); |
| ... | ... | @@ -907,6 +927,10 @@ GEN_FLOAT_B(abs, 0x08, 0x08); |
| 907 | 927 | /* fmr - fmr. */ |
| 908 | 928 | GEN_HANDLER(fmr, 0x3F, 0x08, 0x02, 0x001F0000, PPC_FLOAT) |
| 909 | 929 | { |
| 930 | + if (!ctx->fpu_enabled) { | |
| 931 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 932 | + return; | |
| 933 | + } | |
| 910 | 934 | gen_op_reset_scrfx(); |
| 911 | 935 | gen_op_load_fpr_FT0(rB(ctx->opcode)); |
| 912 | 936 | gen_op_store_FT0_fpr(rD(ctx->opcode)); |
| ... | ... | @@ -923,6 +947,10 @@ GEN_FLOAT_B(neg, 0x08, 0x01); |
| 923 | 947 | /* mcrfs */ |
| 924 | 948 | GEN_HANDLER(mcrfs, 0x3F, 0x00, 0x02, 0x0063F801, PPC_FLOAT) |
| 925 | 949 | { |
| 950 | + if (!ctx->fpu_enabled) { | |
| 951 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 952 | + return; | |
| 953 | + } | |
| 926 | 954 | gen_op_load_fpscr_T0(crfS(ctx->opcode)); |
| 927 | 955 | gen_op_store_T0_crf(crfD(ctx->opcode)); |
| 928 | 956 | gen_op_clear_fpscr(crfS(ctx->opcode)); |
| ... | ... | @@ -931,6 +959,10 @@ GEN_HANDLER(mcrfs, 0x3F, 0x00, 0x02, 0x0063F801, PPC_FLOAT) |
| 931 | 959 | /* mffs */ |
| 932 | 960 | GEN_HANDLER(mffs, 0x3F, 0x07, 0x12, 0x001FF800, PPC_FLOAT) |
| 933 | 961 | { |
| 962 | + if (!ctx->fpu_enabled) { | |
| 963 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 964 | + return; | |
| 965 | + } | |
| 934 | 966 | gen_op_load_fpscr(); |
| 935 | 967 | gen_op_store_FT0_fpr(rD(ctx->opcode)); |
| 936 | 968 | if (Rc(ctx->opcode)) |
| ... | ... | @@ -942,6 +974,10 @@ GEN_HANDLER(mtfsb0, 0x3F, 0x06, 0x02, 0x001FF800, PPC_FLOAT) |
| 942 | 974 | { |
| 943 | 975 | uint8_t crb; |
| 944 | 976 | |
| 977 | + if (!ctx->fpu_enabled) { | |
| 978 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 979 | + return; | |
| 980 | + } | |
| 945 | 981 | crb = crbD(ctx->opcode) >> 2; |
| 946 | 982 | gen_op_load_fpscr_T0(crb); |
| 947 | 983 | gen_op_andi_(~(1 << (crbD(ctx->opcode) & 0x03))); |
| ... | ... | @@ -955,6 +991,10 @@ GEN_HANDLER(mtfsb1, 0x3F, 0x06, 0x01, 0x001FF800, PPC_FLOAT) |
| 955 | 991 | { |
| 956 | 992 | uint8_t crb; |
| 957 | 993 | |
| 994 | + if (!ctx->fpu_enabled) { | |
| 995 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 996 | + return; | |
| 997 | + } | |
| 958 | 998 | crb = crbD(ctx->opcode) >> 2; |
| 959 | 999 | gen_op_load_fpscr_T0(crb); |
| 960 | 1000 | gen_op_ori(1 << (crbD(ctx->opcode) & 0x03)); |
| ... | ... | @@ -966,6 +1006,10 @@ GEN_HANDLER(mtfsb1, 0x3F, 0x06, 0x01, 0x001FF800, PPC_FLOAT) |
| 966 | 1006 | /* mtfsf */ |
| 967 | 1007 | GEN_HANDLER(mtfsf, 0x3F, 0x07, 0x16, 0x02010000, PPC_FLOAT) |
| 968 | 1008 | { |
| 1009 | + if (!ctx->fpu_enabled) { | |
| 1010 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 1011 | + return; | |
| 1012 | + } | |
| 969 | 1013 | gen_op_load_fpr_FT0(rB(ctx->opcode)); |
| 970 | 1014 | gen_op_store_fpscr(FM(ctx->opcode)); |
| 971 | 1015 | if (Rc(ctx->opcode)) |
| ... | ... | @@ -975,6 +1019,10 @@ GEN_HANDLER(mtfsf, 0x3F, 0x07, 0x16, 0x02010000, PPC_FLOAT) |
| 975 | 1019 | /* mtfsfi */ |
| 976 | 1020 | GEN_HANDLER(mtfsfi, 0x3F, 0x06, 0x04, 0x006f0800, PPC_FLOAT) |
| 977 | 1021 | { |
| 1022 | + if (!ctx->fpu_enabled) { | |
| 1023 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 1024 | + return; | |
| 1025 | + } | |
| 978 | 1026 | gen_op_store_T0_fpscri(crbD(ctx->opcode) >> 2, FPIMM(ctx->opcode)); |
| 979 | 1027 | if (Rc(ctx->opcode)) |
| 980 | 1028 | gen_op_set_Rc1(); |
| ... | ... | @@ -1525,6 +1573,10 @@ GEN_STFS(fs, 0x14); |
| 1525 | 1573 | /* stfiwx */ |
| 1526 | 1574 | GEN_HANDLER(stfiwx, 0x1F, 0x17, 0x1E, 0x00000001, PPC_FLOAT) |
| 1527 | 1575 | { |
| 1576 | + if (!ctx->fpu_enabled) { | |
| 1577 | + RET_EXCP(ctx, EXCP_NO_FP, 0); | |
| 1578 | + return; | |
| 1579 | + } | |
| 1528 | 1580 | RET_INVAL(ctx); |
| 1529 | 1581 | } |
| 1530 | 1582 | |
| ... | ... | @@ -2978,10 +3030,6 @@ void cpu_dump_state(CPUState *env, FILE *f, |
| 2978 | 3030 | cpu_fprintf(f, "reservation 0x%08x\n", env->reserve); |
| 2979 | 3031 | } |
| 2980 | 3032 | |
| 2981 | -#if !defined(CONFIG_USER_ONLY) && defined (USE_OPENFIRMWARE) | |
| 2982 | -int setup_machine (CPUPPCState *env, uint32_t mid); | |
| 2983 | -#endif | |
| 2984 | - | |
| 2985 | 3033 | CPUPPCState *cpu_ppc_init(void) |
| 2986 | 3034 | { |
| 2987 | 3035 | CPUPPCState *env; |
| ... | ... | @@ -2991,14 +3039,10 @@ CPUPPCState *cpu_ppc_init(void) |
| 2991 | 3039 | env = qemu_mallocz(sizeof(CPUPPCState)); |
| 2992 | 3040 | if (!env) |
| 2993 | 3041 | return NULL; |
| 2994 | -#if !defined(CONFIG_USER_ONLY) && defined (USE_OPEN_FIRMWARE) | |
| 2995 | - setup_machine(env, 0); | |
| 2996 | -#else | |
| 2997 | 3042 | // env->spr[PVR] = 0; /* Basic PPC */ |
| 2998 | 3043 | env->spr[PVR] = 0x00080100; /* G3 CPU */ |
| 2999 | 3044 | // env->spr[PVR] = 0x00083100; /* MPC755 (G3 embedded) */ |
| 3000 | 3045 | // env->spr[PVR] = 0x00070100; /* IBM 750FX */ |
| 3001 | -#endif | |
| 3002 | 3046 | tlb_flush(env, 1); |
| 3003 | 3047 | #if defined (DO_SINGLE_STEP) |
| 3004 | 3048 | /* Single step trace mode */ |
| ... | ... | @@ -3053,8 +3097,9 @@ int gen_intermediate_code_internal (CPUState *env, TranslationBlock *tb, |
| 3053 | 3097 | ctx.mem_idx = 0; |
| 3054 | 3098 | #else |
| 3055 | 3099 | ctx.supervisor = 1 - msr_pr; |
| 3056 | - ctx.mem_idx = (1 - msr_pr); | |
| 3100 | + ctx.mem_idx = 1 - msr_pr; | |
| 3057 | 3101 | #endif |
| 3102 | + ctx.fpu_enabled = msr_fp; | |
| 3058 | 3103 | #if defined (DO_SINGLE_STEP) |
| 3059 | 3104 | /* Single step trace mode */ |
| 3060 | 3105 | msr_se = 1; | ... | ... |