From 6b5e37dd4b06e1ffb3f40d888660f3635f96b6ba Mon Sep 17 00:00:00 2001 From: Kyle McMartin Date: Tue, 23 Nov 2010 09:50:52 -0500 Subject: [PATCH] fix i8k inline asm to avoid miscompilation with newer gcc --- fix-i8k-inline-asm.patch | 84 ++++++++++++++++++++++++++++++++++++++++ kernel.spec | 8 ++++ 2 files changed, 92 insertions(+) create mode 100644 fix-i8k-inline-asm.patch diff --git a/fix-i8k-inline-asm.patch b/fix-i8k-inline-asm.patch new file mode 100644 index 000000000..87fadc014 --- /dev/null +++ b/fix-i8k-inline-asm.patch @@ -0,0 +1,84 @@ +commit 22d3243de86bc92d874abb7c5b185d5c47aba323 +Author: Jim Bos +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 + Acked-by: Jakub Jelinek + Cc: Andi Kleen + Cc: Andreas Schwab + Signed-off-by: Linus Torvalds + +commit 6b4e81db2552bad04100e7d5ddeed7e848f53b48 +Author: Jim Bos +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 + Cc: Andi Kleen + Cc: Andreas Schwab + Signed-off-by: Linus Torvalds + +--- +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 diff --git a/kernel.spec b/kernel.spec index adcef1b77..8b08076ea 100644 --- a/kernel.spec +++ b/kernel.spec @@ -728,6 +728,8 @@ Patch12305: xhci_hcd-suspend-resume.patch Patch12307: tty-restore-tty_ldisc_wait_idle.patch +Patch12308: fix-i8k-inline-asm.patch + %endif BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root @@ -1350,6 +1352,8 @@ ApplyPatch xhci_hcd-suspend-resume.patch ApplyPatch tty-restore-tty_ldisc_wait_idle.patch +ApplyPatch fix-i8k-inline-asm.patch + # END OF PATCH APPLICATIONS %endif @@ -1963,6 +1967,10 @@ fi # || || %changelog +* Tue Nov 23 2010 Kyle McMartin +- fix-i8k-inline-asm.patch: backport gcc miscompilation fix from git + [22d3243d, 6b4e81db] (rhbz#647677) + * Mon Nov 22 2010 Kyle McMartin - Add a debugging patch to help track down which tty is being poked by plymouth.