diff options
author | Josh Poimboeuf <jpoimboe@redhat.com> | 2016-01-21 17:49:22 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-02-24 02:35:43 -0500 |
commit | 3387a535ce629906d849864ef6a3c3437a645cb5 (patch) | |
tree | a9548a604bdf84f4d23e896757c4a5d92fa89b05 /arch/x86/lib | |
parent | 13523309495cdbd57a0d344c0d5d574987af007f (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.S | 11 |
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 */ |
86 | ENTRY(call_rwsem_down_read_failed) | 87 | ENTRY(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 |
94 | ENDPROC(call_rwsem_down_read_failed) | 97 | ENDPROC(call_rwsem_down_read_failed) |
95 | 98 | ||
96 | ENTRY(call_rwsem_down_write_failed) | 99 | ENTRY(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 |
102 | ENDPROC(call_rwsem_down_write_failed) | 107 | ENDPROC(call_rwsem_down_write_failed) |
103 | 108 | ||
104 | ENTRY(call_rwsem_wake) | 109 | ENTRY(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 |
112 | 1: ret | 118 | 1: FRAME_END |
119 | ret | ||
113 | ENDPROC(call_rwsem_wake) | 120 | ENDPROC(call_rwsem_wake) |
114 | 121 | ||
115 | ENTRY(call_rwsem_downgrade_wake) | 122 | ENTRY(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 |
123 | ENDPROC(call_rwsem_downgrade_wake) | 132 | ENDPROC(call_rwsem_downgrade_wake) |