fix i8k inline asm to avoid miscompilation with newer gcc
This commit is contained in:
parent
15589b25c9
commit
6b5e37dd4b
84
fix-i8k-inline-asm.patch
Normal file
84
fix-i8k-inline-asm.patch
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
commit 22d3243de86bc92d874abb7c5b185d5c47aba323
|
||||||
|
Author: Jim Bos <jim876@xs4all.nl>
|
||||||
|
Date: Mon Nov 15 21:22:37 2010 +0100
|
||||||
|
|
||||||
|
Fix gcc 4.5.1 miscompiling drivers/char/i8k.c (again)
|
||||||
|
|
||||||
|
The fix in commit 6b4e81db2552 ("i8k: Tell gcc that *regs gets
|
||||||
|
clobbered") to work around the gcc miscompiling i8k.c to add "+m
|
||||||
|
(*regs)" caused register pressure problems and a build failure.
|
||||||
|
|
||||||
|
Changing the 'asm' statement to 'asm volatile' instead should prevent
|
||||||
|
that and works around the gcc bug as well, so we can remove the "+m".
|
||||||
|
|
||||||
|
[ Background on the gcc bug: a memory clobber fails to mark the function
|
||||||
|
the asm resides in as non-pure (aka "__attribute__((const))"), so if
|
||||||
|
the function does nothing else that triggers the non-pure logic, gcc
|
||||||
|
will think that that function has no side effects at all. As a result,
|
||||||
|
callers will be mis-compiled.
|
||||||
|
|
||||||
|
Adding the "+m" made gcc see that it's not a pure function, and so
|
||||||
|
does "asm volatile". The problem was never really the need to mark
|
||||||
|
"*regs" as changed, since the memory clobber did that part - the
|
||||||
|
problem was just a bug in the gcc "pure" function analysis - Linus ]
|
||||||
|
|
||||||
|
Signed-off-by: Jim Bos <jim876@xs4all.nl>
|
||||||
|
Acked-by: Jakub Jelinek <jakub@redhat.com>
|
||||||
|
Cc: Andi Kleen <andi@firstfloor.org>
|
||||||
|
Cc: Andreas Schwab <schwab@linux-m68k.org>
|
||||||
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
|
||||||
|
commit 6b4e81db2552bad04100e7d5ddeed7e848f53b48
|
||||||
|
Author: Jim Bos <jim876@xs4all.nl>
|
||||||
|
Date: Sat Nov 13 12:13:53 2010 +0100
|
||||||
|
|
||||||
|
i8k: Tell gcc that *regs gets clobbered
|
||||||
|
|
||||||
|
More recent GCC caused the i8k driver to stop working, on Slackware
|
||||||
|
compiler was upgraded from gcc-4.4.4 to gcc-4.5.1 after which it didn't
|
||||||
|
work anymore, meaning the driver didn't load or gave total nonsensical
|
||||||
|
output.
|
||||||
|
|
||||||
|
As it turned out the asm(..) statement forgot to mention it modifies the
|
||||||
|
*regs variable.
|
||||||
|
|
||||||
|
Credits to Andi Kleen and Andreas Schwab for providing the fix.
|
||||||
|
|
||||||
|
Signed-off-by: Jim Bos <jim876@xs4all.nl>
|
||||||
|
Cc: Andi Kleen <andi@firstfloor.org>
|
||||||
|
Cc: Andreas Schwab <schwab@linux-m68k.org>
|
||||||
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
|
||||||
|
---
|
||||||
|
diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c
|
||||||
|
index 3bc0eef..d72433f 100644
|
||||||
|
--- a/drivers/char/i8k.c
|
||||||
|
+++ b/drivers/char/i8k.c
|
||||||
|
@@ -120,7 +120,7 @@ static int i8k_smm(struct smm_regs *regs)
|
||||||
|
int eax = regs->eax;
|
||||||
|
|
||||||
|
#if defined(CONFIG_X86_64)
|
||||||
|
- asm("pushq %%rax\n\t"
|
||||||
|
+ asm volatile("pushq %%rax\n\t"
|
||||||
|
"movl 0(%%rax),%%edx\n\t"
|
||||||
|
"pushq %%rdx\n\t"
|
||||||
|
"movl 4(%%rax),%%ebx\n\t"
|
||||||
|
@@ -146,7 +146,7 @@ static int i8k_smm(struct smm_regs *regs)
|
||||||
|
: "a"(regs)
|
||||||
|
: "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
|
||||||
|
#else
|
||||||
|
- asm("pushl %%eax\n\t"
|
||||||
|
+ asm volatile("pushl %%eax\n\t"
|
||||||
|
"movl 0(%%eax),%%edx\n\t"
|
||||||
|
"push %%edx\n\t"
|
||||||
|
"movl 4(%%eax),%%ebx\n\t"
|
||||||
|
@@ -167,7 +167,8 @@ static int i8k_smm(struct smm_regs *regs)
|
||||||
|
"movl %%edx,0(%%eax)\n\t"
|
||||||
|
"lahf\n\t"
|
||||||
|
"shrl $8,%%eax\n\t"
|
||||||
|
- "andl $1,%%eax\n":"=a"(rc)
|
||||||
|
+ "andl $1,%%eax\n"
|
||||||
|
+ :"=a"(rc)
|
||||||
|
: "a"(regs)
|
||||||
|
: "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
|
||||||
|
#endif
|
@ -728,6 +728,8 @@ Patch12305: xhci_hcd-suspend-resume.patch
|
|||||||
|
|
||||||
Patch12307: tty-restore-tty_ldisc_wait_idle.patch
|
Patch12307: tty-restore-tty_ldisc_wait_idle.patch
|
||||||
|
|
||||||
|
Patch12308: fix-i8k-inline-asm.patch
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
||||||
@ -1350,6 +1352,8 @@ ApplyPatch xhci_hcd-suspend-resume.patch
|
|||||||
|
|
||||||
ApplyPatch tty-restore-tty_ldisc_wait_idle.patch
|
ApplyPatch tty-restore-tty_ldisc_wait_idle.patch
|
||||||
|
|
||||||
|
ApplyPatch fix-i8k-inline-asm.patch
|
||||||
|
|
||||||
# END OF PATCH APPLICATIONS
|
# END OF PATCH APPLICATIONS
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
@ -1963,6 +1967,10 @@ fi
|
|||||||
# || ||
|
# || ||
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Nov 23 2010 Kyle McMartin <kyle@redhat.com>
|
||||||
|
- fix-i8k-inline-asm.patch: backport gcc miscompilation fix from git
|
||||||
|
[22d3243d, 6b4e81db] (rhbz#647677)
|
||||||
|
|
||||||
* Mon Nov 22 2010 Kyle McMartin <kyle@redhat.com>
|
* Mon Nov 22 2010 Kyle McMartin <kyle@redhat.com>
|
||||||
- Add a debugging patch to help track down which tty is being
|
- Add a debugging patch to help track down which tty is being
|
||||||
poked by plymouth.
|
poked by plymouth.
|
||||||
|
Loading…
Reference in New Issue
Block a user