aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2017-09-18 11:55:24 -0400
committerHelge Deller <deller@gmx.de>2017-09-22 13:47:00 -0400
commitea6976483fb0ced259fbaa9e4f68a2cdcee7e312 (patch)
treeb7deab0fd220387934c66403fcf614d893ac9d51
parent8d771b143fe2e3941fc8a32926d21410004578c0 (diff)
parisc: Check if initrd was loaded into broken RAM
While scanning the PDT for reported broken memory modules, warn if the initrd was coincidentally loaded into bad memory. Signed-off-by: Helge Deller <deller@gmx.de>
-rw-r--r--arch/parisc/kernel/pdt.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/parisc/kernel/pdt.c b/arch/parisc/kernel/pdt.c
index 05730a83895c..00aed082969b 100644
--- a/arch/parisc/kernel/pdt.c
+++ b/arch/parisc/kernel/pdt.c
@@ -15,6 +15,7 @@
15#include <linux/memblock.h> 15#include <linux/memblock.h>
16#include <linux/seq_file.h> 16#include <linux/seq_file.h>
17#include <linux/kthread.h> 17#include <linux/kthread.h>
18#include <linux/initrd.h>
18 19
19#include <asm/pdc.h> 20#include <asm/pdc.h>
20#include <asm/pdcpat.h> 21#include <asm/pdcpat.h>
@@ -216,8 +217,16 @@ void __init pdc_pdt_init(void)
216 } 217 }
217 218
218 for (i = 0; i < pdt_status.pdt_entries; i++) { 219 for (i = 0; i < pdt_status.pdt_entries; i++) {
220 unsigned long addr;
221
219 report_mem_err(pdt_entry[i]); 222 report_mem_err(pdt_entry[i]);
220 223
224 addr = pdt_entry[i] & PDT_ADDR_PHYS_MASK;
225 if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) &&
226 addr >= initrd_start && addr < initrd_end)
227 pr_crit("CRITICAL: initrd possibly broken "
228 "due to bad memory!\n");
229
221 /* mark memory page bad */ 230 /* mark memory page bad */
222 memblock_reserve(pdt_entry[i] & PAGE_MASK, PAGE_SIZE); 231 memblock_reserve(pdt_entry[i] & PAGE_MASK, PAGE_SIZE);
223 } 232 }