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