aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/lib
diff options
context:
space:
mode:
authorJosh Poimboeuf <jpoimboe@redhat.com>2016-01-21 17:49:22 -0500
committerIngo Molnar <mingo@kernel.org>2016-02-24 02:35:43 -0500
commit3387a535ce629906d849864ef6a3c3437a645cb5 (patch)
treea9548a604bdf84f4d23e896757c4a5d92fa89b05 /arch/x86/lib
parent13523309495cdbd57a0d344c0d5d574987af007f (diff)
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>
Diffstat (limited to 'arch/x86/lib')
-rw-r--r--arch/x86/lib/rwsem.S11
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/x86/lib/rwsem.S b/arch/x86/lib/rwsem.S
index 40027db99140..be110efa0096 100644
--- a/arch/x86/lib/rwsem.S
+++ b/arch/x86/lib/rwsem.S
@@ -15,6 +15,7 @@
15 15
16#include <linux/linkage.h> 16#include <linux/linkage.h>
17#include <asm/alternative-asm.h> 17#include <asm/alternative-asm.h>
18#include <asm/frame.h>
18 19
19#define __ASM_HALF_REG(reg) __ASM_SEL(reg, e##reg) 20#define __ASM_HALF_REG(reg) __ASM_SEL(reg, e##reg)
20#define __ASM_HALF_SIZE(inst) __ASM_SEL(inst##w, inst##l) 21#define __ASM_HALF_SIZE(inst) __ASM_SEL(inst##w, inst##l)
@@ -84,24 +85,29 @@
84 85
85/* Fix up special calling conventions */ 86/* Fix up special calling conventions */
86ENTRY(call_rwsem_down_read_failed) 87ENTRY(call_rwsem_down_read_failed)
88 FRAME_BEGIN
87 save_common_regs 89 save_common_regs
88 __ASM_SIZE(push,) %__ASM_REG(dx) 90 __ASM_SIZE(push,) %__ASM_REG(dx)
89 movq %rax,%rdi 91 movq %rax,%rdi
90 call rwsem_down_read_failed 92 call rwsem_down_read_failed
91 __ASM_SIZE(pop,) %__ASM_REG(dx) 93 __ASM_SIZE(pop,) %__ASM_REG(dx)
92 restore_common_regs 94 restore_common_regs
95 FRAME_END
93 ret 96 ret
94ENDPROC(call_rwsem_down_read_failed) 97ENDPROC(call_rwsem_down_read_failed)
95 98
96ENTRY(call_rwsem_down_write_failed) 99ENTRY(call_rwsem_down_write_failed)
100 FRAME_BEGIN
97 save_common_regs 101 save_common_regs
98 movq %rax,%rdi 102 movq %rax,%rdi
99 call rwsem_down_write_failed 103 call rwsem_down_write_failed
100 restore_common_regs 104 restore_common_regs
105 FRAME_END
101 ret 106 ret
102ENDPROC(call_rwsem_down_write_failed) 107ENDPROC(call_rwsem_down_write_failed)
103 108
104ENTRY(call_rwsem_wake) 109ENTRY(call_rwsem_wake)
110 FRAME_BEGIN
105 /* do nothing if still outstanding active readers */ 111 /* do nothing if still outstanding active readers */
106 __ASM_HALF_SIZE(dec) %__ASM_HALF_REG(dx) 112 __ASM_HALF_SIZE(dec) %__ASM_HALF_REG(dx)
107 jnz 1f 113 jnz 1f
@@ -109,15 +115,18 @@ ENTRY(call_rwsem_wake)
109 movq %rax,%rdi 115 movq %rax,%rdi
110 call rwsem_wake 116 call rwsem_wake
111 restore_common_regs 117 restore_common_regs
1121: ret 1181: FRAME_END
119 ret
113ENDPROC(call_rwsem_wake) 120ENDPROC(call_rwsem_wake)
114 121
115ENTRY(call_rwsem_downgrade_wake) 122ENTRY(call_rwsem_downgrade_wake)
123 FRAME_BEGIN
116 save_common_regs 124 save_common_regs
117 __ASM_SIZE(push,) %__ASM_REG(dx) 125 __ASM_SIZE(push,) %__ASM_REG(dx)
118 movq %rax,%rdi 126 movq %rax,%rdi
119 call rwsem_downgrade_wake 127 call rwsem_downgrade_wake
120 __ASM_SIZE(pop,) %__ASM_REG(dx) 128 __ASM_SIZE(pop,) %__ASM_REG(dx)
121 restore_common_regs 129 restore_common_regs
130 FRAME_END
122 ret 131 ret
123ENDPROC(call_rwsem_downgrade_wake) 132ENDPROC(call_rwsem_downgrade_wake)