diff options
Diffstat (limited to 'arch/x86/entry/calling.h')
-rw-r--r-- | arch/x86/entry/calling.h | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/arch/x86/entry/calling.h b/arch/x86/entry/calling.h index dce7092ab24a..be63330c5511 100644 --- a/arch/x86/entry/calling.h +++ b/arch/x86/entry/calling.h | |||
@@ -97,7 +97,7 @@ For 32-bit we have the following conventions - kernel is built with | |||
97 | 97 | ||
98 | #define SIZEOF_PTREGS 21*8 | 98 | #define SIZEOF_PTREGS 21*8 |
99 | 99 | ||
100 | .macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax | 100 | .macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax save_ret=0 |
101 | /* | 101 | /* |
102 | * Push registers and sanitize registers of values that a | 102 | * Push registers and sanitize registers of values that a |
103 | * speculation attack might otherwise want to exploit. The | 103 | * speculation attack might otherwise want to exploit. The |
@@ -105,32 +105,41 @@ For 32-bit we have the following conventions - kernel is built with | |||
105 | * could be put to use in a speculative execution gadget. | 105 | * could be put to use in a speculative execution gadget. |
106 | * Interleave XOR with PUSH for better uop scheduling: | 106 | * Interleave XOR with PUSH for better uop scheduling: |
107 | */ | 107 | */ |
108 | .if \save_ret | ||
109 | pushq %rsi /* pt_regs->si */ | ||
110 | movq 8(%rsp), %rsi /* temporarily store the return address in %rsi */ | ||
111 | movq %rdi, 8(%rsp) /* pt_regs->di (overwriting original return address) */ | ||
112 | .else | ||
108 | pushq %rdi /* pt_regs->di */ | 113 | pushq %rdi /* pt_regs->di */ |
109 | pushq %rsi /* pt_regs->si */ | 114 | pushq %rsi /* pt_regs->si */ |
115 | .endif | ||
110 | pushq \rdx /* pt_regs->dx */ | 116 | pushq \rdx /* pt_regs->dx */ |
111 | pushq %rcx /* pt_regs->cx */ | 117 | pushq %rcx /* pt_regs->cx */ |
112 | pushq \rax /* pt_regs->ax */ | 118 | pushq \rax /* pt_regs->ax */ |
113 | pushq %r8 /* pt_regs->r8 */ | 119 | pushq %r8 /* pt_regs->r8 */ |
114 | xorq %r8, %r8 /* nospec r8 */ | 120 | xorl %r8d, %r8d /* nospec r8 */ |
115 | pushq %r9 /* pt_regs->r9 */ | 121 | pushq %r9 /* pt_regs->r9 */ |
116 | xorq %r9, %r9 /* nospec r9 */ | 122 | xorl %r9d, %r9d /* nospec r9 */ |
117 | pushq %r10 /* pt_regs->r10 */ | 123 | pushq %r10 /* pt_regs->r10 */ |
118 | xorq %r10, %r10 /* nospec r10 */ | 124 | xorl %r10d, %r10d /* nospec r10 */ |
119 | pushq %r11 /* pt_regs->r11 */ | 125 | pushq %r11 /* pt_regs->r11 */ |
120 | xorq %r11, %r11 /* nospec r11*/ | 126 | xorl %r11d, %r11d /* nospec r11*/ |
121 | pushq %rbx /* pt_regs->rbx */ | 127 | pushq %rbx /* pt_regs->rbx */ |
122 | xorl %ebx, %ebx /* nospec rbx*/ | 128 | xorl %ebx, %ebx /* nospec rbx*/ |
123 | pushq %rbp /* pt_regs->rbp */ | 129 | pushq %rbp /* pt_regs->rbp */ |
124 | xorl %ebp, %ebp /* nospec rbp*/ | 130 | xorl %ebp, %ebp /* nospec rbp*/ |
125 | pushq %r12 /* pt_regs->r12 */ | 131 | pushq %r12 /* pt_regs->r12 */ |
126 | xorq %r12, %r12 /* nospec r12*/ | 132 | xorl %r12d, %r12d /* nospec r12*/ |
127 | pushq %r13 /* pt_regs->r13 */ | 133 | pushq %r13 /* pt_regs->r13 */ |
128 | xorq %r13, %r13 /* nospec r13*/ | 134 | xorl %r13d, %r13d /* nospec r13*/ |
129 | pushq %r14 /* pt_regs->r14 */ | 135 | pushq %r14 /* pt_regs->r14 */ |
130 | xorq %r14, %r14 /* nospec r14*/ | 136 | xorl %r14d, %r14d /* nospec r14*/ |
131 | pushq %r15 /* pt_regs->r15 */ | 137 | pushq %r15 /* pt_regs->r15 */ |
132 | xorq %r15, %r15 /* nospec r15*/ | 138 | xorl %r15d, %r15d /* nospec r15*/ |
133 | UNWIND_HINT_REGS | 139 | UNWIND_HINT_REGS |
140 | .if \save_ret | ||
141 | pushq %rsi /* return address on top of stack */ | ||
142 | .endif | ||
134 | .endm | 143 | .endm |
135 | 144 | ||
136 | .macro POP_REGS pop_rdi=1 skip_r11rcx=0 | 145 | .macro POP_REGS pop_rdi=1 skip_r11rcx=0 |
@@ -172,12 +181,7 @@ For 32-bit we have the following conventions - kernel is built with | |||
172 | */ | 181 | */ |
173 | .macro ENCODE_FRAME_POINTER ptregs_offset=0 | 182 | .macro ENCODE_FRAME_POINTER ptregs_offset=0 |
174 | #ifdef CONFIG_FRAME_POINTER | 183 | #ifdef CONFIG_FRAME_POINTER |
175 | .if \ptregs_offset | 184 | leaq 1+\ptregs_offset(%rsp), %rbp |
176 | leaq \ptregs_offset(%rsp), %rbp | ||
177 | .else | ||
178 | mov %rsp, %rbp | ||
179 | .endif | ||
180 | orq $0x1, %rbp | ||
181 | #endif | 185 | #endif |
182 | .endm | 186 | .endm |
183 | 187 | ||