ports/sysutils/mcelog/files/patch-p4.c
Richard Gallamore 14c342ec21 * Updated to 162
- Fix memory controller bank channel mappings for Skylake
 - Add decoding for Optane DC persistent memory mode
2019-02-13 23:35:49 +00:00

81 lines
2.9 KiB
C

--- p4.c.orig 2019-02-05 19:57:07 UTC
+++ p4.c
@@ -177,8 +177,10 @@ static int decode_mca(u64 status, u64 misc, u64 track,
levelnum = mca & 3;
level = get_LL_str(levelnum);
Wprintf("%s Generic cache hierarchy error\n", level);
+#ifdef __Linux__
if (track == 2)
run_yellow_trigger(cpu, -1, levelnum, "unknown", level, socket);
+#endif
} else if (test_prefix(4, mca)) {
unsigned levelnum, typenum;
char *level, *type;
@@ -187,8 +189,10 @@ static int decode_mca(u64 status, u64 misc, u64 track,
levelnum = (mca & TLB_LL_MASK) >> TLB_LL_SHIFT;
level = get_LL_str(levelnum);
Wprintf("%s TLB %s Error\n", type, level);
+#ifdef __Linux__
if (track == 2)
run_yellow_trigger(cpu, typenum, levelnum, type, level, socket);
+#endif
} else if (test_prefix(8, mca)) {
unsigned typenum = (mca & CACHE_TT_MASK) >> CACHE_TT_SHIFT;
unsigned levelnum = (mca & CACHE_LL_MASK) >> CACHE_LL_SHIFT;
@@ -197,8 +201,10 @@ static int decode_mca(u64 status, u64 misc, u64 track,
Wprintf("%s CACHE %s %s Error\n", type, level,
get_RRRR_str((mca & CACHE_RRRR_MASK) >>
CACHE_RRRR_SHIFT));
+#ifdef __Linux__
if (track == 2)
run_yellow_trigger(cpu, typenum, levelnum, type, level,socket);
+#endif
} else if (test_prefix(9, mca) && EXTRACT(mca, 7, 8) == 1) {
Wprintf("Memory as cache: ");
decode_memory_controller(mca, bank);
@@ -220,7 +226,9 @@ static int decode_mca(u64 status, u64 misc, u64 track,
Wprintf("BUS error: %d %d %s %s %s %s %s\n", socket, cpu,
level, pp, rrrr, ii, timeout);
+#ifdef __Linux__
run_bus_trigger(socket, cpu, level, pp, rrrr, ii, timeout);
+#endif
/* IO MCA - reported as bus/interconnect with specific PP,T,RRRR,II,LL values
* and MISCV set. MISC register points to root port that reported the error
* need to cross check with AER logs for more details.
@@ -236,7 +244,9 @@ static int decode_mca(u64 status, u64 misc, u64 track,
fn = EXTRACT(misc, 16, 18);
Wprintf("IO MCA reported by root port %x:%02x:%02x.%x\n",
seg, bus, dev, fn);
+#ifdef __Linux__
run_iomca_trigger(socket, cpu, seg, bus, dev, fn);
+#endif
}
} else if (test_prefix(7, mca)) {
decode_memory_controller(mca, bank);
@@ -386,19 +396,25 @@ static void decode_thermal(struct mce *log, int cpu)
void decode_intel_mc(struct mce *log, int cputype, int *ismemerr, unsigned size)
{
+#ifdef __Linux__
int socket = size > offsetof(struct mce, socketid) ? (int)log->socketid : -1;
+#endif
int cpu = log->extcpu ? log->extcpu : log->cpu;
if (log->bank == MCE_THERMAL_BANK) {
decode_thermal(log, cpu);
+#ifdef __Linux__
run_unknown_trigger(socket, cpu, log);
+#endif
return;
}
decode_mcg(log->mcgstatus);
+#ifdef __Linux__
if (decode_mci(log->status, log->misc, cpu, log->mcgcap, ismemerr,
socket, log->bank))
run_unknown_trigger(socket, cpu, log);
+#endif
if (test_prefix(11, (log->status & 0xffffL))) {
switch (cputype) {