Loading arch/x86/kernel/cpu/mcheck/mce-apei.c +10 −4 Original line number Diff line number Diff line Loading @@ -33,22 +33,28 @@ #include <linux/acpi.h> #include <linux/cper.h> #include <acpi/apei.h> #include <acpi/ghes.h> #include <asm/mce.h> #include "mce-internal.h" void apei_mce_report_mem_error(int corrected, struct cper_sec_mem_err *mem_err) void apei_mce_report_mem_error(int severity, struct cper_sec_mem_err *mem_err) { struct mce m; /* Only corrected MC is reported */ if (!corrected || !(mem_err->validation_bits & CPER_MEM_VALID_PA)) if (!(mem_err->validation_bits & CPER_MEM_VALID_PA)) return; mce_setup(&m); m.bank = 1; /* Fake a memory read corrected error with unknown channel */ /* Fake a memory read error with unknown channel */ m.status = MCI_STATUS_VAL | MCI_STATUS_EN | MCI_STATUS_ADDRV | 0x9f; if (severity >= GHES_SEV_RECOVERABLE) m.status |= MCI_STATUS_UC; if (severity >= GHES_SEV_PANIC) m.status |= MCI_STATUS_PCC; m.addr = mem_err->physical_addr; mce_log(&m); mce_notify_irq(); Loading arch/x86/kernel/cpu/mcheck/mce.c +4 −4 Original line number Diff line number Diff line Loading @@ -1638,15 +1638,15 @@ static void __mcheck_cpu_init_vendor(struct cpuinfo_x86 *c) static void mce_start_timer(unsigned int cpu, struct timer_list *t) { unsigned long iv = mce_adjust_timer(check_interval * HZ); __this_cpu_write(mce_next_interval, iv); unsigned long iv = check_interval * HZ; if (mca_cfg.ignore_ce || !iv) return; per_cpu(mce_next_interval, cpu) = iv; t->expires = round_jiffies(jiffies + iv); add_timer_on(t, smp_processor_id()); add_timer_on(t, cpu); } static void __mcheck_cpu_init_timer(void) Loading drivers/acpi/apei/apei-base.c +2 −2 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ #include <linux/rculist.h> #include <linux/interrupt.h> #include <linux/debugfs.h> #include <asm/unaligned.h> #include "apei-internal.h" Loading Loading @@ -567,8 +568,7 @@ static int apei_check_gar(struct acpi_generic_address *reg, u64 *paddr, bit_offset = reg->bit_offset; access_size_code = reg->access_width; space_id = reg->space_id; /* Handle possible alignment issues */ memcpy(paddr, ®->address, sizeof(*paddr)); *paddr = get_unaligned(®->address); if (!*paddr) { pr_warning(FW_BUG APEI_PFX "Invalid physical address in GAR [0x%llx/%u/%u/%u/%u]\n", Loading drivers/acpi/apei/einj.c +9 −10 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include <linux/delay.h> #include <linux/mm.h> #include <acpi/acpi.h> #include <asm/unaligned.h> #include "apei-internal.h" Loading Loading @@ -216,7 +217,7 @@ static void check_vendor_extension(u64 paddr, static void *einj_get_parameter_address(void) { int i; u64 paddrv4 = 0, paddrv5 = 0; u64 pa_v4 = 0, pa_v5 = 0; struct acpi_whea_header *entry; entry = EINJ_TAB_ENTRY(einj_tab); Loading @@ -225,30 +226,28 @@ static void *einj_get_parameter_address(void) entry->instruction == ACPI_EINJ_WRITE_REGISTER && entry->register_region.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) memcpy(&paddrv4, &entry->register_region.address, sizeof(paddrv4)); pa_v4 = get_unaligned(&entry->register_region.address); if (entry->action == ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS && entry->instruction == ACPI_EINJ_WRITE_REGISTER && entry->register_region.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) memcpy(&paddrv5, &entry->register_region.address, sizeof(paddrv5)); pa_v5 = get_unaligned(&entry->register_region.address); entry++; } if (paddrv5) { if (pa_v5) { struct set_error_type_with_address *v5param; v5param = acpi_os_map_memory(paddrv5, sizeof(*v5param)); v5param = acpi_os_map_memory(pa_v5, sizeof(*v5param)); if (v5param) { acpi5 = 1; check_vendor_extension(paddrv5, v5param); check_vendor_extension(pa_v5, v5param); return v5param; } } if (param_extension && paddrv4) { if (param_extension && pa_v4) { struct einj_parameter *v4param; v4param = acpi_os_map_memory(paddrv4, sizeof(*v4param)); v4param = acpi_os_map_memory(pa_v4, sizeof(*v4param)); if (!v4param) return NULL; if (v4param->reserved1 || v4param->reserved2) { Loading drivers/acpi/apei/erst.c +1 −1 Original line number Diff line number Diff line Loading @@ -611,7 +611,7 @@ static void __erst_record_id_cache_compact(void) if (entries[i] == APEI_ERST_INVALID_RECORD_ID) continue; if (wpos != i) memcpy(&entries[wpos], &entries[i], sizeof(entries[i])); entries[wpos] = entries[i]; wpos++; } erst_record_id_cache.len = wpos; Loading Loading
arch/x86/kernel/cpu/mcheck/mce-apei.c +10 −4 Original line number Diff line number Diff line Loading @@ -33,22 +33,28 @@ #include <linux/acpi.h> #include <linux/cper.h> #include <acpi/apei.h> #include <acpi/ghes.h> #include <asm/mce.h> #include "mce-internal.h" void apei_mce_report_mem_error(int corrected, struct cper_sec_mem_err *mem_err) void apei_mce_report_mem_error(int severity, struct cper_sec_mem_err *mem_err) { struct mce m; /* Only corrected MC is reported */ if (!corrected || !(mem_err->validation_bits & CPER_MEM_VALID_PA)) if (!(mem_err->validation_bits & CPER_MEM_VALID_PA)) return; mce_setup(&m); m.bank = 1; /* Fake a memory read corrected error with unknown channel */ /* Fake a memory read error with unknown channel */ m.status = MCI_STATUS_VAL | MCI_STATUS_EN | MCI_STATUS_ADDRV | 0x9f; if (severity >= GHES_SEV_RECOVERABLE) m.status |= MCI_STATUS_UC; if (severity >= GHES_SEV_PANIC) m.status |= MCI_STATUS_PCC; m.addr = mem_err->physical_addr; mce_log(&m); mce_notify_irq(); Loading
arch/x86/kernel/cpu/mcheck/mce.c +4 −4 Original line number Diff line number Diff line Loading @@ -1638,15 +1638,15 @@ static void __mcheck_cpu_init_vendor(struct cpuinfo_x86 *c) static void mce_start_timer(unsigned int cpu, struct timer_list *t) { unsigned long iv = mce_adjust_timer(check_interval * HZ); __this_cpu_write(mce_next_interval, iv); unsigned long iv = check_interval * HZ; if (mca_cfg.ignore_ce || !iv) return; per_cpu(mce_next_interval, cpu) = iv; t->expires = round_jiffies(jiffies + iv); add_timer_on(t, smp_processor_id()); add_timer_on(t, cpu); } static void __mcheck_cpu_init_timer(void) Loading
drivers/acpi/apei/apei-base.c +2 −2 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ #include <linux/rculist.h> #include <linux/interrupt.h> #include <linux/debugfs.h> #include <asm/unaligned.h> #include "apei-internal.h" Loading Loading @@ -567,8 +568,7 @@ static int apei_check_gar(struct acpi_generic_address *reg, u64 *paddr, bit_offset = reg->bit_offset; access_size_code = reg->access_width; space_id = reg->space_id; /* Handle possible alignment issues */ memcpy(paddr, ®->address, sizeof(*paddr)); *paddr = get_unaligned(®->address); if (!*paddr) { pr_warning(FW_BUG APEI_PFX "Invalid physical address in GAR [0x%llx/%u/%u/%u/%u]\n", Loading
drivers/acpi/apei/einj.c +9 −10 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include <linux/delay.h> #include <linux/mm.h> #include <acpi/acpi.h> #include <asm/unaligned.h> #include "apei-internal.h" Loading Loading @@ -216,7 +217,7 @@ static void check_vendor_extension(u64 paddr, static void *einj_get_parameter_address(void) { int i; u64 paddrv4 = 0, paddrv5 = 0; u64 pa_v4 = 0, pa_v5 = 0; struct acpi_whea_header *entry; entry = EINJ_TAB_ENTRY(einj_tab); Loading @@ -225,30 +226,28 @@ static void *einj_get_parameter_address(void) entry->instruction == ACPI_EINJ_WRITE_REGISTER && entry->register_region.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) memcpy(&paddrv4, &entry->register_region.address, sizeof(paddrv4)); pa_v4 = get_unaligned(&entry->register_region.address); if (entry->action == ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS && entry->instruction == ACPI_EINJ_WRITE_REGISTER && entry->register_region.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) memcpy(&paddrv5, &entry->register_region.address, sizeof(paddrv5)); pa_v5 = get_unaligned(&entry->register_region.address); entry++; } if (paddrv5) { if (pa_v5) { struct set_error_type_with_address *v5param; v5param = acpi_os_map_memory(paddrv5, sizeof(*v5param)); v5param = acpi_os_map_memory(pa_v5, sizeof(*v5param)); if (v5param) { acpi5 = 1; check_vendor_extension(paddrv5, v5param); check_vendor_extension(pa_v5, v5param); return v5param; } } if (param_extension && paddrv4) { if (param_extension && pa_v4) { struct einj_parameter *v4param; v4param = acpi_os_map_memory(paddrv4, sizeof(*v4param)); v4param = acpi_os_map_memory(pa_v4, sizeof(*v4param)); if (!v4param) return NULL; if (v4param->reserved1 || v4param->reserved2) { Loading
drivers/acpi/apei/erst.c +1 −1 Original line number Diff line number Diff line Loading @@ -611,7 +611,7 @@ static void __erst_record_id_cache_compact(void) if (entries[i] == APEI_ERST_INVALID_RECORD_ID) continue; if (wpos != i) memcpy(&entries[wpos], &entries[i], sizeof(entries[i])); entries[wpos] = entries[i]; wpos++; } erst_record_id_cache.len = wpos; Loading