Skip to content

Commit 3b35a17

Browse files
Ivan Kokshayskymattst88
authored andcommitted
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>
1 parent 0a0f736 commit 3b35a17

File tree

3 files changed

+13
-13
lines changed

3 files changed

+13
-13
lines changed

arch/alpha/kernel/entry.S

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,8 @@ CFI_END_OSF_FRAME entArith
194194
CFI_START_OSF_FRAME entMM
195195
SAVE_ALL
196196
/* 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
199199
stq $9, 0($sp)
200200
stq $10, 8($sp)
201201
stq $11, 16($sp)
@@ -210,7 +210,7 @@ CFI_START_OSF_FRAME entMM
210210
.cfi_rel_offset $13, 32
211211
.cfi_rel_offset $14, 40
212212
.cfi_rel_offset $15, 48
213-
addq $sp, 56, $19
213+
addq $sp, 64, $19
214214
/* handle the fault */
215215
lda $8, 0x3fff
216216
bic $sp, $8, $8
@@ -223,15 +223,15 @@ CFI_START_OSF_FRAME entMM
223223
ldq $13, 32($sp)
224224
ldq $14, 40($sp)
225225
ldq $15, 48($sp)
226-
addq $sp, 56, $sp
226+
addq $sp, 64, $sp
227227
.cfi_restore $9
228228
.cfi_restore $10
229229
.cfi_restore $11
230230
.cfi_restore $12
231231
.cfi_restore $13
232232
.cfi_restore $14
233233
.cfi_restore $15
234-
.cfi_adjust_cfa_offset -56
234+
.cfi_adjust_cfa_offset -64
235235
/* finish up the syscall as normal. */
236236
br ret_from_sys_call
237237
CFI_END_OSF_FRAME entMM
@@ -378,8 +378,8 @@ entUnaUser:
378378
.cfi_restore $0
379379
.cfi_adjust_cfa_offset -256
380380
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
383383
stq $9, 0($sp)
384384
stq $10, 8($sp)
385385
stq $11, 16($sp)
@@ -395,7 +395,7 @@ entUnaUser:
395395
.cfi_rel_offset $14, 40
396396
.cfi_rel_offset $15, 48
397397
lda $8, 0x3fff
398-
addq $sp, 56, $19
398+
addq $sp, 64, $19
399399
bic $sp, $8, $8
400400
jsr $26, do_entUnaUser
401401
ldq $9, 0($sp)
@@ -405,15 +405,15 @@ entUnaUser:
405405
ldq $13, 32($sp)
406406
ldq $14, 40($sp)
407407
ldq $15, 48($sp)
408-
lda $sp, 56($sp)
408+
lda $sp, 64($sp)
409409
.cfi_restore $9
410410
.cfi_restore $10
411411
.cfi_restore $11
412412
.cfi_restore $12
413413
.cfi_restore $13
414414
.cfi_restore $14
415415
.cfi_restore $15
416-
.cfi_adjust_cfa_offset -56
416+
.cfi_adjust_cfa_offset -64
417417
br ret_from_sys_call
418418
CFI_END_OSF_FRAME entUna
419419

arch/alpha/kernel/traps.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ s_reg_to_mem (unsigned long s_reg)
649649
static int unauser_reg_offsets[32] = {
650650
R(r0), R(r1), R(r2), R(r3), R(r4), R(r5), R(r6), R(r7), R(r8),
651651
/* 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 */
653653
R(r16), R(r17), R(r18),
654654
R(r19), R(r20), R(r21), R(r22), R(r23), R(r24), R(r25), R(r26),
655655
R(r27), R(r28), R(gp),

arch/alpha/mm/fault.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ __load_new_mm_context(struct mm_struct *next_mm)
7878

7979
/* Macro for exception fixup code to access integer registers. */
8080
#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])
8383

8484
asmlinkage void
8585
do_page_fault(unsigned long address, unsigned long mmcsr,

0 commit comments

Comments
 (0)