@@ -137,6 +137,42 @@ For 32-bit we have the following conventions - kernel is built with
137137 UNWIND_HINT_REGS offset = \offset
138138 .endm
139139
140+ .macro PUSH_AND_CLEAR_REGS
141+ /*
142+ * Push registers and sanitize registers of values that a
143+ * speculation attack might otherwise want to exploit. The
144+ * lower registers are likely clobbered well before they
145+ * could be put to use in a speculative execution gadget.
146+ * Interleave XOR with PUSH for better uop scheduling:
147+ */
148+ pushq %rdi /* pt_regs->di */
149+ pushq %rsi /* pt_regs->si */
150+ pushq %rdx /* pt_regs->dx */
151+ pushq %rcx /* pt_regs->cx */
152+ pushq %rax /* pt_regs->ax */
153+ pushq %r8 /* pt_regs->r8 */
154+ xorq %r8 , %r8 /* nospec r8 */
155+ pushq %r9 /* pt_regs->r9 */
156+ xorq %r9 , %r9 /* nospec r9 */
157+ pushq %r10 /* pt_regs->r10 */
158+ xorq %r10 , %r10 /* nospec r10 */
159+ pushq %r11 /* pt_regs->r11 */
160+ xorq %r11 , %r11 /* nospec r11*/
161+ pushq %rbx /* pt_regs->rbx */
162+ xorl %ebx , %ebx /* nospec rbx*/
163+ pushq %rbp /* pt_regs->rbp */
164+ xorl %ebp , %ebp /* nospec rbp*/
165+ pushq %r12 /* pt_regs->r12 */
166+ xorq %r12 , %r12 /* nospec r12*/
167+ pushq %r13 /* pt_regs->r13 */
168+ xorq %r13 , %r13 /* nospec r13*/
169+ pushq %r14 /* pt_regs->r14 */
170+ xorq %r14 , %r14 /* nospec r14*/
171+ pushq %r15 /* pt_regs->r15 */
172+ xorq %r15 , %r15 /* nospec r15*/
173+ UNWIND_HINT_REGS
174+ .endm
175+
140176 .macro POP_REGS pop_rdi = 1 skip_r11rcx = 0
141177 popq %r15
142178 popq %r14
0 commit comments