Revision d9bce9d9 target-ppc/helper.c
b/target-ppc/helper.c | ||
---|---|---|
37 | 37 |
/*****************************************************************************/ |
38 | 38 |
/* PowerPC MMU emulation */ |
39 | 39 |
|
40 |
#if defined(CONFIG_USER_ONLY)
|
|
40 |
#if defined(CONFIG_USER_ONLY) |
|
41 | 41 |
int cpu_ppc_handle_mmu_fault (CPUState *env, uint32_t address, int rw, |
42 | 42 |
int is_user, int is_softmmu) |
43 | 43 |
{ |
44 | 44 |
int exception, error_code; |
45 |
|
|
45 |
|
|
46 | 46 |
if (rw == 2) { |
47 | 47 |
exception = EXCP_ISI; |
48 | 48 |
error_code = 0; |
... | ... | |
277 | 277 |
ppc_tlb_t *tlb; |
278 | 278 |
int nr, best, way; |
279 | 279 |
int ret; |
280 |
|
|
280 |
|
|
281 | 281 |
best = -1; |
282 | 282 |
ret = -1; /* No TLB found */ |
283 | 283 |
for (way = 0; way < env->nb_ways; way++) { |
... | ... | |
672 | 672 |
if (loglevel > 0) { |
673 | 673 |
fprintf(logfile, "%s\n", __func__); |
674 | 674 |
} |
675 |
#endif
|
|
675 |
#endif |
|
676 | 676 |
if ((access_type == ACCESS_CODE && msr_ir == 0) || |
677 | 677 |
(access_type != ACCESS_CODE && msr_dr == 0)) { |
678 | 678 |
/* No address translation */ |
... | ... | |
693 | 693 |
__func__, eaddr, ctx->raddr); |
694 | 694 |
} |
695 | 695 |
#endif |
696 |
|
|
696 |
|
|
697 | 697 |
return ret; |
698 | 698 |
} |
699 | 699 |
|
... | ... | |
715 | 715 |
int exception = 0, error_code = 0; |
716 | 716 |
int access_type; |
717 | 717 |
int ret = 0; |
718 |
|
|
718 |
|
|
719 | 719 |
if (rw == 2) { |
720 | 720 |
/* code access */ |
721 | 721 |
rw = 0; |
... | ... | |
975 | 975 |
|
976 | 976 |
/*****************************************************************************/ |
977 | 977 |
/* Special registers manipulation */ |
978 |
#if defined(TARGET_PPC64) |
|
979 |
target_ulong ppc_load_asr (CPUPPCState *env) |
|
980 |
{ |
|
981 |
return env->asr; |
|
982 |
} |
|
983 |
|
|
984 |
void ppc_store_asr (CPUPPCState *env, target_ulong value) |
|
985 |
{ |
|
986 |
if (env->asr != value) { |
|
987 |
env->asr = value; |
|
988 |
tlb_flush(env, 1); |
|
989 |
} |
|
990 |
} |
|
991 |
#endif |
|
992 |
|
|
978 | 993 |
target_ulong do_load_sdr1 (CPUPPCState *env) |
979 | 994 |
{ |
980 | 995 |
return env->sdr1; |
... | ... | |
1039 | 1054 |
xer_ov = (value >> XER_OV) & 0x01; |
1040 | 1055 |
xer_ca = (value >> XER_CA) & 0x01; |
1041 | 1056 |
xer_cmp = (value >> XER_CMP) & 0xFF; |
1042 |
xer_bc = (value >> XER_BC) & 0x3F;
|
|
1057 |
xer_bc = (value >> XER_BC) & 0x7F;
|
|
1043 | 1058 |
} |
1044 | 1059 |
|
1045 | 1060 |
/* Swap temporary saved registers with GPRs */ |
... | ... | |
1066 | 1081 |
{ |
1067 | 1082 |
return |
1068 | 1083 |
#if defined (TARGET_PPC64) |
1069 |
(msr_sf << MSR_SF) | |
|
1070 |
(msr_isf << MSR_ISF) | |
|
1071 |
(msr_hv << MSR_HV) | |
|
1084 |
((target_ulong)msr_sf << MSR_SF) |
|
|
1085 |
((target_ulong)msr_isf << MSR_ISF) |
|
|
1086 |
((target_ulong)msr_hv << MSR_HV) |
|
|
1072 | 1087 |
#endif |
1073 |
(msr_ucle << MSR_UCLE) | |
|
1074 |
(msr_vr << MSR_VR) | /* VR / SPE */ |
|
1075 |
(msr_ap << MSR_AP) | |
|
1076 |
(msr_sa << MSR_SA) | |
|
1077 |
(msr_key << MSR_KEY) | |
|
1078 |
(msr_pow << MSR_POW) | /* POW / WE */ |
|
1079 |
(msr_tlb << MSR_TLB) | /* TLB / TGPE / CE */ |
|
1080 |
(msr_ile << MSR_ILE) | |
|
1081 |
(msr_ee << MSR_EE) | |
|
1082 |
(msr_pr << MSR_PR) | |
|
1083 |
(msr_fp << MSR_FP) | |
|
1084 |
(msr_me << MSR_ME) | |
|
1085 |
(msr_fe0 << MSR_FE0) | |
|
1086 |
(msr_se << MSR_SE) | /* SE / DWE / UBLE */ |
|
1087 |
(msr_be << MSR_BE) | /* BE / DE */ |
|
1088 |
(msr_fe1 << MSR_FE1) | |
|
1089 |
(msr_al << MSR_AL) | |
|
1090 |
(msr_ip << MSR_IP) | |
|
1091 |
(msr_ir << MSR_IR) | /* IR / IS */ |
|
1092 |
(msr_dr << MSR_DR) | /* DR / DS */ |
|
1093 |
(msr_pe << MSR_PE) | /* PE / EP */ |
|
1094 |
(msr_px << MSR_PX) | /* PX / PMM */ |
|
1095 |
(msr_ri << MSR_RI) | |
|
1096 |
(msr_le << MSR_LE); |
|
1088 |
((target_ulong)msr_ucle << MSR_UCLE) |
|
|
1089 |
((target_ulong)msr_vr << MSR_VR) | /* VR / SPE */
|
|
1090 |
((target_ulong)msr_ap << MSR_AP) |
|
|
1091 |
((target_ulong)msr_sa << MSR_SA) |
|
|
1092 |
((target_ulong)msr_key << MSR_KEY) |
|
|
1093 |
((target_ulong)msr_pow << MSR_POW) | /* POW / WE */
|
|
1094 |
((target_ulong)msr_tlb << MSR_TLB) | /* TLB / TGPE / CE */
|
|
1095 |
((target_ulong)msr_ile << MSR_ILE) |
|
|
1096 |
((target_ulong)msr_ee << MSR_EE) |
|
|
1097 |
((target_ulong)msr_pr << MSR_PR) |
|
|
1098 |
((target_ulong)msr_fp << MSR_FP) |
|
|
1099 |
((target_ulong)msr_me << MSR_ME) |
|
|
1100 |
((target_ulong)msr_fe0 << MSR_FE0) |
|
|
1101 |
((target_ulong)msr_se << MSR_SE) | /* SE / DWE / UBLE */
|
|
1102 |
((target_ulong)msr_be << MSR_BE) | /* BE / DE */
|
|
1103 |
((target_ulong)msr_fe1 << MSR_FE1) |
|
|
1104 |
((target_ulong)msr_al << MSR_AL) |
|
|
1105 |
((target_ulong)msr_ip << MSR_IP) |
|
|
1106 |
((target_ulong)msr_ir << MSR_IR) | /* IR / IS */
|
|
1107 |
((target_ulong)msr_dr << MSR_DR) | /* DR / DS */
|
|
1108 |
((target_ulong)msr_pe << MSR_PE) | /* PE / EP */
|
|
1109 |
((target_ulong)msr_px << MSR_PX) | /* PX / PMM */
|
|
1110 |
((target_ulong)msr_ri << MSR_RI) |
|
|
1111 |
((target_ulong)msr_le << MSR_LE);
|
|
1097 | 1112 |
} |
1098 | 1113 |
|
1099 | 1114 |
void do_store_msr (CPUPPCState *env, target_ulong value) |
... | ... | |
1156 | 1171 |
|
1157 | 1172 |
enter_pm = 0; |
1158 | 1173 |
switch (PPC_EXCP(env)) { |
1174 |
case PPC_FLAGS_EXCP_603: |
|
1175 |
/* Don't handle SLEEP mode: we should disable all clocks... |
|
1176 |
* No dynamic power-management. |
|
1177 |
*/ |
|
1178 |
if (msr_pow == 1 && (env->spr[SPR_HID0] & 0x00C00000) != 0) |
|
1179 |
enter_pm = 1; |
|
1180 |
break; |
|
1181 |
case PPC_FLAGS_EXCP_604: |
|
1182 |
if (msr_pow == 1) |
|
1183 |
enter_pm = 1; |
|
1184 |
break; |
|
1159 | 1185 |
case PPC_FLAGS_EXCP_7x0: |
1160 | 1186 |
if (msr_pow == 1 && (env->spr[SPR_HID0] & 0x00E00000) != 0) |
1161 | 1187 |
enter_pm = 1; |
... | ... | |
1171 | 1197 |
} |
1172 | 1198 |
} |
1173 | 1199 |
|
1200 |
#if defined(TARGET_PPC64) |
|
1201 |
void ppc_store_msr_32 (CPUPPCState *env, target_ulong value) |
|
1202 |
{ |
|
1203 |
do_store_msr(env, (uint32_t)value); |
|
1204 |
} |
|
1205 |
#endif |
|
1206 |
|
|
1174 | 1207 |
void do_compute_hflags (CPUPPCState *env) |
1175 | 1208 |
{ |
1176 | 1209 |
/* Compute current hflags */ |
1177 | 1210 |
env->hflags = (msr_pr << MSR_PR) | (msr_le << MSR_LE) | |
1178 | 1211 |
(msr_fp << MSR_FP) | (msr_fe0 << MSR_FE0) | (msr_fe1 << MSR_FE1) | |
1179 |
(msr_vr << MSR_VR) | (msr_ap << MSR_AP) | (msr_sa << MSR_SA) |
|
|
1212 |
(msr_vr << MSR_VR) | (msr_ap << MSR_AP) | (msr_sa << MSR_SA) | |
|
1180 | 1213 |
(msr_se << MSR_SE) | (msr_be << MSR_BE); |
1181 | 1214 |
#if defined (TARGET_PPC64) |
1182 |
env->hflags |= (msr_sf << MSR_SF) | (msr_hv << MSR_HV);
|
|
1215 |
env->hflags |= (msr_sf << (MSR_SF - 32)) | (msr_hv << (MSR_HV - 32));
|
|
1183 | 1216 |
#endif |
1184 | 1217 |
} |
1185 | 1218 |
|
... | ... | |
1193 | 1226 |
#else /* defined (CONFIG_USER_ONLY) */ |
1194 | 1227 |
static void dump_syscall(CPUState *env) |
1195 | 1228 |
{ |
1196 |
fprintf(logfile, "syscall r0=0x%08x r3=0x%08x r4=0x%08x "
|
|
1197 |
"r5=0x%08x r6=0x%08x nip=0x%08x\n",
|
|
1229 |
fprintf(logfile, "syscall r0=0x" REGX " r3=0x" REGX " r4=0x" REGX
|
|
1230 |
" r5=0x" REGX " r6=0x" REGX " nip=0x" REGX "\n",
|
|
1198 | 1231 |
env->gpr[0], env->gpr[3], env->gpr[4], |
1199 | 1232 |
env->gpr[5], env->gpr[6], env->nip); |
1200 | 1233 |
} |
Also available in: Unified diff