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
 | 
			
		||||
 | 
			
		||||
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 <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>
 | 
			
		||||
- Add a debugging patch to help track down which tty is being
 | 
			
		||||
  poked by plymouth.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user