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