Commit d70ddac1 authored by Richard Henderson's avatar Richard Henderson Committed by Linus Torvalds

[PATCH] alpha: fix kernel alignment traps

Pass in the pointer to the on-stack registers rather than using them
directly as the arguments.

Ivan noticed that I missed a spot when purging the registers as first
stack parameter idiom.
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b620cc2c
...@@ -196,6 +196,7 @@ entUna: ...@@ -196,6 +196,7 @@ entUna:
stq $26, 208($sp) stq $26, 208($sp)
stq $27, 216($sp) stq $27, 216($sp)
stq $28, 224($sp) stq $28, 224($sp)
mov $sp, $19
stq $gp, 232($sp) stq $gp, 232($sp)
lda $8, 0x3fff lda $8, 0x3fff
stq $31, 248($sp) stq $31, 248($sp)
......
...@@ -446,16 +446,15 @@ struct unaligned_stat { ...@@ -446,16 +446,15 @@ struct unaligned_stat {
/* Macro for exception fixup code to access integer registers. */ /* Macro for exception fixup code to access integer registers. */
#define una_reg(r) (regs.regs[(r) >= 16 && (r) <= 18 ? (r)+19 : (r)]) #define una_reg(r) (regs->regs[(r) >= 16 && (r) <= 18 ? (r)+19 : (r)])
asmlinkage void asmlinkage void
do_entUna(void * va, unsigned long opcode, unsigned long reg, do_entUna(void * va, unsigned long opcode, unsigned long reg,
unsigned long a3, unsigned long a4, unsigned long a5, struct allregs *regs)
struct allregs regs)
{ {
long error, tmp1, tmp2, tmp3, tmp4; long error, tmp1, tmp2, tmp3, tmp4;
unsigned long pc = regs.pc - 4; unsigned long pc = regs->pc - 4;
const struct exception_table_entry *fixup; const struct exception_table_entry *fixup;
unaligned[0].count++; unaligned[0].count++;
...@@ -636,7 +635,7 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg, ...@@ -636,7 +635,7 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
printk("Forwarding unaligned exception at %lx (%lx)\n", printk("Forwarding unaligned exception at %lx (%lx)\n",
pc, newpc); pc, newpc);
(&regs)->pc = newpc; regs->pc = newpc;
return; return;
} }
...@@ -650,7 +649,7 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg, ...@@ -650,7 +649,7 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
current->comm, current->pid); current->comm, current->pid);
printk("pc = [<%016lx>] ra = [<%016lx>] ps = %04lx\n", printk("pc = [<%016lx>] ra = [<%016lx>] ps = %04lx\n",
pc, una_reg(26), regs.ps); pc, una_reg(26), regs->ps);
printk("r0 = %016lx r1 = %016lx r2 = %016lx\n", printk("r0 = %016lx r1 = %016lx r2 = %016lx\n",
una_reg(0), una_reg(1), una_reg(2)); una_reg(0), una_reg(1), una_reg(2));
printk("r3 = %016lx r4 = %016lx r5 = %016lx\n", printk("r3 = %016lx r4 = %016lx r5 = %016lx\n",
...@@ -670,10 +669,10 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg, ...@@ -670,10 +669,10 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
una_reg(22), una_reg(23), una_reg(24)); una_reg(22), una_reg(23), una_reg(24));
printk("r25= %016lx r27= %016lx r28= %016lx\n", printk("r25= %016lx r27= %016lx r28= %016lx\n",
una_reg(25), una_reg(27), una_reg(28)); una_reg(25), una_reg(27), una_reg(28));
printk("gp = %016lx sp = %p\n", regs.gp, &regs+1); printk("gp = %016lx sp = %p\n", regs->gp, regs+1);
dik_show_code((unsigned int *)pc); dik_show_code((unsigned int *)pc);
dik_show_trace((unsigned long *)(&regs+1)); dik_show_trace((unsigned long *)(regs+1));
if (test_and_set_thread_flag (TIF_DIE_IF_KERNEL)) { if (test_and_set_thread_flag (TIF_DIE_IF_KERNEL)) {
printk("die_if_kernel recursion detected.\n"); printk("die_if_kernel recursion detected.\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment