* [3.2-rc4 x86] (Compiler bug?) Uninitialized variable in ioapic_read_entry()
@ 2011-12-07 13:20 Tetsuo Handa
2011-12-07 14:29 ` Steven Rostedt
0 siblings, 1 reply; 2+ messages in thread
From: Tetsuo Handa @ 2011-12-07 13:20 UTC (permalink / raw)
To: linux-kernel
Regarding commit e57253a8 "x86, ioapic: Restore the mask bit correctly in
eoi_ioapic_irq()", I got below warning:
arch/x86/kernel/apic/io_apic.c: In function 'ioapic_read_entry':
arch/x86/kernel/apic/io_apic.c:385: warning: 'eu' is used uninitialized in this function
369: union entry_union {
370: struct { u32 w1, w2; };
371: struct IO_APIC_route_entry entry;
372: };
373:
374: static struct IO_APIC_route_entry __ioapic_read_entry(int apic, int pin)
375: {
376: union entry_union eu;
377:
378: eu.w1 = io_apic_read(apic, 0x10 + 2 * pin);
379: eu.w2 = io_apic_read(apic, 0x11 + 2 * pin);
380: return eu.entry;
381: }
382:
383: static struct IO_APIC_route_entry ioapic_read_entry(int apic, int pin)
384: {
385: union entry_union eu;
386: unsigned long flags;
387: raw_spin_lock_irqsave(&ioapic_lock, flags);
388: eu.entry = __ioapic_read_entry(apic, pin);
389: raw_spin_unlock_irqrestore(&ioapic_lock, flags);
390: return eu.entry;
391: }
I compared using several gcc versions.
It turned out that only gcc 4.4 shows this warning.
--- gcc (SUSE Linux) 4.6.2 in OpenSUSE 12.1 ---
CC arch/x86/kernel/apic/io_apic.o
--- gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4) on Fedora 14 ---
CC arch/x86/kernel/apic/io_apic.o
--- gcc (Debian 4.4.5-8) 4.4.5 on Debian Squeeze ---
CC arch/x86/kernel/apic/io_apic.o
arch/x86/kernel/apic/io_apic.c: In function ‘ioapic_read_entry’:
arch/x86/kernel/apic/io_apic.c:385: warning: ‘eu’ is used uninitialized in this function
--- gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 on Ubuntu 10.04 ---
CC arch/x86/kernel/apic/io_apic.o
arch/x86/kernel/apic/io_apic.c: In function ‘ioapic_read_entry’:
arch/x86/kernel/apic/io_apic.c:385: warning: ‘eu’ is used uninitialized in this function
--- gcc (Debian 4.3.2-1.1) 4.3.2 on Debian Lenny ---
CC arch/x86/kernel/apic/io_apic.o
--- gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4) on Ubuntu 8.04 ---
CC arch/x86/kernel/apic/io_apic.o
--- gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51) on CentOS 5 ---
CC arch/x86/kernel/apic/io_apic.o
--- gcc (GCC) 3.3.5 (Debian 1:3.3.5-13) on Debian Sarge ---
CC arch/x86/kernel/apic/io_apic.o
arch/x86/kernel/apic/io_apic.c: In function `setup_ir_ioapic_entry':
arch/x86/kernel/apic/io_apic.c:1354: warning: unsigned int format, different type arg (arg 11)
It turned out that gcc 4.3 and 4.5 do not inline __ioapic_read_entry() whereas
gcc 4.4 inlines __ioapic_read_entry().
--- gcc (Debian 4.3.2-1.1) 4.3.2 on Debian Lenny ---
00000040 <__ioapic_read_entry>:
40: 56 push %esi
41: 53 push %ebx
42: 8d 58 05 lea 0x5(%eax),%ebx
45: 8d 04 80 lea (%eax,%eax,4),%eax
48: 8b 0c c5 ac 08 00 00 mov 0x8ac(,%eax,8),%ecx
4f: c1 e3 0c shl $0xc,%ebx
52: 8d 74 12 10 lea 0x10(%edx,%edx,1),%esi
56: 81 e1 ff 0f 00 00 and $0xfff,%ecx
5c: 03 0d 00 00 00 00 add 0x0,%ecx
62: 29 d9 sub %ebx,%ecx
64: 89 31 mov %esi,(%ecx)
66: 83 c1 10 add $0x10,%ecx
69: 8b 09 mov (%ecx),%ecx
6b: 8b 04 c5 ac 08 00 00 mov 0x8ac(,%eax,8),%eax
72: 8d 54 12 11 lea 0x11(%edx,%edx,1),%edx
76: 25 ff 0f 00 00 and $0xfff,%eax
7b: 03 05 00 00 00 00 add 0x0,%eax
81: 29 d8 sub %ebx,%eax
83: 89 10 mov %edx,(%eax)
85: 83 c0 10 add $0x10,%eax
88: 8b 10 mov (%eax),%edx
8a: 89 c8 mov %ecx,%eax
8c: 5b pop %ebx
8d: 5e pop %esi
8e: c3 ret
8f: 90 nop
000004e0 <ioapic_read_entry>:
4e0: 83 ec 0c sub $0xc,%esp
4e3: 89 74 24 04 mov %esi,0x4(%esp)
4e7: 89 c6 mov %eax,%esi
4e9: b8 4e 08 00 00 mov $0x84e,%eax
4ee: 89 1c 24 mov %ebx,(%esp)
4f1: 89 d3 mov %edx,%ebx
4f3: 89 7c 24 08 mov %edi,0x8(%esp)
4f7: e8 fc ff ff ff call 4f8 <ioapic_read_entry+0x18>
4fc: 89 da mov %ebx,%edx
4fe: 89 c7 mov %eax,%edi
500: 89 f0 mov %esi,%eax
502: e8 39 fb ff ff call 40 <__ioapic_read_entry>
507: 89 c6 mov %eax,%esi
509: 89 d3 mov %edx,%ebx
50b: b8 4e 08 00 00 mov $0x84e,%eax
510: 89 fa mov %edi,%edx
512: e8 fc ff ff ff call 513 <ioapic_read_entry+0x33>
517: 89 f0 mov %esi,%eax
519: 89 da mov %ebx,%edx
51b: 8b 1c 24 mov (%esp),%ebx
51e: 8b 74 24 04 mov 0x4(%esp),%esi
522: 8b 7c 24 08 mov 0x8(%esp),%edi
526: 83 c4 0c add $0xc,%esp
529: c3 ret
52a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
--- gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 on Ubuntu 10.04 ---
00001d60 <ioapic_read_entry>:
1d60: 83 ec 0c sub $0xc,%esp
1d63: 89 1c 24 mov %ebx,(%esp)
1d66: 89 c3 mov %eax,%ebx
1d68: b8 4e 08 00 00 mov $0x84e,%eax
1d6d: 89 74 24 04 mov %esi,0x4(%esp)
1d71: 89 7c 24 08 mov %edi,0x8(%esp)
1d75: 89 d7 mov %edx,%edi
1d77: e8 fc ff ff ff call 1d78 <ioapic_read_entry+0x18>
1d7c: 8d 53 05 lea 0x5(%ebx),%edx
1d7f: 8d 1c 9b lea (%ebx,%ebx,4),%ebx
1d82: 8b 0c dd ac 08 00 00 mov 0x8ac(,%ebx,8),%ecx
1d89: c1 e2 0c shl $0xc,%edx
1d8c: 8d 74 3f 10 lea 0x10(%edi,%edi,1),%esi
1d90: 81 e1 ff 0f 00 00 and $0xfff,%ecx
1d96: 03 0d 00 00 00 00 add 0x0,%ecx
1d9c: 29 d1 sub %edx,%ecx
1d9e: 89 31 mov %esi,(%ecx)
1da0: 8b 71 10 mov 0x10(%ecx),%esi
1da3: 8b 0c dd ac 08 00 00 mov 0x8ac(,%ebx,8),%ecx
1daa: 8d 7c 3f 11 lea 0x11(%edi,%edi,1),%edi
1dae: 81 e1 ff 0f 00 00 and $0xfff,%ecx
1db4: 03 0d 00 00 00 00 add 0x0,%ecx
1dba: 29 d1 sub %edx,%ecx
1dbc: 89 39 mov %edi,(%ecx)
1dbe: 8b 59 10 mov 0x10(%ecx),%ebx
1dc1: 89 c2 mov %eax,%edx
1dc3: b8 4e 08 00 00 mov $0x84e,%eax
1dc8: e8 fc ff ff ff call 1dc9 <ioapic_read_entry+0x69>
1dcd: 89 f0 mov %esi,%eax
1dcf: 89 da mov %ebx,%edx
1dd1: 8b 1c 24 mov (%esp),%ebx
1dd4: 8b 74 24 04 mov 0x4(%esp),%esi
1dd8: 8b 7c 24 08 mov 0x8(%esp),%edi
1ddc: 83 c4 0c add $0xc,%esp
1ddf: c3 ret
--- gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4) on Fedora 14 ---
00000020 <__ioapic_read_entry>:
20: 56 push %esi
21: 8d 48 05 lea 0x5(%eax),%ecx
24: 8d 04 80 lea (%eax,%eax,4),%eax
27: 53 push %ebx
28: 8d 1c c5 60 08 00 00 lea 0x860(,%eax,8),%ebx
2f: 8b 43 0c mov 0xc(%ebx),%eax
32: c1 e1 0c shl $0xc,%ecx
35: 8d 74 12 10 lea 0x10(%edx,%edx,1),%esi
39: 25 ff 0f 00 00 and $0xfff,%eax
3e: 03 05 00 00 00 00 add 0x0,%eax
44: 29 c8 sub %ecx,%eax
46: 89 30 mov %esi,(%eax)
48: 8b 40 10 mov 0x10(%eax),%eax
4b: 8d 74 12 11 lea 0x11(%edx,%edx,1),%esi
4f: 8b 53 0c mov 0xc(%ebx),%edx
52: 81 e2 ff 0f 00 00 and $0xfff,%edx
58: 03 15 00 00 00 00 add 0x0,%edx
5e: 29 ca sub %ecx,%edx
60: 89 32 mov %esi,(%edx)
62: 8b 52 10 mov 0x10(%edx),%edx
65: 5b pop %ebx
66: 5e pop %esi
67: c3 ret
68: 90 nop
69: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi
00000200 <ioapic_read_entry>:
200: 83 ec 0c sub $0xc,%esp
203: 89 1c 24 mov %ebx,(%esp)
206: 89 c3 mov %eax,%ebx
208: b8 62 12 00 00 mov $0x1262,%eax
20d: 89 74 24 04 mov %esi,0x4(%esp)
211: 89 d6 mov %edx,%esi
213: 89 7c 24 08 mov %edi,0x8(%esp)
217: e8 fc ff ff ff call 218 <ioapic_read_entry+0x18>
21c: 89 f2 mov %esi,%edx
21e: 89 c7 mov %eax,%edi
220: 89 d8 mov %ebx,%eax
222: e8 f9 fd ff ff call 20 <__ioapic_read_entry>
227: 89 c3 mov %eax,%ebx
229: 89 d6 mov %edx,%esi
22b: b8 62 12 00 00 mov $0x1262,%eax
230: 89 fa mov %edi,%edx
232: e8 fc ff ff ff call 233 <ioapic_read_entry+0x33>
237: 89 d8 mov %ebx,%eax
239: 89 f2 mov %esi,%edx
23b: 8b 1c 24 mov (%esp),%ebx
23e: 8b 74 24 04 mov 0x4(%esp),%esi
242: 8b 7c 24 08 mov 0x8(%esp),%edi
246: 83 c4 0c add $0xc,%esp
249: c3 ret
24a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
Also, it turned out that this warning does not apprar when compiled with
CONFIG_M586MMX and earlier. This warning appears when compiled with CONFIG_M686
and later.
I don't know whether this warning is a false positive or not.
Can somebody who understand assembly code check this?
Regards.
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [3.2-rc4 x86] (Compiler bug?) Uninitialized variable in ioapic_read_entry()
2011-12-07 13:20 [3.2-rc4 x86] (Compiler bug?) Uninitialized variable in ioapic_read_entry() Tetsuo Handa
@ 2011-12-07 14:29 ` Steven Rostedt
0 siblings, 0 replies; 2+ messages in thread
From: Steven Rostedt @ 2011-12-07 14:29 UTC (permalink / raw)
To: Tetsuo Handa; +Cc: linux-kernel
On Wed, Dec 07, 2011 at 10:20:43PM +0900, Tetsuo Handa wrote:
> Regarding commit e57253a8 "x86, ioapic: Restore the mask bit correctly in
> eoi_ioapic_irq()", I got below warning:
>
> arch/x86/kernel/apic/io_apic.c: In function 'ioapic_read_entry':
> arch/x86/kernel/apic/io_apic.c:385: warning: 'eu' is used uninitialized in this function
>
> 369: union entry_union {
> 370: struct { u32 w1, w2; };
> 371: struct IO_APIC_route_entry entry;
> 372: };
> 373:
> 374: static struct IO_APIC_route_entry __ioapic_read_entry(int apic, int pin)
> 375: {
> 376: union entry_union eu;
> 377:
> 378: eu.w1 = io_apic_read(apic, 0x10 + 2 * pin);
> 379: eu.w2 = io_apic_read(apic, 0x11 + 2 * pin);
> 380: return eu.entry;
> 381: }
> 382:
> 383: static struct IO_APIC_route_entry ioapic_read_entry(int apic, int pin)
> 384: {
> 385: union entry_union eu;
> 386: unsigned long flags;
> 387: raw_spin_lock_irqsave(&ioapic_lock, flags);
> 388: eu.entry = __ioapic_read_entry(apic, pin);
> 389: raw_spin_unlock_irqrestore(&ioapic_lock, flags);
> 390: return eu.entry;
> 391: }
The above code looks fine. The only real differences is that the
"packed" attribute is not used by the above, but that really shouldn't
matter because gcc should always pack two u32 words together.
>
> I compared using several gcc versions.
> It turned out that only gcc 4.4 shows this warning.
>
[snip]
>
> It turned out that gcc 4.3 and 4.5 do not inline __ioapic_read_entry() whereas
> gcc 4.4 inlines __ioapic_read_entry().
>
> --- gcc (Debian 4.3.2-1.1) 4.3.2 on Debian Lenny ---
Lets compare:
>
> 00000040 <__ioapic_read_entry>:
> 40: 56 push %esi
> 41: 53 push %ebx
> 42: 8d 58 05 lea 0x5(%eax),%ebx
> 45: 8d 04 80 lea (%eax,%eax,4),%eax
> 48: 8b 0c c5 ac 08 00 00 mov 0x8ac(,%eax,8),%ecx
> 4f: c1 e3 0c shl $0xc,%ebx
> 52: 8d 74 12 10 lea 0x10(%edx,%edx,1),%esi
> 56: 81 e1 ff 0f 00 00 and $0xfff,%ecx
> 5c: 03 0d 00 00 00 00 add 0x0,%ecx
> 62: 29 d9 sub %ebx,%ecx
> 64: 89 31 mov %esi,(%ecx)
> 66: 83 c1 10 add $0x10,%ecx
> 69: 8b 09 mov (%ecx),%ecx
> 6b: 8b 04 c5 ac 08 00 00 mov 0x8ac(,%eax,8),%eax
> 72: 8d 54 12 11 lea 0x11(%edx,%edx,1),%edx
> 76: 25 ff 0f 00 00 and $0xfff,%eax
> 7b: 03 05 00 00 00 00 add 0x0,%eax
> 81: 29 d8 sub %ebx,%eax
> 83: 89 10 mov %edx,(%eax)
> 85: 83 c0 10 add $0x10,%eax
> 88: 8b 10 mov (%eax),%edx
> 8a: 89 c8 mov %ecx,%eax
> 8c: 5b pop %ebx
> 8d: 5e pop %esi
> 8e: c3 ret
> 8f: 90 nop
>
[ snip ]
>
> --- gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 on Ubuntu 10.04 ---
>
> 00001d60 <ioapic_read_entry>:
> 1d60: 83 ec 0c sub $0xc,%esp
> 1d63: 89 1c 24 mov %ebx,(%esp)
> 1d66: 89 c3 mov %eax,%ebx
> 1d68: b8 4e 08 00 00 mov $0x84e,%eax
> 1d6d: 89 74 24 04 mov %esi,0x4(%esp)
> 1d71: 89 7c 24 08 mov %edi,0x8(%esp)
> 1d75: 89 d7 mov %edx,%edi
> 1d77: e8 fc ff ff ff call 1d78 <ioapic_read_entry+0x18>
to this:
> 1d7c: 8d 53 05 lea 0x5(%ebx),%edx
> 1d7f: 8d 1c 9b lea (%ebx,%ebx,4),%ebx
> 1d82: 8b 0c dd ac 08 00 00 mov 0x8ac(,%ebx,8),%ecx
> 1d89: c1 e2 0c shl $0xc,%edx
> 1d8c: 8d 74 3f 10 lea 0x10(%edi,%edi,1),%esi
> 1d90: 81 e1 ff 0f 00 00 and $0xfff,%ecx
> 1d96: 03 0d 00 00 00 00 add 0x0,%ecx
> 1d9c: 29 d1 sub %edx,%ecx
> 1d9e: 89 31 mov %esi,(%ecx)
> 1da0: 8b 71 10 mov 0x10(%ecx),%esi
almost identical, where the former does:
add $0x10,%eax
mov (%eax), %edx
the latter does:
mov 0x10(%ecx), %ebx
which is basically the same.
> 1da3: 8b 0c dd ac 08 00 00 mov 0x8ac(,%ebx,8),%ecx
> 1daa: 8d 7c 3f 11 lea 0x11(%edi,%edi,1),%edi
> 1dae: 81 e1 ff 0f 00 00 and $0xfff,%ecx
> 1db4: 03 0d 00 00 00 00 add 0x0,%ecx
> 1dba: 29 d1 sub %edx,%ecx
> 1dbc: 89 39 mov %edi,(%ecx)
> 1dbe: 8b 59 10 mov 0x10(%ecx),%ebx
Again the shortcut is done.
> 1dc1: 89 c2 mov %eax,%edx
> 1dc3: b8 4e 08 00 00 mov $0x84e,%eax
> 1dc8: e8 fc ff ff ff call 1dc9 <ioapic_read_entry+0x69>
> 1dcd: 89 f0 mov %esi,%eax
> 1dcf: 89 da mov %ebx,%edx
> 1dd1: 8b 1c 24 mov (%esp),%ebx
> 1dd4: 8b 74 24 04 mov 0x4(%esp),%esi
> 1dd8: 8b 7c 24 08 mov 0x8(%esp),%edi
> 1ddc: 83 c4 0c add $0xc,%esp
> 1ddf: c3 ret
>
> --- gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4) on Fedora 14 ---
>
> 00000020 <__ioapic_read_entry>:
> 20: 56 push %esi
> 21: 8d 48 05 lea 0x5(%eax),%ecx
> 24: 8d 04 80 lea (%eax,%eax,4),%eax
> 27: 53 push %ebx
> 28: 8d 1c c5 60 08 00 00 lea 0x860(,%eax,8),%ebx
> 2f: 8b 43 0c mov 0xc(%ebx),%eax
I'm not sure why gcc did this differently.
The previous ones did:
mov 0x8ac(,%ebx,8),%ecx
Which is basically to load the contents at %ebx*8 + 0x8ac into %ecx
but the above does it in two steps:
%ebx = 0x860 + %eax * 8
load %eax with contest at %ebx + 0xc
Which is not the same address. Did you compile with the same options?
Maybe I just did my math wrong (I just woke up ;)
> 32: c1 e1 0c shl $0xc,%ecx
> 35: 8d 74 12 10 lea 0x10(%edx,%edx,1),%esi
> 39: 25 ff 0f 00 00 and $0xfff,%eax
> 3e: 03 05 00 00 00 00 add 0x0,%eax
> 44: 29 c8 sub %ecx,%eax
> 46: 89 30 mov %esi,(%eax)
> 48: 8b 40 10 mov 0x10(%eax),%eax
> 4b: 8d 74 12 11 lea 0x11(%edx,%edx,1),%esi
> 4f: 8b 53 0c mov 0xc(%ebx),%edx
> 52: 81 e2 ff 0f 00 00 and $0xfff,%edx
> 58: 03 15 00 00 00 00 add 0x0,%edx
> 5e: 29 ca sub %ecx,%edx
> 60: 89 32 mov %esi,(%edx)
> 62: 8b 52 10 mov 0x10(%edx),%edx
Here it does the shortcut version too.
> 65: 5b pop %ebx
> 66: 5e pop %esi
> 67: c3 ret
> 68: 90 nop
> 69: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi
>
> 00000200 <ioapic_read_entry>:
> 200: 83 ec 0c sub $0xc,%esp
> 203: 89 1c 24 mov %ebx,(%esp)
> 206: 89 c3 mov %eax,%ebx
> 208: b8 62 12 00 00 mov $0x1262,%eax
> 20d: 89 74 24 04 mov %esi,0x4(%esp)
> 211: 89 d6 mov %edx,%esi
> 213: 89 7c 24 08 mov %edi,0x8(%esp)
> 217: e8 fc ff ff ff call 218 <ioapic_read_entry+0x18>
> 21c: 89 f2 mov %esi,%edx
> 21e: 89 c7 mov %eax,%edi
> 220: 89 d8 mov %ebx,%eax
> 222: e8 f9 fd ff ff call 20 <__ioapic_read_entry>
> 227: 89 c3 mov %eax,%ebx
> 229: 89 d6 mov %edx,%esi
> 22b: b8 62 12 00 00 mov $0x1262,%eax
> 230: 89 fa mov %edi,%edx
> 232: e8 fc ff ff ff call 233 <ioapic_read_entry+0x33>
> 237: 89 d8 mov %ebx,%eax
> 239: 89 f2 mov %esi,%edx
> 23b: 8b 1c 24 mov (%esp),%ebx
> 23e: 8b 74 24 04 mov 0x4(%esp),%esi
> 242: 8b 7c 24 08 mov 0x8(%esp),%edi
> 246: 83 c4 0c add $0xc,%esp
> 249: c3 ret
> 24a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
>
> Also, it turned out that this warning does not apprar when compiled with
> CONFIG_M586MMX and earlier. This warning appears when compiled with CONFIG_M686
> and later.
>
> I don't know whether this warning is a false positive or not.
> Can somebody who understand assembly code check this?
Don's sweat it. It looks like a false positive. Gcc just got a little confused by
the union there.
-- Steve
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-12-07 14:29 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-07 13:20 [3.2-rc4 x86] (Compiler bug?) Uninitialized variable in ioapic_read_entry() Tetsuo Handa
2011-12-07 14:29 ` Steven Rostedt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®