mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ARM: vfp: fix saving d16-d31 vfp registers on v6+ kernels
Michael Olbrich reported that his test program fails when built with
-O2 -mcpu=cortex-a8 -mfpu=neon, and a kernel which supports v6 and v7
CPUs:
volatile int x = 2;
volatile int64_t y = 2;
int main() {
	volatile int a = 0;
	volatile int64_t b = 0;
	while (1) {
		a = (a + x) % (1 << 30);
		b = (b + y) % (1 << 30);
		assert(a == b);
	}
}
and two instances are run.  When built for just v7 CPUs, this program
works fine.  It uses the "vadd.i64 d19, d18, d16" VFP instruction.
It appears that we do not save the high-16 double VFP registers across
context switches when the kernel is built for v6 CPUs.  Fix that.
Cc: <stable@vger.kernel.org>
Tested-By: Michael Olbrich <m.olbrich@pengutronix.de>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
			
			
This commit is contained in:
		
							parent
							
								
									f5a246eab9
								
							
						
					
					
						commit
						846a136881
					
				
					 1 changed files with 2 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -28,7 +28,7 @@
 | 
			
		|||
	ldr	\tmp, =elf_hwcap		    @ may not have MVFR regs
 | 
			
		||||
	ldr	\tmp, [\tmp, #0]
 | 
			
		||||
	tst	\tmp, #HWCAP_VFPv3D16
 | 
			
		||||
	ldceq	p11, cr0, [\base],#32*4		    @ FLDMIAD \base!, {d16-d31}
 | 
			
		||||
	ldceql	p11, cr0, [\base],#32*4		    @ FLDMIAD \base!, {d16-d31}
 | 
			
		||||
	addne	\base, \base, #32*4		    @ step over unused register space
 | 
			
		||||
#else
 | 
			
		||||
	VFPFMRX	\tmp, MVFR0			    @ Media and VFP Feature Register 0
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@
 | 
			
		|||
	ldr	\tmp, =elf_hwcap		    @ may not have MVFR regs
 | 
			
		||||
	ldr	\tmp, [\tmp, #0]
 | 
			
		||||
	tst	\tmp, #HWCAP_VFPv3D16
 | 
			
		||||
	stceq	p11, cr0, [\base],#32*4		    @ FSTMIAD \base!, {d16-d31}
 | 
			
		||||
	stceql	p11, cr0, [\base],#32*4		    @ FSTMIAD \base!, {d16-d31}
 | 
			
		||||
	addne	\base, \base, #32*4		    @ step over unused register space
 | 
			
		||||
#else
 | 
			
		||||
	VFPFMRX	\tmp, MVFR0			    @ Media and VFP Feature Register 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue