Commit c9690998 authored by Andreas Herrmann's avatar Andreas Herrmann Committed by Ingo Molnar

x86: memtest: remove 64-bit division

Using gcc 3.3.5 a "make allmodconfig" + "CONFIG_KVM=n"
triggers a build error:

 arch/x86/mm/built-in.o(.init.text+0x43f7): In function `__change_page_attr':
 arch/x86/mm/pageattr.c:114: undefined reference to `__udivdi3'
 make: *** [.tmp_vmlinux1] Error 1

The culprit turned out to be a division in arch/x86/mm/memtest.c
For more info see this thread:

  http://marc.info/?l=linux-kernel&m=124416232620683

The patch entirely removes the division that caused the build
error.

[ Impact: build fix with certain GCC versions ]
Reported-by: default avatarTetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Signed-off-by: default avatarAndreas Herrmann <andreas.herrmann3@amd.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: xiyou.wangcong@gmail.com
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: <stable@kernel.org>
LKML-Reference: <20090608170939.GB12431@alberich.amd.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent c4ed3f04
...@@ -40,23 +40,23 @@ static void __init reserve_bad_mem(u64 pattern, u64 start_bad, u64 end_bad) ...@@ -40,23 +40,23 @@ static void __init reserve_bad_mem(u64 pattern, u64 start_bad, u64 end_bad)
static void __init memtest(u64 pattern, u64 start_phys, u64 size) static void __init memtest(u64 pattern, u64 start_phys, u64 size)
{ {
u64 i, count; u64 *p;
u64 *start; void *start, *end;
u64 start_bad, last_bad; u64 start_bad, last_bad;
u64 start_phys_aligned; u64 start_phys_aligned;
size_t incr; size_t incr;
incr = sizeof(pattern); incr = sizeof(pattern);
start_phys_aligned = ALIGN(start_phys, incr); start_phys_aligned = ALIGN(start_phys, incr);
count = (size - (start_phys_aligned - start_phys))/incr;
start = __va(start_phys_aligned); start = __va(start_phys_aligned);
end = start + size - (start_phys_aligned - start_phys);
start_bad = 0; start_bad = 0;
last_bad = 0; last_bad = 0;
for (i = 0; i < count; i++) for (p = start; p < end; p++)
start[i] = pattern; *p = pattern;
for (i = 0; i < count; i++, start++, start_phys_aligned += incr) { for (p = start; p < end; p++, start_phys_aligned += incr) {
if (*start == pattern) if (*p == pattern)
continue; continue;
if (start_phys_aligned == last_bad + incr) { if (start_phys_aligned == last_bad + incr) {
last_bad += incr; last_bad += incr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment