2009-03-25 03:25:26

by Tetsuo Handa

[permalink] [raw]
Subject: linux-next-20090324: undefined reference to `__this_fixmap_does_not_exist\'

Hello.

I encountered below error.

arch/x86/mm/built-in.o(.init.text+0x1831): In function `early_ioremap_init':
: undefined reference to `__this_fixmap_does_not_exist'
make: *** [.tmp_vmlinux1] Error 1

Config is at http://I-love.SAKURA.ne.jp/tmp/config-2.6.29-next-20090324

Regards.


2009-03-25 04:59:20

by Wang Chen

[permalink] [raw]
Subject: Re: linux-next-20090324: undefined reference to `__this_fixmap_does_not_exist\'

Tetsuo Handa said the following on 2009-3-25 11:24:
> Hello.
>
> I encountered below error.
>
> arch/x86/mm/built-in.o(.init.text+0x1831): In function `early_ioremap_init':
> : undefined reference to `__this_fixmap_does_not_exist'
> make: *** [.tmp_vmlinux1] Error 1
>
> Config is at http://I-love.SAKURA.ne.jp/tmp/config-2.6.29-next-20090324
>

Tetsuo, I've tried the latest tip, it's OK.
I can't trigger the same problem as you do.
So I will try linux-next later.

2009-03-25 08:52:54

by Wang Chen

[permalink] [raw]
Subject: Re: linux-next-20090324: undefined reference to `__this_fixmap_does_not_exist\'

Wang Chen said the following on 2009-3-25 12:58:
> Tetsuo Handa said the following on 2009-3-25 11:24:
>> Hello.
>>
>> I encountered below error.
>>
>> arch/x86/mm/built-in.o(.init.text+0x1831): In function `early_ioremap_init':
>> : undefined reference to `__this_fixmap_does_not_exist'
>> make: *** [.tmp_vmlinux1] Error 1
>>
>> Config is at http://I-love.SAKURA.ne.jp/tmp/config-2.6.29-next-20090324
>>
>
> Tetsuo, I've tried the latest tip, it's OK.
> I can't trigger the same problem as you do.
> So I will try linux-next later.
>

Tetsuo

I've "make" tested linux-next-20090324 with your config.
Still can't trigger the error.
It's strange :(

2009-03-25 09:57:24

by Wang Chen

[permalink] [raw]
Subject: Re: linux-next-20090324: undefined reference to `__this_fixmap_does_not_exist\'

Wang Chen said the following on 2009-3-25 16:52:
> Wang Chen said the following on 2009-3-25 12:58:
>> Tetsuo Handa said the following on 2009-3-25 11:24:
>>> Hello.
>>>
>>> I encountered below error.
>>>
>>> arch/x86/mm/built-in.o(.init.text+0x1831): In function `early_ioremap_init':
>>> : undefined reference to `__this_fixmap_does_not_exist'
>>> make: *** [.tmp_vmlinux1] Error 1
>>>
>>> Config is at http://I-love.SAKURA.ne.jp/tmp/config-2.6.29-next-20090324
>>>
>> Tetsuo, I've tried the latest tip, it's OK.
>> I can't trigger the same problem as you do.
>> So I will try linux-next later.
>>
>
> Tetsuo
>
> I've "make" tested linux-next-20090324 with your config.
> Still can't trigger the error.
> It's strange :(
>

Maybe we use different gcc versions.
Please try following patch.

From: Wang Chen <[email protected]>
Subject: [PATCH] use __fix_to_virt(), because we are sure it's safe

Commit:8827247ffcc9e880cbe4705655065cf011265157 used a variable(which would be
optimized to constant) as fix_to_virt()'s parameter.
It's depended on gcc's optimization and maybe failed on old gcc.

We can use __fix_to_vir() insteadly, because we know it's safe and don't need
link time error reporting.

Signed-off-by: Wang Chen <[email protected]>
Reported-by: Tetsuo Handa <[email protected]>
---
ioremap.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

--- arch/x86/mm/ioremap.c.orig 2009-03-25 17:36:01.000000000 +0800
+++ arch/x86/mm/ioremap.c 2009-03-25 17:36:54.000000000 +0800
@@ -523,7 +523,7 @@ void __init early_ioremap_init(void)
printk(KERN_INFO "early_ioremap_init()\n");

for (i = 0; i < FIX_BTMAPS_SLOTS; i++)
- slot_virt[i] = fix_to_virt(FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*i);
+ slot_virt[i] = __fix_to_virt(FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*i);

pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN));
if (sizeof(bm_pte)) {

2009-03-25 11:41:35

by Tetsuo Handa

[permalink] [raw]
Subject: Re: linux-next-20090324: undefined reference to `__this_fixmap_does_not_exist'

Hello.

Wang Chen wrote:
> Maybe we use different gcc versions.
Yes. I'm using gcc 3.3 .

# gcc --version
gcc (GCC) 3.3.5 (Debian 1:3.3.5-13)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# make -sj2
arch/x86/mm/built-in.o(.init.text+0x1831): In function `early_ioremap_init':
: undefined reference to `__this_fixmap_does_not_exist'
make: *** [.tmp_vmlinux1] Error 1

> Please try following patch.
After applying that patch, this problem was solved.

Thank you.

2009-03-25 13:10:22

by Wang Chen

[permalink] [raw]
Subject: [tip:x86/mm] x86: early_ioremap_init(), use __fix_to_virt(), because we are sure it's safe

Commit-ID: 9f4f25c86ff2233dd98d4bd6968afb1ca66558a0
Gitweb: http://git.kernel.org/tip/9f4f25c86ff2233dd98d4bd6968afb1ca66558a0
Author: Wang Chen <[email protected]>
AuthorDate: Wed, 25 Mar 2009 14:07:11 +0100
Committer: Ingo Molnar <[email protected]>
CommitDate: Wed, 25 Mar 2009 14:07:11 +0100

x86: early_ioremap_init(), use __fix_to_virt(), because we are sure it's safe

Tetsuo Handa reported this link bug:

| arch/x86/mm/built-in.o(.init.text+0x1831): In function `early_ioremap_init':
| : undefined reference to `__this_fixmap_does_not_exist'
| make: *** [.tmp_vmlinux1] Error 1

Commit:8827247ffcc9e880cbe4705655065cf011265157 used a variable (which
would be optimized to constant) as fix_to_virt()'s parameter.
It's depended on gcc's optimization and fails on old gcc. (Tetsuo used gcc 3.3)

We can use __fix_to_vir() instead, because we know it's safe and
don't need link time error reporting.

Reported-by: Tetsuo Handa <[email protected]>
Signed-off-by: Wang Chen <[email protected]>
Cc: [email protected]
LKML-Reference: <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>


---
arch/x86/mm/ioremap.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index 83ed74a..0dfa09d 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -516,7 +516,7 @@ void __init early_ioremap_init(void)
printk(KERN_INFO "early_ioremap_init()\n");

for (i = 0; i < FIX_BTMAPS_SLOTS; i++)
- slot_virt[i] = fix_to_virt(FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*i);
+ slot_virt[i] = __fix_to_virt(FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*i);

pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN));
memset(bm_pte, 0, sizeof(bm_pte));