Revision a42bd6cc target-ppc/op_helper.c
b/target-ppc/op_helper.c | ||
---|---|---|
881 | 881 |
#if !defined (CONFIG_USER_ONLY) |
882 | 882 |
void do_rfi (void) |
883 | 883 |
{ |
884 |
env->nip = (target_ulong)(env->spr[SPR_SRR0] & ~0x00000003); |
|
885 |
T0 = (uint32_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL); |
|
886 | 884 |
#if defined(TARGET_PPC64) |
887 |
ppc_store_msr_32(env, T0); |
|
885 |
if (env->spr[SPR_SRR1] & (1ULL << MSR_SF)) { |
|
886 |
env->nip = (uint64_t)(env->spr[SPR_SRR0] & ~0x00000003); |
|
887 |
do_store_msr(env, (uint64_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL)); |
|
888 |
} else { |
|
889 |
env->nip = (uint32_t)(env->spr[SPR_SRR0] & ~0x00000003); |
|
890 |
ppc_store_msr_32(env, (uint32_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL)); |
|
891 |
} |
|
888 | 892 |
#else |
889 |
do_store_msr(env, T0); |
|
893 |
env->nip = (uint32_t)(env->spr[SPR_SRR0] & ~0x00000003); |
|
894 |
do_store_msr(env, (uint32_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL)); |
|
890 | 895 |
#endif |
891 | 896 |
#if defined (DEBUG_OP) |
892 | 897 |
dump_rfi(); |
... | ... | |
895 | 900 |
} |
896 | 901 |
|
897 | 902 |
#if defined(TARGET_PPC64) |
898 |
void do_rfi_32 (void) |
|
899 |
{ |
|
900 |
env->nip = (uint32_t)(env->spr[SPR_SRR0] & ~0x00000003); |
|
901 |
T0 = (uint32_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL); |
|
902 |
ppc_store_msr_32(env, T0); |
|
903 |
#if defined (DEBUG_OP) |
|
904 |
dump_rfi(); |
|
905 |
#endif |
|
906 |
env->interrupt_request |= CPU_INTERRUPT_EXITTB; |
|
907 |
} |
|
908 |
|
|
909 | 903 |
void do_rfid (void) |
910 | 904 |
{ |
911 |
env->nip = (target_ulong)(env->spr[SPR_SRR0] & ~0x00000003); |
|
912 |
T0 = (uint64_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL); |
|
913 |
do_store_msr(env, T0); |
|
914 |
#if defined (DEBUG_OP) |
|
915 |
dump_rfi(); |
|
916 |
#endif |
|
917 |
env->interrupt_request |= CPU_INTERRUPT_EXITTB; |
|
918 |
} |
|
919 |
|
|
920 |
void do_rfid_32 (void) |
|
921 |
{ |
|
922 |
env->nip = (uint32_t)(env->spr[SPR_SRR0] & ~0x00000003); |
|
923 |
T0 = (uint64_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL); |
|
924 |
do_store_msr(env, T0); |
|
905 |
if (env->spr[SPR_SRR1] & (1ULL << MSR_SF)) { |
|
906 |
env->nip = (uint64_t)(env->spr[SPR_SRR0] & ~0x00000003); |
|
907 |
do_store_msr(env, (uint64_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL)); |
|
908 |
} else { |
|
909 |
env->nip = (uint32_t)(env->spr[SPR_SRR0] & ~0x00000003); |
|
910 |
do_store_msr(env, (uint32_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL)); |
|
911 |
} |
|
925 | 912 |
#if defined (DEBUG_OP) |
926 | 913 |
dump_rfi(); |
927 | 914 |
#endif |
... | ... | |
936 | 923 |
((int32_t)T0 > (int32_t)T1 && (flags & 0x08)) || |
937 | 924 |
((int32_t)T0 == (int32_t)T1 && (flags & 0x04)) || |
938 | 925 |
((uint32_t)T0 < (uint32_t)T1 && (flags & 0x02)) || |
939 |
((uint32_t)T0 > (uint32_t)T1 && (flags & 0x01))))) |
|
926 |
((uint32_t)T0 > (uint32_t)T1 && (flags & 0x01))))) {
|
|
940 | 927 |
do_raise_exception_err(EXCP_PROGRAM, EXCP_TRAP); |
928 |
} |
|
941 | 929 |
} |
942 | 930 |
|
943 | 931 |
#if defined(TARGET_PPC64) |
... | ... | |
1196 | 1184 |
} |
1197 | 1185 |
|
1198 | 1186 |
#if !defined(CONFIG_USER_ONLY) |
1199 |
void do_4xx_rfci (void)
|
|
1187 |
void do_40x_rfci (void)
|
|
1200 | 1188 |
{ |
1201 | 1189 |
env->nip = env->spr[SPR_40x_SRR2]; |
1202 |
T0 = env->spr[SPR_40x_SRR3] & ~0xFFFF0000; |
|
1203 |
do_store_msr(env, T0); |
|
1190 |
do_store_msr(env, env->spr[SPR_40x_SRR3] & ~0xFFFF0000); |
|
1191 |
#if defined (DEBUG_OP) |
|
1192 |
dump_rfi(); |
|
1193 |
#endif |
|
1194 |
env->interrupt_request = CPU_INTERRUPT_EXITTB; |
|
1195 |
} |
|
1196 |
|
|
1197 |
void do_rfci (void) |
|
1198 |
{ |
|
1199 |
#if defined(TARGET_PPC64) |
|
1200 |
if (env->spr[SPR_BOOKE_CSRR1] & (1 << MSR_CM)) { |
|
1201 |
env->nip = (uint64_t)env->spr[SPR_BOOKE_CSRR0]; |
|
1202 |
} else |
|
1203 |
#endif |
|
1204 |
{ |
|
1205 |
env->nip = (uint32_t)env->spr[SPR_BOOKE_CSRR0]; |
|
1206 |
} |
|
1207 |
do_store_msr(env, (uint32_t)env->spr[SPR_BOOKE_CSRR1] & ~0x3FFF0000); |
|
1208 |
#if defined (DEBUG_OP) |
|
1209 |
dump_rfi(); |
|
1210 |
#endif |
|
1211 |
env->interrupt_request = CPU_INTERRUPT_EXITTB; |
|
1212 |
} |
|
1213 |
|
|
1214 |
void do_rfdi (void) |
|
1215 |
{ |
|
1216 |
#if defined(TARGET_PPC64) |
|
1217 |
if (env->spr[SPR_BOOKE_DSRR1] & (1 << MSR_CM)) { |
|
1218 |
env->nip = (uint64_t)env->spr[SPR_BOOKE_DSRR0]; |
|
1219 |
} else |
|
1220 |
#endif |
|
1221 |
{ |
|
1222 |
env->nip = (uint32_t)env->spr[SPR_BOOKE_DSRR0]; |
|
1223 |
} |
|
1224 |
do_store_msr(env, (uint32_t)env->spr[SPR_BOOKE_DSRR1] & ~0x3FFF0000); |
|
1225 |
#if defined (DEBUG_OP) |
|
1226 |
dump_rfi(); |
|
1227 |
#endif |
|
1228 |
env->interrupt_request = CPU_INTERRUPT_EXITTB; |
|
1229 |
} |
|
1230 |
|
|
1231 |
void do_rfmci (void) |
|
1232 |
{ |
|
1233 |
#if defined(TARGET_PPC64) |
|
1234 |
if (env->spr[SPR_BOOKE_MCSRR1] & (1 << MSR_CM)) { |
|
1235 |
env->nip = (uint64_t)env->spr[SPR_BOOKE_MCSRR0]; |
|
1236 |
} else |
|
1237 |
#endif |
|
1238 |
{ |
|
1239 |
env->nip = (uint32_t)env->spr[SPR_BOOKE_MCSRR0]; |
|
1240 |
} |
|
1241 |
do_store_msr(env, (uint32_t)env->spr[SPR_BOOKE_MCSRR1] & ~0x3FFF0000); |
|
1204 | 1242 |
#if defined (DEBUG_OP) |
1205 | 1243 |
dump_rfi(); |
1206 | 1244 |
#endif |
1207 | 1245 |
env->interrupt_request = CPU_INTERRUPT_EXITTB; |
1208 | 1246 |
} |
1209 | 1247 |
|
1210 |
void do_4xx_load_dcr (int dcrn)
|
|
1248 |
void do_load_dcr (void)
|
|
1211 | 1249 |
{ |
1212 | 1250 |
target_ulong val; |
1213 | 1251 |
|
1214 | 1252 |
if (unlikely(env->dcr_read == NULL)) |
1215 | 1253 |
do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_INVAL); |
1216 |
else if (unlikely((*env->dcr_read)(env->dcr_env, dcrn, &val) != 0))
|
|
1254 |
else if (unlikely((*env->dcr_read)(env->dcr_env, T0, &val) != 0))
|
|
1217 | 1255 |
do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_PRIV_REG); |
1218 | 1256 |
else |
1219 | 1257 |
T0 = val; |
1220 | 1258 |
} |
1221 | 1259 |
|
1222 |
void do_4xx_store_dcr (int dcrn)
|
|
1260 |
void do_store_dcr (void)
|
|
1223 | 1261 |
{ |
1224 | 1262 |
if (unlikely(env->dcr_write == NULL)) |
1225 | 1263 |
do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_INVAL); |
1226 |
else if (unlikely((*env->dcr_write)(env->dcr_env, dcrn, T0) != 0))
|
|
1264 |
else if (unlikely((*env->dcr_write)(env->dcr_env, T0, T1) != 0))
|
|
1227 | 1265 |
do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_PRIV_REG); |
1228 | 1266 |
} |
1229 | 1267 |
|
Also available in: Unified diff