static bool x86_errata_setmsr(struct cpu_info *ci, errata_t *e) { uint64_t val; (void)ci; val = rdmsr_locked(e->e_data1, OPTERON_MSR_PASSCODE); if ((val & e->e_data2) != 0) return FALSE; wrmsr_locked(e->e_data1, OPTERON_MSR_PASSCODE, val | e->e_data2); aprint_debug_dev(ci->ci_dev, "erratum %d patched\n", e->e_num); return FALSE; }
static int amd64_errata_setmsr(struct cpu_info *ci, errata_t *e) { uint64_t val; (void)ci; val = rdmsr_locked(e->e_data1, OPTERON_MSR_PASSCODE); if ((val & e->e_data2) != 0) return 0; /* not found */ wrmsr_locked(e->e_data1, OPTERON_MSR_PASSCODE, val | e->e_data2); #ifdef ERRATA_DEBUG printf("ERRATA: writing a fix\n"); val = rdmsr_locked(e->e_data1, OPTERON_MSR_PASSCODE); if ((val & e->e_data2) != 0) printf("ERRATA: fix seems to have worked!\n"); #endif e->e_reported = 1; return 2; /* found and fixed */ }