Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

alpha: align stack for page fault and user unaligned trap handlers

do_page_fault() and do_entUna() are special because they use
non-standard stack frame layout. Fix them manually.

Cc: stable@vger.kernel.org
Tested-by: Maciej W. Rozycki <macro@orcam.me.uk>
Tested-by: Magnus Lindholm <linmag7@gmail.com>
Tested-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Maciej W. Rozycki <macro@orcam.me.uk>
Suggested-by: Maciej W. Rozycki <macro@orcam.me.uk>
Signed-off-by: Ivan Kokshaysky <ink@unseen.parts>
Signed-off-by: Matt Turner <mattst88@gmail.com>

authored by

Ivan Kokshaysky and committed by
Matt Turner
3b35a171 0a0f7362

+13 -13
+10 -10
arch/alpha/kernel/entry.S
··· 194 194 CFI_START_OSF_FRAME entMM 195 195 SAVE_ALL 196 196 /* save $9 - $15 so the inline exception code can manipulate them. */ 197 - subq $sp, 56, $sp 198 - .cfi_adjust_cfa_offset 56 197 + subq $sp, 64, $sp 198 + .cfi_adjust_cfa_offset 64 199 199 stq $9, 0($sp) 200 200 stq $10, 8($sp) 201 201 stq $11, 16($sp) ··· 210 210 .cfi_rel_offset $13, 32 211 211 .cfi_rel_offset $14, 40 212 212 .cfi_rel_offset $15, 48 213 - addq $sp, 56, $19 213 + addq $sp, 64, $19 214 214 /* handle the fault */ 215 215 lda $8, 0x3fff 216 216 bic $sp, $8, $8 ··· 223 223 ldq $13, 32($sp) 224 224 ldq $14, 40($sp) 225 225 ldq $15, 48($sp) 226 - addq $sp, 56, $sp 226 + addq $sp, 64, $sp 227 227 .cfi_restore $9 228 228 .cfi_restore $10 229 229 .cfi_restore $11 ··· 231 231 .cfi_restore $13 232 232 .cfi_restore $14 233 233 .cfi_restore $15 234 - .cfi_adjust_cfa_offset -56 234 + .cfi_adjust_cfa_offset -64 235 235 /* finish up the syscall as normal. */ 236 236 br ret_from_sys_call 237 237 CFI_END_OSF_FRAME entMM ··· 378 378 .cfi_restore $0 379 379 .cfi_adjust_cfa_offset -256 380 380 SAVE_ALL /* setup normal kernel stack */ 381 - lda $sp, -56($sp) 382 - .cfi_adjust_cfa_offset 56 381 + lda $sp, -64($sp) 382 + .cfi_adjust_cfa_offset 64 383 383 stq $9, 0($sp) 384 384 stq $10, 8($sp) 385 385 stq $11, 16($sp) ··· 395 395 .cfi_rel_offset $14, 40 396 396 .cfi_rel_offset $15, 48 397 397 lda $8, 0x3fff 398 - addq $sp, 56, $19 398 + addq $sp, 64, $19 399 399 bic $sp, $8, $8 400 400 jsr $26, do_entUnaUser 401 401 ldq $9, 0($sp) ··· 405 405 ldq $13, 32($sp) 406 406 ldq $14, 40($sp) 407 407 ldq $15, 48($sp) 408 - lda $sp, 56($sp) 408 + lda $sp, 64($sp) 409 409 .cfi_restore $9 410 410 .cfi_restore $10 411 411 .cfi_restore $11 ··· 413 413 .cfi_restore $13 414 414 .cfi_restore $14 415 415 .cfi_restore $15 416 - .cfi_adjust_cfa_offset -56 416 + .cfi_adjust_cfa_offset -64 417 417 br ret_from_sys_call 418 418 CFI_END_OSF_FRAME entUna 419 419
+1 -1
arch/alpha/kernel/traps.c
··· 649 649 static int unauser_reg_offsets[32] = { 650 650 R(r0), R(r1), R(r2), R(r3), R(r4), R(r5), R(r6), R(r7), R(r8), 651 651 /* r9 ... r15 are stored in front of regs. */ 652 - -56, -48, -40, -32, -24, -16, -8, 652 + -64, -56, -48, -40, -32, -24, -16, /* padding at -8 */ 653 653 R(r16), R(r17), R(r18), 654 654 R(r19), R(r20), R(r21), R(r22), R(r23), R(r24), R(r25), R(r26), 655 655 R(r27), R(r28), R(gp),
+2 -2
arch/alpha/mm/fault.c
··· 78 78 79 79 /* Macro for exception fixup code to access integer registers. */ 80 80 #define dpf_reg(r) \ 81 - (((unsigned long *)regs)[(r) <= 8 ? (r) : (r) <= 15 ? (r)-16 : \ 82 - (r) <= 18 ? (r)+10 : (r)-10]) 81 + (((unsigned long *)regs)[(r) <= 8 ? (r) : (r) <= 15 ? (r)-17 : \ 82 + (r) <= 18 ? (r)+11 : (r)-10]) 83 83 84 84 asmlinkage void 85 85 do_page_fault(unsigned long address, unsigned long mmcsr,