mirror of https://gitee.com/openkylin/linux.git
[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: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
b620cc2cd8
commit
d70ddac1bf
|
@ -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 {
|
||||||
|
|
||||||
|
|
||||||
/* 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,
|
||||||
printk("Forwarding unaligned exception at %lx (%lx)\n",
|
printk("Forwarding unaligned exception at %lx (%lx)\n",
|
||||||
pc, newpc);
|
pc, newpc);
|
||||||
|
|
||||||
(®s)->pc = newpc;
|
regs->pc = newpc;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
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, ®s+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 *)(®s+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");
|
||||||
|
|
Loading…
Reference in New Issue