aboutsummaryrefslogtreecommitdiffstats
path: root/xen/include/asm-x86/mce.h
blob: 549bef3ebe3cf0570c9a28da1c548b75285df8c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <xen/types.h>
#include <public/arch-x86/xen-mca.h>
#ifndef _XEN_X86_MCE_H
#define _XEN_X86_MCE_H

/*
 * Emulate 2 banks for guest
 * Bank0: reserved for 'bank0 quirk' occur at some very old processors:
 *   1). Intel cpu whose family-model value < 06-1A;
 *   2). AMD K7
 * Bank1: used to transfer error info to guest
 */
#define GUEST_MC_BANK_NUM 2

/* Filter MSCOD model specific error code to guest */
#define MCi_STATUS_MSCOD_MASK (~(0xffffULL << 16))

/* No mci_ctl since it stick all 1's */
struct vmce_bank {
    uint64_t mci_status;
    uint64_t mci_addr;
    uint64_t mci_misc;
    uint64_t mci_ctl2;
};

/* No mcg_ctl since it not expose to guest */
struct vmce {
    uint64_t mcg_cap;
    uint64_t mcg_status;
    spinlock_t lock;
    struct vmce_bank bank[GUEST_MC_BANK_NUM];
};

/* Guest vMCE MSRs virtualization */
extern void vmce_init_vcpu(struct vcpu *);
extern int vmce_restore_vcpu(struct vcpu *, const struct hvm_vmce_vcpu *);
extern int vmce_wrmsr(uint32_t msr, uint64_t val);
extern int vmce_rdmsr(uint32_t msr, uint64_t *val);

extern unsigned int nr_mce_banks;

#endif