summaryrefslogtreecommitdiff
path: root/arch/x86
diff options
context:
space:
mode:
authorYinghai Lu <yhlu.kernel.send@gmail.com>2008-03-22 01:56:19 (GMT)
committerIngo Molnar <mingo@elte.hu>2008-04-17 15:41:21 (GMT)
commitc64df70793a9c344874eb4af19f85e0662d2d3ee (patch)
treedf6ec69fed0d4f4e2192692558dc7dc20bfa9645 /arch/x86
parent9b967106da0357ef8b08847dce35584a04134f20 (diff)
downloadlinux-c64df70793a9c344874eb4af19f85e0662d2d3ee.tar.xz
x86: memtest bootparam
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/Kconfig29
-rw-r--r--arch/x86/kernel/e820_64.c10
-rw-r--r--arch/x86/mm/init_64.c24
3 files changed, 51 insertions, 12 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index e50e38e..a0d7406 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -382,6 +382,35 @@ config PARAVIRT
endif
+config MEMTEST_BOOTPARAM
+ bool "Memtest boot parameter"
+ depends on X86_64
+ default y
+ help
+ This option adds a kernel parameter 'memtest', which allows memtest
+ to be disabled at boot. If this option is selected, memtest
+ functionality can be disabled with memtest=0 on the kernel
+ command line. The purpose of this option is to allow a single
+ kernel image to be distributed with memtest built in, but not
+ necessarily enabled.
+
+ If you are unsure how to answer this question, answer Y.
+
+config MEMTEST_BOOTPARAM_VALUE
+ int "Memtest boot parameter default value (0-4)"
+ depends on MEMTEST_BOOTPARAM
+ range 0 4
+ default 0
+ help
+ This option sets the default value for the kernel parameter
+ 'memtest', which allows memtest to be disabled at boot. If this
+ option is set to 0 (zero), the memtest kernel parameter will
+ default to 0, disabling memtest at bootup. If this option is
+ set to 4, the memtest kernel parameter will default to 4,
+ enabling memtest at bootup, and use that as pattern number.
+
+ If you are unsure how to answer this question, answer 0.
+
config ACPI_SRAT
def_bool y
depends on X86_32 && ACPI && NUMA && (X86_SUMMIT || X86_GENERICARCH)
diff --git a/arch/x86/kernel/e820_64.c b/arch/x86/kernel/e820_64.c
index 9184e64..d6ada08 100644
--- a/arch/x86/kernel/e820_64.c
+++ b/arch/x86/kernel/e820_64.c
@@ -241,7 +241,9 @@ unsigned long __init find_e820_area(unsigned long start, unsigned long end,
/*
* Find next free range after *start
*/
-unsigned long __init find_e820_area_size(unsigned long start, unsigned long *sizep, unsigned long align)
+unsigned long __init find_e820_area_size(unsigned long start,
+ unsigned long *sizep,
+ unsigned long align)
{
int i;
@@ -254,17 +256,15 @@ unsigned long __init find_e820_area_size(unsigned long start, unsigned long *siz
continue;
addr = round_up(ei->addr, align);
ei_last = ei->addr + ei->size;
-// printk(KERN_DEBUG "find_e820_area_size : e820 %d [%llx, %lx]\n", i, ei->addr, ei_last);
if (addr < start)
addr = round_up(start, align);
-// printk(KERN_DEBUG "find_e820_area_size : 0 [%lx, %lx]\n", addr, ei_last);
if (addr >= ei_last)
continue;
*sizep = ei_last - addr;
- while (bad_addr_size(&addr, sizep, align) && addr+ *sizep <= ei_last)
+ while (bad_addr_size(&addr, sizep, align) &&
+ addr + *sizep <= ei_last)
;
last = addr + *sizep;
-// printk(KERN_DEBUG "find_e820_area_size : 1 [%lx, %lx]\n", addr, last);
if (last > ei_last)
continue;
return addr;
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 52f54ee..ae225c3 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -427,7 +427,10 @@ static void __init init_gbpages(void)
direct_gbpages = 0;
}
-static void __init memtest(unsigned long start_phys, unsigned long size, unsigned pattern)
+#ifdef CONFIG_MEMTEST_BOOTPARAM
+
+static void __init memtest(unsigned long start_phys, unsigned long size,
+ unsigned pattern)
{
unsigned long i;
unsigned long *start;
@@ -486,11 +489,12 @@ static void __init memtest(unsigned long start_phys, unsigned long size, unsigne
}
-static int __initdata memtest_pattern;
+static int memtest_pattern __initdata = CONFIG_MEMTEST_BOOTPARAM_VALUE;
+
static int __init parse_memtest(char *arg)
{
if (arg)
- memtest_pattern = simple_strtoul(arg, NULL, 0) + 1;
+ memtest_pattern = simple_strtoul(arg, NULL, 0);
return 0;
}
@@ -501,8 +505,10 @@ static void __init early_memtest(unsigned long start, unsigned long end)
unsigned long t_start, t_size;
unsigned pattern;
- if (memtest_pattern)
- printk(KERN_INFO "early_memtest: pattern num %d", memtest_pattern);
+ if (!memtest_pattern)
+ return;
+
+ printk(KERN_INFO "early_memtest: pattern num %d", memtest_pattern);
for (pattern = 0; pattern < memtest_pattern; pattern++) {
t_start = start;
t_size = 0;
@@ -523,9 +529,13 @@ static void __init early_memtest(unsigned long start, unsigned long end)
t_start += t_size;
}
}
- if (memtest_pattern)
- printk(KERN_CONT "\n");
+ printk(KERN_CONT "\n");
}
+#else
+static void __init early_memtest(unsigned long start, unsigned long end)
+{
+}
+#endif
/*
* Setup the direct mapping of the physical memory at PAGE_OFFSET.