Revision 2fa11da0 target-i386/helper.c

b/target-i386/helper.c
28 28
#include "qemu-common.h"
29 29
#include "kvm.h"
30 30
#include "kvm_x86.h"
31
#ifndef CONFIG_USER_ONLY
32
#include "sysemu.h"
33
#endif
31 34

  
32 35
//#define DEBUG_MMU
33 36

  
......
1063 1066
        prev_debug_excp_handler(env);
1064 1067
}
1065 1068

  
1066
/* This should come from sysemu.h - if we could include it here... */
1067
void qemu_system_reset_request(void);
1068

  
1069
static void qemu_inject_x86_mce(CPUState *cenv, int bank, uint64_t status,
1070
                        uint64_t mcg_status, uint64_t addr, uint64_t misc)
1069
static void
1070
qemu_inject_x86_mce(CPUState *cenv, int bank, uint64_t status,
1071
                    uint64_t mcg_status, uint64_t addr, uint64_t misc)
1071 1072
{
1072 1073
    uint64_t mcg_cap = cenv->mcg_cap;
1073 1074
    uint64_t *banks = cenv->mce_banks;
......
1077 1078
     * reporting is disabled
1078 1079
     */
1079 1080
    if ((status & MCI_STATUS_UC) && (mcg_cap & MCG_CTL_P) &&
1080
        cenv->mcg_ctl != ~(uint64_t)0)
1081
        cenv->mcg_ctl != ~(uint64_t)0) {
1081 1082
        return;
1083
    }
1082 1084
    banks += 4 * bank;
1083 1085
    /*
1084 1086
     * if MSR_MCi_CTL is not all 1s, the uncorrected error
1085 1087
     * reporting is disabled for the bank
1086 1088
     */
1087
    if ((status & MCI_STATUS_UC) && banks[0] != ~(uint64_t)0)
1089
    if ((status & MCI_STATUS_UC) && banks[0] != ~(uint64_t)0) {
1088 1090
        return;
1091
    }
1089 1092
    if (status & MCI_STATUS_UC) {
1090 1093
        if ((cenv->mcg_status & MCG_STATUS_MCIP) ||
1091 1094
            !(cenv->cr[4] & CR4_MCE_MASK)) {
......
1095 1098
            qemu_system_reset_request();
1096 1099
            return;
1097 1100
        }
1098
        if (banks[1] & MCI_STATUS_VAL)
1101
        if (banks[1] & MCI_STATUS_VAL) {
1099 1102
            status |= MCI_STATUS_OVER;
1103
        }
1100 1104
        banks[2] = addr;
1101 1105
        banks[3] = misc;
1102 1106
        cenv->mcg_status = mcg_status;
......
1104 1108
        cpu_interrupt(cenv, CPU_INTERRUPT_MCE);
1105 1109
    } else if (!(banks[1] & MCI_STATUS_VAL)
1106 1110
               || !(banks[1] & MCI_STATUS_UC)) {
1107
        if (banks[1] & MCI_STATUS_VAL)
1111
        if (banks[1] & MCI_STATUS_VAL) {
1108 1112
            status |= MCI_STATUS_OVER;
1113
        }
1109 1114
        banks[2] = addr;
1110 1115
        banks[3] = misc;
1111 1116
        banks[1] = status;
1112
    } else
1117
    } else {
1113 1118
        banks[1] |= MCI_STATUS_OVER;
1119
    }
1114 1120
}
1115 1121

  
1116
void cpu_inject_x86_mce(CPUState *cenv, int bank, uint64_t status,
1122
void cpu_x86_inject_mce(CPUState *cenv, int bank, uint64_t status,
1117 1123
                        uint64_t mcg_status, uint64_t addr, uint64_t misc,
1118 1124
                        int broadcast)
1119 1125
{
......
1155 1161

  
1156 1162
static void mce_init(CPUX86State *cenv)
1157 1163
{
1158
    unsigned int bank, bank_num;
1164
    unsigned int bank;
1159 1165

  
1160
    if (((cenv->cpuid_version >> 8)&0xf) >= 6
1161
        && (cenv->cpuid_features&(CPUID_MCE|CPUID_MCA)) == (CPUID_MCE|CPUID_MCA)) {
1166
    if (((cenv->cpuid_version >> 8) & 0xf) >= 6
1167
        && (cenv->cpuid_features & (CPUID_MCE | CPUID_MCA)) ==
1168
            (CPUID_MCE | CPUID_MCA)) {
1162 1169
        cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF;
1163 1170
        cenv->mcg_ctl = ~(uint64_t)0;
1164
        bank_num = MCE_BANKS_DEF;
1165
        for (bank = 0; bank < bank_num; bank++)
1166
            cenv->mce_banks[bank*4] = ~(uint64_t)0;
1171
        for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
1172
            cenv->mce_banks[bank * 4] = ~(uint64_t)0;
1173
        }
1167 1174
    }
1168 1175
}
1169 1176

  

Also available in: Unified diff