Skip to content

Commit 3387a53

Browse files
jpoimboeIngo Molnar
authored andcommitted
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>
1 parent 1352330 commit 3387a53

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

arch/x86/lib/rwsem.S

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include <linux/linkage.h>
1717
#include <asm/alternative-asm.h>
18+
#include <asm/frame.h>
1819

1920
#define __ASM_HALF_REG(reg) __ASM_SEL(reg, e##reg)
2021
#define __ASM_HALF_SIZE(inst) __ASM_SEL(inst##w, inst##l)
@@ -84,40 +85,48 @@
8485

8586
/* Fix up special calling conventions */
8687
ENTRY(call_rwsem_down_read_failed)
88+
FRAME_BEGIN
8789
save_common_regs
8890
__ASM_SIZE(push,) %__ASM_REG(dx)
8991
movq %rax,%rdi
9092
call rwsem_down_read_failed
9193
__ASM_SIZE(pop,) %__ASM_REG(dx)
9294
restore_common_regs
95+
FRAME_END
9396
ret
9497
ENDPROC(call_rwsem_down_read_failed)
9598

9699
ENTRY(call_rwsem_down_write_failed)
100+
FRAME_BEGIN
97101
save_common_regs
98102
movq %rax,%rdi
99103
call rwsem_down_write_failed
100104
restore_common_regs
105+
FRAME_END
101106
ret
102107
ENDPROC(call_rwsem_down_write_failed)
103108

104109
ENTRY(call_rwsem_wake)
110+
FRAME_BEGIN
105111
/* do nothing if still outstanding active readers */
106112
__ASM_HALF_SIZE(dec) %__ASM_HALF_REG(dx)
107113
jnz 1f
108114
save_common_regs
109115
movq %rax,%rdi
110116
call rwsem_wake
111117
restore_common_regs
112-
1: ret
118+
1: FRAME_END
119+
ret
113120
ENDPROC(call_rwsem_wake)
114121

115122
ENTRY(call_rwsem_downgrade_wake)
123+
FRAME_BEGIN
116124
save_common_regs
117125
__ASM_SIZE(push,) %__ASM_REG(dx)
118126
movq %rax,%rdi
119127
call rwsem_downgrade_wake
120128
__ASM_SIZE(pop,) %__ASM_REG(dx)
121129
restore_common_regs
130+
FRAME_END
122131
ret
123132
ENDPROC(call_rwsem_downgrade_wake)

0 commit comments

Comments
 (0)