forked from mirrors/linux
		
	x86/asm: Create stack frames in rwsem functions
rwsem.S has several callable non-leaf functions which don't honor CONFIG_FRAME_POINTER, which can result in bad stack traces. Create stack frames for them when CONFIG_FRAME_POINTER is enabled. Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Reviewed-by: Borislav Petkov <bp@suse.de> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Andy Lutomirski <luto@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Bernd Petrovitsch <bernd@petrovitsch.priv.at> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Chris J Arges <chris.j.arges@canonical.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Jiri Slaby <jslaby@suse.cz> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Michal Marek <mmarek@suse.cz> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Pedro Alves <palves@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: live-patching@vger.kernel.org Link: http://lkml.kernel.org/r/ad0932bbead975b15f9578e4f2cf2ee5961eb840.1453405861.git.jpoimboe@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
		
							parent
							
								
									1352330949
								
							
						
					
					
						commit
						3387a535ce
					
				
					 1 changed files with 10 additions and 1 deletions
				
			
		| 
						 | 
					@ -15,6 +15,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <linux/linkage.h>
 | 
					#include <linux/linkage.h>
 | 
				
			||||||
#include <asm/alternative-asm.h>
 | 
					#include <asm/alternative-asm.h>
 | 
				
			||||||
 | 
					#include <asm/frame.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define __ASM_HALF_REG(reg)	__ASM_SEL(reg, e##reg)
 | 
					#define __ASM_HALF_REG(reg)	__ASM_SEL(reg, e##reg)
 | 
				
			||||||
#define __ASM_HALF_SIZE(inst)	__ASM_SEL(inst##w, inst##l)
 | 
					#define __ASM_HALF_SIZE(inst)	__ASM_SEL(inst##w, inst##l)
 | 
				
			||||||
| 
						 | 
					@ -84,24 +85,29 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Fix up special calling conventions */
 | 
					/* Fix up special calling conventions */
 | 
				
			||||||
ENTRY(call_rwsem_down_read_failed)
 | 
					ENTRY(call_rwsem_down_read_failed)
 | 
				
			||||||
 | 
						FRAME_BEGIN
 | 
				
			||||||
	save_common_regs
 | 
						save_common_regs
 | 
				
			||||||
	__ASM_SIZE(push,) %__ASM_REG(dx)
 | 
						__ASM_SIZE(push,) %__ASM_REG(dx)
 | 
				
			||||||
	movq %rax,%rdi
 | 
						movq %rax,%rdi
 | 
				
			||||||
	call rwsem_down_read_failed
 | 
						call rwsem_down_read_failed
 | 
				
			||||||
	__ASM_SIZE(pop,) %__ASM_REG(dx)
 | 
						__ASM_SIZE(pop,) %__ASM_REG(dx)
 | 
				
			||||||
	restore_common_regs
 | 
						restore_common_regs
 | 
				
			||||||
 | 
						FRAME_END
 | 
				
			||||||
	ret
 | 
						ret
 | 
				
			||||||
ENDPROC(call_rwsem_down_read_failed)
 | 
					ENDPROC(call_rwsem_down_read_failed)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(call_rwsem_down_write_failed)
 | 
					ENTRY(call_rwsem_down_write_failed)
 | 
				
			||||||
 | 
						FRAME_BEGIN
 | 
				
			||||||
	save_common_regs
 | 
						save_common_regs
 | 
				
			||||||
	movq %rax,%rdi
 | 
						movq %rax,%rdi
 | 
				
			||||||
	call rwsem_down_write_failed
 | 
						call rwsem_down_write_failed
 | 
				
			||||||
	restore_common_regs
 | 
						restore_common_regs
 | 
				
			||||||
 | 
						FRAME_END
 | 
				
			||||||
	ret
 | 
						ret
 | 
				
			||||||
ENDPROC(call_rwsem_down_write_failed)
 | 
					ENDPROC(call_rwsem_down_write_failed)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(call_rwsem_wake)
 | 
					ENTRY(call_rwsem_wake)
 | 
				
			||||||
 | 
						FRAME_BEGIN
 | 
				
			||||||
	/* do nothing if still outstanding active readers */
 | 
						/* do nothing if still outstanding active readers */
 | 
				
			||||||
	__ASM_HALF_SIZE(dec) %__ASM_HALF_REG(dx)
 | 
						__ASM_HALF_SIZE(dec) %__ASM_HALF_REG(dx)
 | 
				
			||||||
	jnz 1f
 | 
						jnz 1f
 | 
				
			||||||
| 
						 | 
					@ -109,15 +115,18 @@ ENTRY(call_rwsem_wake)
 | 
				
			||||||
	movq %rax,%rdi
 | 
						movq %rax,%rdi
 | 
				
			||||||
	call rwsem_wake
 | 
						call rwsem_wake
 | 
				
			||||||
	restore_common_regs
 | 
						restore_common_regs
 | 
				
			||||||
1:	ret
 | 
					1:	FRAME_END
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
ENDPROC(call_rwsem_wake)
 | 
					ENDPROC(call_rwsem_wake)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(call_rwsem_downgrade_wake)
 | 
					ENTRY(call_rwsem_downgrade_wake)
 | 
				
			||||||
 | 
						FRAME_BEGIN
 | 
				
			||||||
	save_common_regs
 | 
						save_common_regs
 | 
				
			||||||
	__ASM_SIZE(push,) %__ASM_REG(dx)
 | 
						__ASM_SIZE(push,) %__ASM_REG(dx)
 | 
				
			||||||
	movq %rax,%rdi
 | 
						movq %rax,%rdi
 | 
				
			||||||
	call rwsem_downgrade_wake
 | 
						call rwsem_downgrade_wake
 | 
				
			||||||
	__ASM_SIZE(pop,) %__ASM_REG(dx)
 | 
						__ASM_SIZE(pop,) %__ASM_REG(dx)
 | 
				
			||||||
	restore_common_regs
 | 
						restore_common_regs
 | 
				
			||||||
 | 
						FRAME_END
 | 
				
			||||||
	ret
 | 
						ret
 | 
				
			||||||
ENDPROC(call_rwsem_downgrade_wake)
 | 
					ENDPROC(call_rwsem_downgrade_wake)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue