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