mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-30 18:47:25 +00:00 
			
		
		
		
	 f159f4ed55
			
		
	
	
		f159f4ed55
		
	
	
	
	
		
			
			The TLS register is only available on ARM1136 r1p0 and later. Set HWCAP_TLS flags if hardware TLS is available and test for it if CONFIG_CPU_32v6K is not set for V6. Note that we set the TLS instruction in __kuser_get_tls dynamically as suggested by Jamie Lokier <jamie@shareable.org>. Also the __switch_to code is optimized out in most cases as suggested by Nicolas Pitre <nico@fluxnic.net>. Reviewed-by: Nicolas Pitre <nicolas.pitre@linaro.org> Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
		
			
				
	
	
		
			47 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __ASMARM_TLS_H
 | |
| #define __ASMARM_TLS_H
 | |
| 
 | |
| #ifdef __ASSEMBLY__
 | |
| 	.macro set_tls_none, tp, tmp1, tmp2
 | |
| 	.endm
 | |
| 
 | |
| 	.macro set_tls_v6k, tp, tmp1, tmp2
 | |
| 	mcr	p15, 0, \tp, c13, c0, 3		@ set TLS register
 | |
| 	.endm
 | |
| 
 | |
| 	.macro set_tls_v6, tp, tmp1, tmp2
 | |
| 	ldr	\tmp1, =elf_hwcap
 | |
| 	ldr	\tmp1, [\tmp1, #0]
 | |
| 	mov	\tmp2, #0xffff0fff
 | |
| 	tst	\tmp1, #HWCAP_TLS		@ hardware TLS available?
 | |
| 	mcrne	p15, 0, \tp, c13, c0, 3		@ yes, set TLS register
 | |
| 	streq	\tp, [\tmp2, #-15]		@ set TLS value at 0xffff0ff0
 | |
| 	.endm
 | |
| 
 | |
| 	.macro set_tls_software, tp, tmp1, tmp2
 | |
| 	mov	\tmp1, #0xffff0fff
 | |
| 	str	\tp, [\tmp1, #-15]		@ set TLS value at 0xffff0ff0
 | |
| 	.endm
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_TLS_REG_EMUL
 | |
| #define tls_emu		1
 | |
| #define has_tls_reg		1
 | |
| #define set_tls		set_tls_none
 | |
| #elif __LINUX_ARM_ARCH__ >= 7 ||					\
 | |
| 	(__LINUX_ARM_ARCH__ == 6 && defined(CONFIG_CPU_32v6K))
 | |
| #define tls_emu		0
 | |
| #define has_tls_reg		1
 | |
| #define set_tls		set_tls_v6k
 | |
| #elif __LINUX_ARM_ARCH__ == 6
 | |
| #define tls_emu		0
 | |
| #define has_tls_reg		(elf_hwcap & HWCAP_TLS)
 | |
| #define set_tls		set_tls_v6
 | |
| #else
 | |
| #define tls_emu		0
 | |
| #define has_tls_reg		0
 | |
| #define set_tls		set_tls_software
 | |
| #endif
 | |
| 
 | |
| #endif	/* __ASMARM_TLS_H */
 |