diff -r b5fc70fadacc -r a5209d79d241 xen/include/public/arch-x86/xen.h --- a/xen/include/public/arch-x86/xen.h Fri Aug 17 09:06:44 2007 +0200 +++ b/xen/include/public/arch-x86/xen.h Fri Aug 17 13:21:40 2007 +0200 @@ -81,6 +81,104 @@ 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 */ +} __attribute__((packed)); + + +#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; + uint16_t mc_socketid; + uint16_t mc_coreid; + uint16_t mc_vcpu_id; + uint64_t mc_gstatus; /* global status */ + uint32_t mc_flags; +} __attribute__((packed)); + +/* contains bank local x86 mc information */ +struct mcinfo_bank { + struct mcinfo_common common; + + uint16_t mc_bank; /* bank nr */ + uint64_t mc_status; /* bank status */ + uint64_t mc_addr; + uint64_t mc_misc; +} __attribute__((packed)); + + +/* sizeof(struct mcinfo_global) + 6 * sizeof(struct mcinfo_bank) == 200. + * This is enough space to store mc information of up to six banks. + */ +#define MCINFO_MAXSIZE (204 - sizeof(uint32_t)) + +struct arch_mc_info { + /* Number of mcainfo_* 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. + */ +/* 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,6 +271,7 @@ 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; + struct arch_mc_info mc_info; /* machine check information */ uint64_t pad[32]; }; typedef struct arch_shared_info arch_shared_info_t; diff -r b5fc70fadacc -r a5209d79d241 xen/include/public/foreign/reference.size --- a/xen/include/public/foreign/reference.size Fri Aug 17 09:06:44 2007 +0200 +++ b/xen/include/public/foreign/reference.size Fri Aug 17 13:21:40 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_shared_info | 268 280 272 -shared_info | 2584 3368 4384 +arch_mc_info | 204 204 - +arch_shared_info | 472 488 272 +shared_info | 2788 3576 4384 diff -r b5fc70fadacc -r a5209d79d241 xen/include/public/foreign/structs.py --- a/xen/include/public/foreign/structs.py Fri Aug 17 09:06:44 2007 +0200 +++ b/xen/include/public/foreign/structs.py Fri Aug 17 13:21:40 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" ];