1 typedef unsigned long long u64; 2 typedef unsigned int u32; 3 typedef unsigned short u16; 4 typedef unsigned char u8; 5 6 #define __u64 u64 7 #define __u32 u32 8 #define __u16 u16 9 #define __u8 u8 10 11 /* kernel structure: */ 12 13 /* Fields are zero when not available */ 14 struct mce { 15 __u64 status; 16 __u64 misc; 17 __u64 addr; 18 __u64 mcgstatus; 19 __u64 ip; 20 __u64 tsc; /* cpu time stamp counter */ 21 __u64 time; /* wall time_t when error was detected */ 22 __u8 cpuvendor; /* cpu vendor as encoded in system.h */ 23 __u8 pad1; 24 __u16 pad2; 25 __u32 cpuid; /* CPUID 1 EAX */ 26 __u8 cs; /* code segment */ 27 __u8 bank; /* machine check bank */ 28 __u8 cpu; /* cpu number; obsolete; use extcpu now */ 29 __u8 finished; /* entry is valid */ 30 __u32 extcpu; /* linux cpu number that detected the error */ 31 __u32 socketid; /* CPU socket ID */ 32 __u32 apicid; /* CPU initial apic ID */ 33 __u64 mcgcap; /* MCGCAP MSR: machine check capabilities of CPU */ 34 __u64 synd; /* MCA_SYND MSR: only valid on SMCA systems */ 35 __u64 ipid; /* MCA_IPID MSR: only valid on SMCA systems */ 36 __u64 ppin; /* Protected Processor Inventory Number */ 37 __u32 microcode;/* Microcode revision */ 38 __u64 kflags; /* Internal kernel use */ 39 }; 40 41 #define X86_VENDOR_INTEL 0 42 #define X86_VENDOR_CYRIX 1 43 #define X86_VENDOR_AMD 2 44 #define X86_VENDOR_UMC 3 45 #define X86_VENDOR_CENTAUR 5 46 #define X86_VENDOR_TRANSMETA 7 47 #define X86_VENDOR_NSC 8 48 #define X86_VENDOR_NUM 9 49 50 #define MCE_OVERFLOW 0 /* bit 0 in flags means overflow */ 51 52 #define MCE_GET_RECORD_LEN _IOR('M', 1, int) 53 #define MCE_GET_LOG_LEN _IOR('M', 2, int) 54 #define MCE_GETCLEAR_FLAGS _IOR('M', 3, int) 55 56 /* Software defined banks */ 57 #define MCE_EXTENDED_BANK 128 58 59 #define MCE_THERMAL_BANK (MCE_EXTENDED_BANK + 0) 60 #define MCE_TIMEOUT_BANK (MCE_EXTENDED_BANK + 90) 61 62 #define MCE_APEI_BANK 255 63 64 #define MCI_THRESHOLD_OVER (1ULL<<48) /* threshold error count overflow */ 65 66 #define MCI_STATUS_VAL (1ULL<<63) /* valid error */ 67 #define MCI_STATUS_OVER (1ULL<<62) /* previous errors lost */ 68 #define MCI_STATUS_UC (1ULL<<61) /* uncorrected error */ 69 #define MCI_STATUS_EN (1ULL<<60) /* error enabled */ 70 #define MCI_STATUS_MISCV (1ULL<<59) /* misc error reg. valid */ 71 #define MCI_STATUS_ADDRV (1ULL<<58) /* addr reg. valid */ 72 #define MCI_STATUS_PCC (1ULL<<57) /* processor context corrupt */ 73 #define MCI_STATUS_S (1ULL<<56) /* signalled */ 74 #define MCI_STATUS_AR (1ULL<<55) /* action-required */ 75 #define MCI_STATUS_FWST (1ULL<<37) /* Firmware updated status indicator */ 76 77 #ifndef MCG_STATUS_RIPV 78 #define MCG_STATUS_RIPV (1ULL<<0) /* restart ip valid */ 79 #define MCG_STATUS_EIPV (1ULL<<1) /* eip points to correct instruction */ 80 #define MCG_STATUS_MCIP (1ULL<<2) /* machine check in progress */ 81 #define MCG_STATUS_LMCES (1ULL<<3) /* local machine check signaled */ 82 #endif 83 84 #define MCG_CMCI_P (1ULL<<10) /* CMCI supported */ 85 #define MCG_TES_P (1ULL<<11) /* Yellow bit cache threshold supported */ 86 #define MCG_SER_P (1ULL<<24) /* MCA recovery / new status */ 87 #define MCG_ELOG_P (1ULL<<26) /* Extended error log supported */ 88 #define MCG_LMCE_P (1ULL<<27) /* Local machine check supported */ 89 90 #define NELE(x) (sizeof(x)/sizeof(*(x))) 91 #define err(x) perror(x),exit(1) 92 #define sizeof_field(t, f) (sizeof(((t *)0)->f)) 93 #define endof_field(t, f) (sizeof(((t *)0)->f) + offsetof(t, f)) 94 95 #define round_up(x,y) (((x) + (y) - 1) & ~((y)-1)) 96 #define roundup(x,y) (((x) + (y) - 1) / (y) * (y)) 97 #define round_down(x,y) ((x) & ~((y)-1)) 98 99 #define BITS_PER_INT (sizeof(unsigned) * 8) 100 #define BITS_PER_LONG (sizeof(unsigned long) * 8) 101 102 #ifdef __GNUC__ 103 #define PRINTFLIKE __attribute__((format(printf,1,2))) 104 #define noreturn __attribute__((noreturn)) 105 #else 106 #define PRINTFLIKE 107 #define noreturn 108 #endif 109 110 #if defined(__FreeBSD__) && defined(_STDIO_H_) 111 FILE *open_memstream(char **cp, size_t *lenp); 112 #endif 113 114 int Wprintf(char *fmt, ...) PRINTFLIKE; 115 void Eprintf(char *fmt, ...) PRINTFLIKE; 116 void SYSERRprintf(char *fmt, ...) PRINTFLIKE; 117 void Lprintf(char *fmt, ...) PRINTFLIKE; 118 void Gprintf(char *fmt, ...) PRINTFLIKE; 119 120 extern int open_logfile(char *fn); 121 122 /* Don't forget to update mcelog.c:cputype_name[] too */ 123 enum cputype { 124 CPU_GENERIC, 125 CPU_P6OLD, 126 CPU_CORE2, /* 65nm and 45nm */ 127 CPU_K8, 128 CPU_P4, 129 CPU_NEHALEM, 130 CPU_DUNNINGTON, 131 CPU_TULSA, 132 CPU_INTEL, /* Intel architectural errors */ 133 CPU_XEON75XX, 134 CPU_SANDY_BRIDGE, 135 CPU_SANDY_BRIDGE_EP, 136 CPU_IVY_BRIDGE, 137 CPU_IVY_BRIDGE_EPEX, 138 CPU_HASWELL, 139 CPU_HASWELL_EPEX, 140 CPU_BROADWELL, 141 CPU_BROADWELL_DE, 142 CPU_BROADWELL_EPEX, 143 CPU_KNIGHTS_LANDING, 144 CPU_KNIGHTS_MILL, 145 CPU_ATOM, 146 CPU_SKYLAKE, 147 CPU_SKYLAKE_XEON, 148 CPU_KABYLAKE, 149 CPU_DENVERTON, 150 CPU_ICELAKE, 151 CPU_ICELAKE_XEON, 152 CPU_ICELAKE_DE, 153 CPU_TREMONT_D, 154 CPU_COMETLAKE, 155 CPU_TIGERLAKE, 156 CPU_ROCKETLAKE, 157 CPU_ALDERLAKE, 158 CPU_LAKEFIELD, 159 CPU_SAPPHIRERAPIDS, 160 }; 161 162 enum option_ranges { 163 O_COMMON = 500, 164 O_DISKDB = 1000, 165 }; 166 167 enum syslog_opt { 168 SYSLOG_LOG = (1 << 0), /* normal decoding output to syslog */ 169 SYSLOG_REMARK = (1 << 1), /* special warnings to syslog */ 170 SYSLOG_ERROR = (1 << 2), /* errors during operation to syslog */ 171 SYSLOG_ALL = SYSLOG_LOG|SYSLOG_REMARK|SYSLOG_ERROR, 172 SYSLOG_FORCE = (1 << 3), 173 }; 174 175 extern void usage(void); 176 extern void no_syslog(void); 177 extern void argsleft(int ac, char **av); 178 extern char *processor_flags; 179 extern int force_tsc; 180 extern enum syslog_opt syslog_opt; 181 extern int syslog_level; 182 extern enum cputype cputype; 183 extern int filter_memory_errors; 184 extern int imc_log; 185 extern int max_corr_err_counters; 186 extern void set_imc_log(int cputype); 187