]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/x86/x86/mca.c
MCA: Expand AMD Thresholding support to cover all banks
[FreeBSD/FreeBSD.git] / sys / x86 / x86 / mca.c
1 /*-
2  * Copyright (c) 2009 Hudson River Trading LLC
3  * Written by: John H. Baldwin <jhb@FreeBSD.org>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  */
27
28 /*
29  * Support for x86 machine check architecture.
30  */
31
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34
35 #ifdef __amd64__
36 #define DEV_APIC
37 #else
38 #include "opt_apic.h"
39 #endif
40
41 #include <sys/param.h>
42 #include <sys/bus.h>
43 #include <sys/interrupt.h>
44 #include <sys/kernel.h>
45 #include <sys/lock.h>
46 #include <sys/malloc.h>
47 #include <sys/mutex.h>
48 #include <sys/proc.h>
49 #include <sys/sched.h>
50 #include <sys/smp.h>
51 #include <sys/sysctl.h>
52 #include <sys/systm.h>
53 #include <sys/taskqueue.h>
54 #include <machine/intr_machdep.h>
55 #include <x86/apicvar.h>
56 #include <machine/cpu.h>
57 #include <machine/cputypes.h>
58 #include <x86/mca.h>
59 #include <machine/md_var.h>
60 #include <machine/specialreg.h>
61
62 /* Modes for mca_scan() */
63 enum scan_mode {
64         POLLED,
65         MCE,
66         CMCI,
67 };
68
69 #ifdef DEV_APIC
70 /*
71  * State maintained for each monitored MCx bank to control the
72  * corrected machine check interrupt threshold.
73  */
74 struct cmc_state {
75         int     max_threshold;
76         time_t  last_intr;
77 };
78
79 struct amd_et_state {
80         int     cur_threshold;
81         time_t  last_intr;
82 };
83 #endif
84
85 struct mca_internal {
86         struct mca_record rec;
87         int             logged;
88         STAILQ_ENTRY(mca_internal) link;
89 };
90
91 static MALLOC_DEFINE(M_MCA, "MCA", "Machine Check Architecture");
92
93 static volatile int mca_count;  /* Number of records stored. */
94 static int mca_banks;           /* Number of per-CPU register banks. */
95
96 static SYSCTL_NODE(_hw, OID_AUTO, mca, CTLFLAG_RD, NULL,
97     "Machine Check Architecture");
98
99 static int mca_enabled = 1;
100 SYSCTL_INT(_hw_mca, OID_AUTO, enabled, CTLFLAG_RDTUN, &mca_enabled, 0,
101     "Administrative toggle for machine check support");
102
103 static int amd10h_L1TP = 1;
104 SYSCTL_INT(_hw_mca, OID_AUTO, amd10h_L1TP, CTLFLAG_RDTUN, &amd10h_L1TP, 0,
105     "Administrative toggle for logging of level one TLB parity (L1TP) errors");
106
107 static int intel6h_HSD131;
108 SYSCTL_INT(_hw_mca, OID_AUTO, intel6h_HSD131, CTLFLAG_RDTUN, &intel6h_HSD131, 0,
109     "Administrative toggle for logging of spurious corrected errors");
110
111 int workaround_erratum383;
112 SYSCTL_INT(_hw_mca, OID_AUTO, erratum383, CTLFLAG_RDTUN,
113     &workaround_erratum383, 0,
114     "Is the workaround for Erratum 383 on AMD Family 10h processors enabled?");
115
116 static STAILQ_HEAD(, mca_internal) mca_freelist;
117 static int mca_freecount;
118 static STAILQ_HEAD(, mca_internal) mca_records;
119 static struct callout mca_timer;
120 static int mca_ticks = 3600;    /* Check hourly by default. */
121 static struct taskqueue *mca_tq;
122 static struct task mca_refill_task, mca_scan_task;
123 static struct mtx mca_lock;
124
125 #ifdef DEV_APIC
126 static struct cmc_state **cmc_state;            /* Indexed by cpuid, bank. */
127 static struct amd_et_state **amd_et_state;      /* Indexed by cpuid, bank. */
128 static int cmc_throttle = 60;   /* Time in seconds to throttle CMCI. */
129
130 static int amd_elvt = -1;
131
132 static inline bool
133 amd_thresholding_supported(void)
134 {
135         if (cpu_vendor_id != CPU_VENDOR_AMD)
136                 return (false);
137         /*
138          * The RASCap register is wholly reserved in families 0x10-0x15 (through model 1F).
139          *
140          * It begins to be documented in family 0x15 model 30 and family 0x16,
141          * but neither of these families documents the ScalableMca bit, which
142          * supposedly defines the presence of this feature on family 0x17.
143          */
144         if (CPUID_TO_FAMILY(cpu_id) >= 0x10 && CPUID_TO_FAMILY(cpu_id) <= 0x16)
145                 return (true);
146         if (CPUID_TO_FAMILY(cpu_id) >= 0x17)
147                 return ((amd_rascap & AMDRAS_SCALABLE_MCA) != 0);
148         return (false);
149 }
150 #endif
151
152 static inline bool
153 cmci_supported(uint64_t mcg_cap)
154 {
155         /*
156          * MCG_CAP_CMCI_P bit is reserved in AMD documentation.  Until
157          * it is defined, do not use it to check for CMCI support.
158          */
159         if (cpu_vendor_id != CPU_VENDOR_INTEL)
160                 return (false);
161         return ((mcg_cap & MCG_CAP_CMCI_P) != 0);
162 }
163
164 static int
165 sysctl_positive_int(SYSCTL_HANDLER_ARGS)
166 {
167         int error, value;
168
169         value = *(int *)arg1;
170         error = sysctl_handle_int(oidp, &value, 0, req);
171         if (error || req->newptr == NULL)
172                 return (error);
173         if (value <= 0)
174                 return (EINVAL);
175         *(int *)arg1 = value;
176         return (0);
177 }
178
179 static int
180 sysctl_mca_records(SYSCTL_HANDLER_ARGS)
181 {
182         int *name = (int *)arg1;
183         u_int namelen = arg2;
184         struct mca_record record;
185         struct mca_internal *rec;
186         int i;
187
188         if (namelen != 1)
189                 return (EINVAL);
190
191         if (name[0] < 0 || name[0] >= mca_count)
192                 return (EINVAL);
193
194         mtx_lock_spin(&mca_lock);
195         if (name[0] >= mca_count) {
196                 mtx_unlock_spin(&mca_lock);
197                 return (EINVAL);
198         }
199         i = 0;
200         STAILQ_FOREACH(rec, &mca_records, link) {
201                 if (i == name[0]) {
202                         record = rec->rec;
203                         break;
204                 }
205                 i++;
206         }
207         mtx_unlock_spin(&mca_lock);
208         return (SYSCTL_OUT(req, &record, sizeof(record)));
209 }
210
211 static const char *
212 mca_error_ttype(uint16_t mca_error)
213 {
214
215         switch ((mca_error & 0x000c) >> 2) {
216         case 0:
217                 return ("I");
218         case 1:
219                 return ("D");
220         case 2:
221                 return ("G");
222         }
223         return ("?");
224 }
225
226 static const char *
227 mca_error_level(uint16_t mca_error)
228 {
229
230         switch (mca_error & 0x0003) {
231         case 0:
232                 return ("L0");
233         case 1:
234                 return ("L1");
235         case 2:
236                 return ("L2");
237         case 3:
238                 return ("LG");
239         }
240         return ("L?");
241 }
242
243 static const char *
244 mca_error_request(uint16_t mca_error)
245 {
246
247         switch ((mca_error & 0x00f0) >> 4) {
248         case 0x0:
249                 return ("ERR");
250         case 0x1:
251                 return ("RD");
252         case 0x2:
253                 return ("WR");
254         case 0x3:
255                 return ("DRD");
256         case 0x4:
257                 return ("DWR");
258         case 0x5:
259                 return ("IRD");
260         case 0x6:
261                 return ("PREFETCH");
262         case 0x7:
263                 return ("EVICT");
264         case 0x8:
265                 return ("SNOOP");
266         }
267         return ("???");
268 }
269
270 static const char *
271 mca_error_mmtype(uint16_t mca_error)
272 {
273
274         switch ((mca_error & 0x70) >> 4) {
275         case 0x0:
276                 return ("GEN");
277         case 0x1:
278                 return ("RD");
279         case 0x2:
280                 return ("WR");
281         case 0x3:
282                 return ("AC");
283         case 0x4:
284                 return ("MS");
285         }
286         return ("???");
287 }
288
289 static int
290 mca_mute(const struct mca_record *rec)
291 {
292
293         /*
294          * Skip spurious corrected parity errors generated by Intel Haswell-
295          * and Broadwell-based CPUs (see HSD131, HSM142, HSW131 and BDM48
296          * erratum respectively), unless reporting is enabled.
297          * Note that these errors also have been observed with the D0-stepping
298          * of Haswell, while at least initially the CPU specification updates
299          * suggested only the C0-stepping to be affected.  Similarly, Celeron
300          * 2955U with a CPU ID of 0x45 apparently are also concerned with the
301          * same problem, with HSM142 only referring to 0x3c and 0x46.
302          */
303         if (cpu_vendor_id == CPU_VENDOR_INTEL &&
304             CPUID_TO_FAMILY(cpu_id) == 0x6 &&
305             (CPUID_TO_MODEL(cpu_id) == 0x3c ||  /* HSD131, HSM142, HSW131 */
306             CPUID_TO_MODEL(cpu_id) == 0x3d ||   /* BDM48 */
307             CPUID_TO_MODEL(cpu_id) == 0x45 ||
308             CPUID_TO_MODEL(cpu_id) == 0x46) &&  /* HSM142 */
309             rec->mr_bank == 0 &&
310             (rec->mr_status & 0xa0000000ffffffff) == 0x80000000000f0005 &&
311             !intel6h_HSD131)
312                 return (1);
313
314         return (0);
315 }
316
317 /* Dump details about a single machine check. */
318 static void
319 mca_log(const struct mca_record *rec)
320 {
321         uint16_t mca_error;
322
323         if (mca_mute(rec))
324                 return;
325
326         printf("MCA: Bank %d, Status 0x%016llx\n", rec->mr_bank,
327             (long long)rec->mr_status);
328         printf("MCA: Global Cap 0x%016llx, Status 0x%016llx\n",
329             (long long)rec->mr_mcg_cap, (long long)rec->mr_mcg_status);
330         printf("MCA: Vendor \"%s\", ID 0x%x, APIC ID %d\n", cpu_vendor,
331             rec->mr_cpu_id, rec->mr_apic_id);
332         printf("MCA: CPU %d ", rec->mr_cpu);
333         if (rec->mr_status & MC_STATUS_UC)
334                 printf("UNCOR ");
335         else {
336                 printf("COR ");
337                 if (cmci_supported(rec->mr_mcg_cap))
338                         printf("(%lld) ", ((long long)rec->mr_status &
339                             MC_STATUS_COR_COUNT) >> 38);
340         }
341         if (rec->mr_status & MC_STATUS_PCC)
342                 printf("PCC ");
343         if (rec->mr_status & MC_STATUS_OVER)
344                 printf("OVER ");
345         mca_error = rec->mr_status & MC_STATUS_MCA_ERROR;
346         switch (mca_error) {
347                 /* Simple error codes. */
348         case 0x0000:
349                 printf("no error");
350                 break;
351         case 0x0001:
352                 printf("unclassified error");
353                 break;
354         case 0x0002:
355                 printf("ucode ROM parity error");
356                 break;
357         case 0x0003:
358                 printf("external error");
359                 break;
360         case 0x0004:
361                 printf("FRC error");
362                 break;
363         case 0x0005:
364                 printf("internal parity error");
365                 break;
366         case 0x0400:
367                 printf("internal timer error");
368                 break;
369         default:
370                 if ((mca_error & 0xfc00) == 0x0400) {
371                         printf("internal error %x", mca_error & 0x03ff);
372                         break;
373                 }
374
375                 /* Compound error codes. */
376
377                 /* Memory hierarchy error. */
378                 if ((mca_error & 0xeffc) == 0x000c) {
379                         printf("%s memory error", mca_error_level(mca_error));
380                         break;
381                 }
382
383                 /* TLB error. */
384                 if ((mca_error & 0xeff0) == 0x0010) {
385                         printf("%sTLB %s error", mca_error_ttype(mca_error),
386                             mca_error_level(mca_error));
387                         break;
388                 }
389
390                 /* Memory controller error. */
391                 if ((mca_error & 0xef80) == 0x0080) {
392                         printf("%s channel ", mca_error_mmtype(mca_error));
393                         if ((mca_error & 0x000f) != 0x000f)
394                                 printf("%d", mca_error & 0x000f);
395                         else
396                                 printf("??");
397                         printf(" memory error");
398                         break;
399                 }
400                 
401                 /* Cache error. */
402                 if ((mca_error & 0xef00) == 0x0100) {
403                         printf("%sCACHE %s %s error",
404                             mca_error_ttype(mca_error),
405                             mca_error_level(mca_error),
406                             mca_error_request(mca_error));
407                         break;
408                 }
409
410                 /* Bus and/or Interconnect error. */
411                 if ((mca_error & 0xe800) == 0x0800) {                   
412                         printf("BUS%s ", mca_error_level(mca_error));
413                         switch ((mca_error & 0x0600) >> 9) {
414                         case 0:
415                                 printf("Source");
416                                 break;
417                         case 1:
418                                 printf("Responder");
419                                 break;
420                         case 2:
421                                 printf("Observer");
422                                 break;
423                         default:
424                                 printf("???");
425                                 break;
426                         }
427                         printf(" %s ", mca_error_request(mca_error));
428                         switch ((mca_error & 0x000c) >> 2) {
429                         case 0:
430                                 printf("Memory");
431                                 break;
432                         case 2:
433                                 printf("I/O");
434                                 break;
435                         case 3:
436                                 printf("Other");
437                                 break;
438                         default:
439                                 printf("???");
440                                 break;
441                         }
442                         if (mca_error & 0x0100)
443                                 printf(" timed out");
444                         break;
445                 }
446
447                 printf("unknown error %x", mca_error);
448                 break;
449         }
450         printf("\n");
451         if (rec->mr_status & MC_STATUS_ADDRV)
452                 printf("MCA: Address 0x%llx\n", (long long)rec->mr_addr);
453         if (rec->mr_status & MC_STATUS_MISCV)
454                 printf("MCA: Misc 0x%llx\n", (long long)rec->mr_misc);
455 }
456
457 static int
458 mca_check_status(int bank, struct mca_record *rec)
459 {
460         uint64_t status;
461         u_int p[4];
462
463         status = rdmsr(MSR_MC_STATUS(bank));
464         if (!(status & MC_STATUS_VAL))
465                 return (0);
466
467         /* Save exception information. */
468         rec->mr_status = status;
469         rec->mr_bank = bank;
470         rec->mr_addr = 0;
471         if (status & MC_STATUS_ADDRV)
472                 rec->mr_addr = rdmsr(MSR_MC_ADDR(bank));
473         rec->mr_misc = 0;
474         if (status & MC_STATUS_MISCV)
475                 rec->mr_misc = rdmsr(MSR_MC_MISC(bank));
476         rec->mr_tsc = rdtsc();
477         rec->mr_apic_id = PCPU_GET(apic_id);
478         rec->mr_mcg_cap = rdmsr(MSR_MCG_CAP);
479         rec->mr_mcg_status = rdmsr(MSR_MCG_STATUS);
480         rec->mr_cpu_id = cpu_id;
481         rec->mr_cpu_vendor_id = cpu_vendor_id;
482         rec->mr_cpu = PCPU_GET(cpuid);
483
484         /*
485          * Clear machine check.  Don't do this for uncorrectable
486          * errors so that the BIOS can see them.
487          */
488         if (!(rec->mr_status & (MC_STATUS_PCC | MC_STATUS_UC))) {
489                 wrmsr(MSR_MC_STATUS(bank), 0);
490                 do_cpuid(0, p);
491         }
492         return (1);
493 }
494
495 static void
496 mca_fill_freelist(void)
497 {
498         struct mca_internal *rec;
499         int desired;
500
501         /*
502          * Ensure we have at least one record for each bank and one
503          * record per CPU.
504          */
505         desired = imax(mp_ncpus, mca_banks);
506         mtx_lock_spin(&mca_lock);
507         while (mca_freecount < desired) {
508                 mtx_unlock_spin(&mca_lock);
509                 rec = malloc(sizeof(*rec), M_MCA, M_WAITOK);
510                 mtx_lock_spin(&mca_lock);
511                 STAILQ_INSERT_TAIL(&mca_freelist, rec, link);
512                 mca_freecount++;
513         }
514         mtx_unlock_spin(&mca_lock);
515 }
516
517 static void
518 mca_refill(void *context, int pending)
519 {
520
521         mca_fill_freelist();
522 }
523
524 static void
525 mca_record_entry(enum scan_mode mode, const struct mca_record *record)
526 {
527         struct mca_internal *rec;
528
529         if (mode == POLLED) {
530                 rec = malloc(sizeof(*rec), M_MCA, M_WAITOK);
531                 mtx_lock_spin(&mca_lock);
532         } else {
533                 mtx_lock_spin(&mca_lock);
534                 rec = STAILQ_FIRST(&mca_freelist);
535                 if (rec == NULL) {
536                         printf("MCA: Unable to allocate space for an event.\n");
537                         mca_log(record);
538                         mtx_unlock_spin(&mca_lock);
539                         return;
540                 }
541                 STAILQ_REMOVE_HEAD(&mca_freelist, link);
542                 mca_freecount--;
543         }
544
545         rec->rec = *record;
546         rec->logged = 0;
547         STAILQ_INSERT_TAIL(&mca_records, rec, link);
548         mca_count++;
549         mtx_unlock_spin(&mca_lock);
550         if (mode == CMCI && !cold)
551                 taskqueue_enqueue(mca_tq, &mca_refill_task);
552 }
553
554 #ifdef DEV_APIC
555 /*
556  * Update the interrupt threshold for a CMCI.  The strategy is to use
557  * a low trigger that interrupts as soon as the first event occurs.
558  * However, if a steady stream of events arrive, the threshold is
559  * increased until the interrupts are throttled to once every
560  * cmc_throttle seconds or the periodic scan.  If a periodic scan
561  * finds that the threshold is too high, it is lowered.
562  */
563 static int
564 update_threshold(enum scan_mode mode, int valid, int last_intr, int count,
565     int cur_threshold, int max_threshold)
566 {
567         u_int delta;
568         int limit;
569
570         delta = (u_int)(time_uptime - last_intr);
571         limit = cur_threshold;
572
573         /*
574          * If an interrupt was received less than cmc_throttle seconds
575          * since the previous interrupt and the count from the current
576          * event is greater than or equal to the current threshold,
577          * double the threshold up to the max.
578          */
579         if (mode == CMCI && valid) {
580                 if (delta < cmc_throttle && count >= limit &&
581                     limit < max_threshold) {
582                         limit = min(limit << 1, max_threshold);
583                 }
584                 return (limit);
585         }
586
587         /*
588          * When the banks are polled, check to see if the threshold
589          * should be lowered.
590          */
591         if (mode != POLLED)
592                 return (limit);
593
594         /* If a CMCI occured recently, do nothing for now. */
595         if (delta < cmc_throttle)
596                 return (limit);
597
598         /*
599          * Compute a new limit based on the average rate of events per
600          * cmc_throttle seconds since the last interrupt.
601          */
602         if (valid) {
603                 limit = count * cmc_throttle / delta;
604                 if (limit <= 0)
605                         limit = 1;
606                 else if (limit > max_threshold)
607                         limit = max_threshold;
608         } else {
609                 limit = 1;
610         }
611         return (limit);
612 }
613
614 static void
615 cmci_update(enum scan_mode mode, int bank, int valid, struct mca_record *rec)
616 {
617         struct cmc_state *cc;
618         uint64_t ctl;
619         int cur_threshold, new_threshold;
620         int count;
621
622         /* Fetch the current limit for this bank. */
623         cc = &cmc_state[PCPU_GET(cpuid)][bank];
624         ctl = rdmsr(MSR_MC_CTL2(bank));
625         count = (rec->mr_status & MC_STATUS_COR_COUNT) >> 38;
626         cur_threshold = ctl & MC_CTL2_THRESHOLD;
627
628         new_threshold = update_threshold(mode, valid, cc->last_intr, count,
629             cur_threshold, cc->max_threshold);
630
631         if (mode == CMCI && valid)
632                 cc->last_intr = time_uptime;
633         if (new_threshold != cur_threshold) {
634                 ctl &= ~MC_CTL2_THRESHOLD;
635                 ctl |= new_threshold;
636                 wrmsr(MSR_MC_CTL2(bank), ctl);
637         }
638 }
639
640 static void
641 amd_thresholding_update(enum scan_mode mode, int bank, int valid)
642 {
643         struct amd_et_state *cc;
644         uint64_t misc;
645         int new_threshold;
646         int count;
647
648         cc = &amd_et_state[PCPU_GET(cpuid)][bank];
649         misc = rdmsr(MSR_MC_MISC(bank));
650         count = (misc & MC_MISC_AMD_CNT_MASK) >> MC_MISC_AMD_CNT_SHIFT;
651         count = count - (MC_MISC_AMD_CNT_MAX - cc->cur_threshold);
652
653         new_threshold = update_threshold(mode, valid, cc->last_intr, count,
654             cc->cur_threshold, MC_MISC_AMD_CNT_MAX);
655
656         cc->cur_threshold = new_threshold;
657         misc &= ~MC_MISC_AMD_CNT_MASK;
658         misc |= (uint64_t)(MC_MISC_AMD_CNT_MAX - cc->cur_threshold)
659             << MC_MISC_AMD_CNT_SHIFT;
660         misc &= ~MC_MISC_AMD_OVERFLOW;
661         wrmsr(MSR_MC_MISC(bank), misc);
662         if (mode == CMCI && valid)
663                 cc->last_intr = time_uptime;
664 }
665 #endif
666
667 /*
668  * This scans all the machine check banks of the current CPU to see if
669  * there are any machine checks.  Any non-recoverable errors are
670  * reported immediately via mca_log().  The current thread must be
671  * pinned when this is called.  The 'mode' parameter indicates if we
672  * are being called from the MC exception handler, the CMCI handler,
673  * or the periodic poller.  In the MC exception case this function
674  * returns true if the system is restartable.  Otherwise, it returns a
675  * count of the number of valid MC records found.
676  */
677 static int
678 mca_scan(enum scan_mode mode, int *recoverablep)
679 {
680         struct mca_record rec;
681         uint64_t mcg_cap, ucmask;
682         int count, i, recoverable, valid;
683
684         count = 0;
685         recoverable = 1;
686         ucmask = MC_STATUS_UC | MC_STATUS_PCC;
687
688         /* When handling a MCE#, treat the OVER flag as non-restartable. */
689         if (mode == MCE)
690                 ucmask |= MC_STATUS_OVER;
691         mcg_cap = rdmsr(MSR_MCG_CAP);
692         for (i = 0; i < (mcg_cap & MCG_CAP_COUNT); i++) {
693 #ifdef DEV_APIC
694                 /*
695                  * For a CMCI, only check banks this CPU is
696                  * responsible for.
697                  */
698                 if (mode == CMCI && !(PCPU_GET(cmci_mask) & 1 << i))
699                         continue;
700 #endif
701
702                 valid = mca_check_status(i, &rec);
703                 if (valid) {
704                         count++;
705                         if (rec.mr_status & ucmask) {
706                                 recoverable = 0;
707                                 mtx_lock_spin(&mca_lock);
708                                 mca_log(&rec);
709                                 mtx_unlock_spin(&mca_lock);
710                         }
711                         mca_record_entry(mode, &rec);
712                 }
713         
714 #ifdef DEV_APIC
715                 /*
716                  * If this is a bank this CPU monitors via CMCI,
717                  * update the threshold.
718                  */
719                 if (PCPU_GET(cmci_mask) & 1 << i) {
720                         if (cmc_state != NULL)
721                                 cmci_update(mode, i, valid, &rec);
722                         else
723                                 amd_thresholding_update(mode, i, valid);
724                 }
725 #endif
726         }
727         if (mode == POLLED)
728                 mca_fill_freelist();
729         if (recoverablep != NULL)
730                 *recoverablep = recoverable;
731         return (count);
732 }
733
734 /*
735  * Scan the machine check banks on all CPUs by binding to each CPU in
736  * turn.  If any of the CPUs contained new machine check records, log
737  * them to the console.
738  */
739 static void
740 mca_scan_cpus(void *context, int pending)
741 {
742         struct mca_internal *mca;
743         struct thread *td;
744         int count, cpu;
745
746         mca_fill_freelist();
747         td = curthread;
748         count = 0;
749         thread_lock(td);
750         CPU_FOREACH(cpu) {
751                 sched_bind(td, cpu);
752                 thread_unlock(td);
753                 count += mca_scan(POLLED, NULL);
754                 thread_lock(td);
755                 sched_unbind(td);
756         }
757         thread_unlock(td);
758         if (count != 0) {
759                 mtx_lock_spin(&mca_lock);
760                 STAILQ_FOREACH(mca, &mca_records, link) {
761                         if (!mca->logged) {
762                                 mca->logged = 1;
763                                 mca_log(&mca->rec);
764                         }
765                 }
766                 mtx_unlock_spin(&mca_lock);
767         }
768 }
769
770 static void
771 mca_periodic_scan(void *arg)
772 {
773
774         taskqueue_enqueue(mca_tq, &mca_scan_task);
775         callout_reset(&mca_timer, mca_ticks * hz, mca_periodic_scan, NULL);
776 }
777
778 static int
779 sysctl_mca_scan(SYSCTL_HANDLER_ARGS)
780 {
781         int error, i;
782
783         i = 0;
784         error = sysctl_handle_int(oidp, &i, 0, req);
785         if (error)
786                 return (error);
787         if (i)
788                 taskqueue_enqueue(mca_tq, &mca_scan_task);
789         return (0);
790 }
791
792 static void
793 mca_createtq(void *dummy)
794 {
795         if (mca_banks <= 0)
796                 return;
797
798         mca_tq = taskqueue_create_fast("mca", M_WAITOK,
799             taskqueue_thread_enqueue, &mca_tq);
800         taskqueue_start_threads(&mca_tq, 1, PI_SWI(SWI_TQ), "mca taskq");
801
802         /* CMCIs during boot may have claimed items from the freelist. */
803         mca_fill_freelist();
804 }
805 SYSINIT(mca_createtq, SI_SUB_CONFIGURE, SI_ORDER_ANY, mca_createtq, NULL);
806
807 static void
808 mca_startup(void *dummy)
809 {
810
811         if (mca_banks <= 0)
812                 return;
813
814         callout_reset(&mca_timer, mca_ticks * hz, mca_periodic_scan, NULL);
815 }
816 #ifdef EARLY_AP_STARTUP
817 SYSINIT(mca_startup, SI_SUB_KICK_SCHEDULER, SI_ORDER_ANY, mca_startup, NULL);
818 #else
819 SYSINIT(mca_startup, SI_SUB_SMP, SI_ORDER_ANY, mca_startup, NULL);
820 #endif
821
822 #ifdef DEV_APIC
823 static void
824 cmci_setup(void)
825 {
826         int i;
827
828         cmc_state = malloc((mp_maxid + 1) * sizeof(struct cmc_state *), M_MCA,
829             M_WAITOK);
830         for (i = 0; i <= mp_maxid; i++)
831                 cmc_state[i] = malloc(sizeof(struct cmc_state) * mca_banks,
832                     M_MCA, M_WAITOK | M_ZERO);
833         SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO,
834             "cmc_throttle", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
835             &cmc_throttle, 0, sysctl_positive_int, "I",
836             "Interval in seconds to throttle corrected MC interrupts");
837 }
838
839 static void
840 amd_thresholding_setup(void)
841 {
842         int i;
843
844         amd_et_state = malloc((mp_maxid + 1) * sizeof(struct amd_et_state *),
845             M_MCA, M_WAITOK);
846         for (i = 0; i <= mp_maxid; i++)
847                 amd_et_state[i] = malloc(sizeof(struct amd_et_state) *
848                     mca_banks, M_MCA, M_WAITOK | M_ZERO);
849         SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO,
850             "cmc_throttle", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
851             &cmc_throttle, 0, sysctl_positive_int, "I",
852             "Interval in seconds to throttle corrected MC interrupts");
853 }
854 #endif
855
856 static void
857 mca_setup(uint64_t mcg_cap)
858 {
859
860         /*
861          * On AMD Family 10h processors, unless logging of level one TLB
862          * parity (L1TP) errors is disabled, enable the recommended workaround
863          * for Erratum 383.
864          */
865         if (cpu_vendor_id == CPU_VENDOR_AMD &&
866             CPUID_TO_FAMILY(cpu_id) == 0x10 && amd10h_L1TP)
867                 workaround_erratum383 = 1;
868
869         mca_banks = mcg_cap & MCG_CAP_COUNT;
870         mtx_init(&mca_lock, "mca", NULL, MTX_SPIN);
871         STAILQ_INIT(&mca_records);
872         TASK_INIT(&mca_scan_task, 0, mca_scan_cpus, NULL);
873         callout_init(&mca_timer, 1);
874         STAILQ_INIT(&mca_freelist);
875         TASK_INIT(&mca_refill_task, 0, mca_refill, NULL);
876         mca_fill_freelist();
877         SYSCTL_ADD_INT(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO,
878             "count", CTLFLAG_RD, (int *)(uintptr_t)&mca_count, 0,
879             "Record count");
880         SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO,
881             "interval", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, &mca_ticks,
882             0, sysctl_positive_int, "I",
883             "Periodic interval in seconds to scan for machine checks");
884         SYSCTL_ADD_NODE(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO,
885             "records", CTLFLAG_RD, sysctl_mca_records, "Machine check records");
886         SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_mca), OID_AUTO,
887             "force_scan", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, 0,
888             sysctl_mca_scan, "I", "Force an immediate scan for machine checks");
889 #ifdef DEV_APIC
890         if (cmci_supported(mcg_cap))
891                 cmci_setup();
892         else if (amd_thresholding_supported())
893                 amd_thresholding_setup();
894 #endif
895 }
896
897 #ifdef DEV_APIC
898 /*
899  * See if we should monitor CMCI for this bank.  If CMCI_EN is already
900  * set in MC_CTL2, then another CPU is responsible for this bank, so
901  * ignore it.  If CMCI_EN returns zero after being set, then this bank
902  * does not support CMCI_EN.  If this CPU sets CMCI_EN, then it should
903  * now monitor this bank.
904  */
905 static void
906 cmci_monitor(int i)
907 {
908         struct cmc_state *cc;
909         uint64_t ctl;
910
911         KASSERT(i < mca_banks, ("CPU %d has more MC banks", PCPU_GET(cpuid)));
912
913         ctl = rdmsr(MSR_MC_CTL2(i));
914         if (ctl & MC_CTL2_CMCI_EN)
915                 /* Already monitored by another CPU. */
916                 return;
917
918         /* Set the threshold to one event for now. */
919         ctl &= ~MC_CTL2_THRESHOLD;
920         ctl |= MC_CTL2_CMCI_EN | 1;
921         wrmsr(MSR_MC_CTL2(i), ctl);
922         ctl = rdmsr(MSR_MC_CTL2(i));
923         if (!(ctl & MC_CTL2_CMCI_EN))
924                 /* This bank does not support CMCI. */
925                 return;
926
927         cc = &cmc_state[PCPU_GET(cpuid)][i];
928
929         /* Determine maximum threshold. */
930         ctl &= ~MC_CTL2_THRESHOLD;
931         ctl |= 0x7fff;
932         wrmsr(MSR_MC_CTL2(i), ctl);
933         ctl = rdmsr(MSR_MC_CTL2(i));
934         cc->max_threshold = ctl & MC_CTL2_THRESHOLD;
935
936         /* Start off with a threshold of 1. */
937         ctl &= ~MC_CTL2_THRESHOLD;
938         ctl |= 1;
939         wrmsr(MSR_MC_CTL2(i), ctl);
940
941         /* Mark this bank as monitored. */
942         PCPU_SET(cmci_mask, PCPU_GET(cmci_mask) | 1 << i);
943 }
944
945 /*
946  * For resume, reset the threshold for any banks we monitor back to
947  * one and throw away the timestamp of the last interrupt.
948  */
949 static void
950 cmci_resume(int i)
951 {
952         struct cmc_state *cc;
953         uint64_t ctl;
954
955         KASSERT(i < mca_banks, ("CPU %d has more MC banks", PCPU_GET(cpuid)));
956
957         /* Ignore banks not monitored by this CPU. */
958         if (!(PCPU_GET(cmci_mask) & 1 << i))
959                 return;
960
961         cc = &cmc_state[PCPU_GET(cpuid)][i];
962         cc->last_intr = 0;
963         ctl = rdmsr(MSR_MC_CTL2(i));
964         ctl &= ~MC_CTL2_THRESHOLD;
965         ctl |= MC_CTL2_CMCI_EN | 1;
966         wrmsr(MSR_MC_CTL2(i), ctl);
967 }
968
969 /*
970  * Apply an AMD ET configuration to the corresponding MSR.
971  */
972 static void
973 amd_thresholding_start(struct amd_et_state *cc, int bank)
974 {
975         uint64_t misc;
976
977         KASSERT(amd_elvt >= 0, ("ELVT offset is not set"));
978
979         misc = rdmsr(MSR_MC_MISC(bank));
980
981         misc &= ~MC_MISC_AMD_INT_MASK;
982         misc |= MC_MISC_AMD_INT_LVT;
983
984         misc &= ~MC_MISC_AMD_LVT_MASK;
985         misc |= (uint64_t)amd_elvt << MC_MISC_AMD_LVT_SHIFT;
986
987         misc &= ~MC_MISC_AMD_CNT_MASK;
988         misc |= (uint64_t)(MC_MISC_AMD_CNT_MAX - cc->cur_threshold)
989             << MC_MISC_AMD_CNT_SHIFT;
990
991         misc &= ~MC_MISC_AMD_OVERFLOW;
992         misc |= MC_MISC_AMD_CNTEN;
993
994         wrmsr(MSR_MC_MISC(bank), misc);
995 }
996
997 static void
998 amd_thresholding_monitor(int i)
999 {
1000         struct amd_et_state *cc;
1001         uint64_t misc;
1002
1003         /*
1004          * Kludge: On 10h, banks after 4 are not thresholding but also may have
1005          * bogus Valid bits.  Skip them.  This is definitely fixed in 15h, but
1006          * I have not investigated whether it is fixed in earlier models.
1007          */
1008         if (CPUID_TO_FAMILY(cpu_id) < 0x15 && i >= 5)
1009                 return;
1010
1011         /* The counter must be valid and present. */
1012         misc = rdmsr(MSR_MC_MISC(i));
1013         if ((misc & (MC_MISC_AMD_VAL | MC_MISC_AMD_CNTP)) !=
1014             (MC_MISC_AMD_VAL | MC_MISC_AMD_CNTP))
1015                 return;
1016
1017         /* The register should not be locked. */
1018         if ((misc & MC_MISC_AMD_LOCK) != 0) {
1019                 if (bootverbose)
1020                         printf("%s: 0x%jx: Bank %d: locked\n", __func__,
1021                             (uintmax_t)misc, i);
1022                 return;
1023         }
1024
1025         /*
1026          * If counter is enabled then either the firmware or another CPU
1027          * has already claimed it.
1028          */
1029         if ((misc & MC_MISC_AMD_CNTEN) != 0) {
1030                 if (bootverbose)
1031                         printf("%s: 0x%jx: Bank %d: already enabled\n",
1032                             __func__, (uintmax_t)misc, i);
1033                 return;
1034         }
1035
1036         /*
1037          * Configure an Extended Interrupt LVT register for reporting
1038          * counter overflows if that feature is supported and the first
1039          * extended register is available.
1040          */
1041         amd_elvt = lapic_enable_mca_elvt();
1042         if (amd_elvt < 0) {
1043                 printf("%s: Bank %d: lapic enable mca elvt failed: %d\n",
1044                     __func__, i, amd_elvt);
1045                 return;
1046         }
1047
1048         /* Re-use Intel CMC support infrastructure. */
1049         if (bootverbose)
1050                 printf("%s: Starting AMD thresholding on bank %d\n", __func__,
1051                     i);
1052
1053         cc = &amd_et_state[PCPU_GET(cpuid)][i];
1054         cc->cur_threshold = 1;
1055         amd_thresholding_start(cc, i);
1056
1057         /* Mark this bank as monitored. */
1058         PCPU_SET(cmci_mask, PCPU_GET(cmci_mask) | 1 << i);
1059 }
1060
1061 static void
1062 amd_thresholding_resume(int i)
1063 {
1064         struct amd_et_state *cc;
1065
1066         KASSERT(i < mca_banks, ("CPU %d has more MC banks", PCPU_GET(cpuid)));
1067
1068         /* Ignore banks not monitored by this CPU. */
1069         if (!(PCPU_GET(cmci_mask) & 1 << i))
1070                 return;
1071
1072         cc = &amd_et_state[PCPU_GET(cpuid)][i];
1073         cc->last_intr = 0;
1074         cc->cur_threshold = 1;
1075         amd_thresholding_start(cc, i);
1076 }
1077 #endif
1078
1079 /*
1080  * Initializes per-CPU machine check registers and enables corrected
1081  * machine check interrupts.
1082  */
1083 static void
1084 _mca_init(int boot)
1085 {
1086         uint64_t mcg_cap;
1087         uint64_t ctl, mask;
1088         int i, skip, family;
1089
1090         family = CPUID_TO_FAMILY(cpu_id);
1091
1092         /* MCE is required. */
1093         if (!mca_enabled || !(cpu_feature & CPUID_MCE))
1094                 return;
1095
1096         if (cpu_feature & CPUID_MCA) {
1097                 if (boot)
1098                         PCPU_SET(cmci_mask, 0);
1099
1100                 mcg_cap = rdmsr(MSR_MCG_CAP);
1101                 if (mcg_cap & MCG_CAP_CTL_P)
1102                         /* Enable MCA features. */
1103                         wrmsr(MSR_MCG_CTL, MCG_CTL_ENABLE);
1104                 if (PCPU_GET(cpuid) == 0 && boot)
1105                         mca_setup(mcg_cap);
1106
1107                 /*
1108                  * Disable logging of level one TLB parity (L1TP) errors by
1109                  * the data cache as an alternative workaround for AMD Family
1110                  * 10h Erratum 383.  Unlike the recommended workaround, there
1111                  * is no performance penalty to this workaround.  However,
1112                  * L1TP errors will go unreported.
1113                  */
1114                 if (cpu_vendor_id == CPU_VENDOR_AMD && family == 0x10 &&
1115                     !amd10h_L1TP) {
1116                         mask = rdmsr(MSR_MC0_CTL_MASK);
1117                         if ((mask & (1UL << 5)) == 0)
1118                                 wrmsr(MSR_MC0_CTL_MASK, mask | (1UL << 5));
1119                 }
1120                 for (i = 0; i < (mcg_cap & MCG_CAP_COUNT); i++) {
1121                         /* By default enable logging of all errors. */
1122                         ctl = 0xffffffffffffffffUL;
1123                         skip = 0;
1124
1125                         if (cpu_vendor_id == CPU_VENDOR_INTEL) {
1126                                 /*
1127                                  * For P6 models before Nehalem MC0_CTL is
1128                                  * always enabled and reserved.
1129                                  */
1130                                 if (i == 0 && family == 0x6
1131                                     && CPUID_TO_MODEL(cpu_id) < 0x1a)
1132                                         skip = 1;
1133                         } else if (cpu_vendor_id == CPU_VENDOR_AMD) {
1134                                 /* BKDG for Family 10h: unset GartTblWkEn. */
1135                                 if (i == MC_AMDNB_BANK && family >= 0xf)
1136                                         ctl &= ~(1UL << 10);
1137                         }
1138
1139                         if (!skip)
1140                                 wrmsr(MSR_MC_CTL(i), ctl);
1141
1142 #ifdef DEV_APIC
1143                         if (cmci_supported(mcg_cap)) {
1144                                 if (boot)
1145                                         cmci_monitor(i);
1146                                 else
1147                                         cmci_resume(i);
1148                         } else if (amd_thresholding_supported()) {
1149                                 if (boot)
1150                                         amd_thresholding_monitor(i);
1151                                 else
1152                                         amd_thresholding_resume(i);
1153                         }
1154 #endif
1155
1156                         /* Clear all errors. */
1157                         wrmsr(MSR_MC_STATUS(i), 0);
1158                 }
1159
1160 #ifdef DEV_APIC
1161                 if (!amd_thresholding_supported() &&
1162                     PCPU_GET(cmci_mask) != 0 && boot)
1163                         lapic_enable_cmc();
1164 #endif
1165         }
1166
1167         load_cr4(rcr4() | CR4_MCE);
1168 }
1169
1170 /* Must be executed on each CPU during boot. */
1171 void
1172 mca_init(void)
1173 {
1174
1175         _mca_init(1);
1176 }
1177
1178 /* Must be executed on each CPU during resume. */
1179 void
1180 mca_resume(void)
1181 {
1182
1183         _mca_init(0);
1184 }
1185
1186 /*
1187  * The machine check registers for the BSP cannot be initialized until
1188  * the local APIC is initialized.  This happens at SI_SUB_CPU,
1189  * SI_ORDER_SECOND.
1190  */
1191 static void
1192 mca_init_bsp(void *arg __unused)
1193 {
1194
1195         mca_init();
1196 }
1197 SYSINIT(mca_init_bsp, SI_SUB_CPU, SI_ORDER_ANY, mca_init_bsp, NULL);
1198
1199 /* Called when a machine check exception fires. */
1200 void
1201 mca_intr(void)
1202 {
1203         uint64_t mcg_status;
1204         int recoverable, count;
1205
1206         if (!(cpu_feature & CPUID_MCA)) {
1207                 /*
1208                  * Just print the values of the old Pentium registers
1209                  * and panic.
1210                  */
1211                 printf("MC Type: 0x%jx  Address: 0x%jx\n",
1212                     (uintmax_t)rdmsr(MSR_P5_MC_TYPE),
1213                     (uintmax_t)rdmsr(MSR_P5_MC_ADDR));
1214                 panic("Machine check");
1215         }
1216
1217         /* Scan the banks and check for any non-recoverable errors. */
1218         count = mca_scan(MCE, &recoverable);
1219         mcg_status = rdmsr(MSR_MCG_STATUS);
1220         if (!(mcg_status & MCG_STATUS_RIPV))
1221                 recoverable = 0;
1222
1223         if (!recoverable) {
1224                 /*
1225                  * Only panic if the error was detected local to this CPU.
1226                  * Some errors will assert a machine check on all CPUs, but
1227                  * only certain CPUs will find a valid bank to log.
1228                  */
1229                 while (count == 0)
1230                         cpu_spinwait();
1231
1232                 panic("Unrecoverable machine check exception");
1233         }
1234
1235         /* Clear MCIP. */
1236         wrmsr(MSR_MCG_STATUS, mcg_status & ~MCG_STATUS_MCIP);
1237 }
1238
1239 #ifdef DEV_APIC
1240 /* Called for a CMCI (correctable machine check interrupt). */
1241 void
1242 cmc_intr(void)
1243 {
1244         struct mca_internal *mca;
1245         int count;
1246
1247         /*
1248          * Serialize MCA bank scanning to prevent collisions from
1249          * sibling threads.
1250          */
1251         count = mca_scan(CMCI, NULL);
1252
1253         /* If we found anything, log them to the console. */
1254         if (count != 0) {
1255                 mtx_lock_spin(&mca_lock);
1256                 STAILQ_FOREACH(mca, &mca_records, link) {
1257                         if (!mca->logged) {
1258                                 mca->logged = 1;
1259                                 mca_log(&mca->rec);
1260                         }
1261                 }
1262                 mtx_unlock_spin(&mca_lock);
1263         }
1264 }
1265 #endif