diff -r 73832dfa9bcd -r 0fd5402a3730 xen/include/public/arch-x86/xen.h --- a/xen/include/public/arch-x86/xen.h Thu Aug 23 09:51:13 2007 +0200 +++ b/xen/include/public/arch-x86/xen.h Thu Aug 23 10:20:43 2007 +0200 @@ -81,6 +81,108 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t); #define MAX_VIRT_CPUS 32 #ifndef __ASSEMBLY__ + +/* + * Machine Check Architecure: + * structs are read-only and used to report all kinds of + * correctable and uncorrectable errors detected by the HW. + * Dom0 and DomU: register a handler to get notified. + * Dom0 only: Correctable errors are reported via VIRQ_MCA + * Dom0 and DomU: Uncorrectable errors are reported via nmi handlers + */ +#define MC_TYPE_GLOBAL 0 +#define MC_TYPE_BANK 1 + +struct mcinfo_common { + uint16_t type; /* structure type */ + uint16_t size; /* size of this struct in bytes */ +}; + + +#define MC_FLAG_CORRECTABLE (1 << 0) +#define MC_FLAG_UNCORRECTABLE (1 << 1) +/* contains global x86 mc information */ +struct mcinfo_global { + struct mcinfo_common common; + + uint16_t mc_domid; /* impacted domain */ + uint32_t mc_socketid; /* physical socket of the physical core */ + uint16_t mc_coreid; /* physical impacted core */ + uint16_t mc_core_threadid; /* core thread of physical core */ + uint16_t mc_vcpuid; /* virtual cpu scheduled for impacted domain */ + uint64_t mc_gstatus; /* global status */ + uint32_t mc_flags; +}; + +/* contains bank local x86 mc information */ +struct mcinfo_bank { + struct mcinfo_common common; + + uint32_t mc_bank; /* bank nr */ + uint64_t mc_status; /* bank status */ + uint64_t mc_addr; + uint64_t mc_misc; +}; + + +/* sizeof(struct mcinfo_global) + 6 * sizeof(struct mcinfo_bank) == 220. + * This is enough space to store mc information of up to six banks. + * 220 + sizeof(mi_nentries) = 224. + */ +#define MCINFO_MAXSIZE (224 - sizeof(uint32_t)) + +struct arch_mc_info { + /* Number of mcinfo_* entries in mi_data */ + uint32_t mi_nentries; + + uint8_t mi_data[MCINFO_MAXSIZE]; +}; +typedef struct arch_mc_info arch_mc_info_t; + + + +/* + * OS's should use these instead of writing their own helper functions + * each with its own bugs and drawbacks. + * We use macros instead of static inline functions to allow guests + * to include this header in assembly files (*.S). + */ +/* Prototype: + * uint32_t x86_mcinfo_nentries(struct shared_info *si); + */ +#define x86_mcinfo_nentries(_si) \ + (_si)->arch.mc_info.mi_nentries +/* Prototype: + * struct mcinfo_common *x86_mcinfo_first(struct shared_info *si); + */ +#define x86_mcinfo_first(_si) \ + (struct mcinfo_common *)((_si)->arch.mc_info.mi_data) +/* Prototype: + * struct mcinfo_common *x86_mcinfo_next(struct mcinfo_common *mic); + */ +#define x86_mcinfo_next(_mic) \ + (struct mcinfo_common *)((uint8_t *)(_mic) + (_mic)->size) + +/* Prototype: + * void x86_mcinfo_lookup(void *ret, struct shared_info *si, uint16_t type); + */ +#define x86_mcinfo_lookup(_ret, _si, _type) \ + do { \ + uint32_t found, i; \ + struct mcinfo_common *_mic; \ + \ + _mic = x86_mcinfo_first(_si); \ + found = 0; \ + for (i = 0; i < x86_mcinfo_nentries(_si); i++) { \ + if (_mic->type == (_type)) \ + found = 1; \ + else \ + _mic = x86_mcinfo_next(_mic); \ + } \ + (_ret) = found ? _mic : NULL; \ + } while (0) + + typedef unsigned long xen_ulong_t; @@ -173,7 +275,8 @@ struct arch_shared_info { /* Frame containing list of mfns containing list of mfns containing p2m. */ xen_pfn_t pfn_to_mfn_frame_list_list; unsigned long nmi_reason; - uint64_t pad[32]; + struct arch_mc_info mc_info; /* machine check information */ + uint32_t pad[8]; }; typedef struct arch_shared_info arch_shared_info_t; diff -r 73832dfa9bcd -r 0fd5402a3730 xen/include/public/foreign/reference.size --- a/xen/include/public/foreign/reference.size Thu Aug 23 09:51:13 2007 +0200 +++ b/xen/include/public/foreign/reference.size Thu Aug 23 10:20:43 2007 +0200 @@ -13,6 +13,7 @@ arch_vcpu_info | 24 arch_vcpu_info | 24 16 0 vcpu_time_info | 32 32 32 vcpu_info | 64 64 48 +arch_mc_info | 224 224 - arch_shared_info | 268 280 272 shared_info | 2584 3368 4384 diff -r 73832dfa9bcd -r 0fd5402a3730 xen/include/public/foreign/structs.py --- a/xen/include/public/foreign/structs.py Thu Aug 23 09:51:13 2007 +0200 +++ b/xen/include/public/foreign/structs.py Thu Aug 23 10:20:43 2007 +0200 @@ -15,6 +15,7 @@ structs = [ "start_info", "arch_vcpu_info", "vcpu_time_info", "vcpu_info", + "arch_mc_info", "arch_shared_info", "shared_info" ];