Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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)
+7 −8
Original line number Original line Diff line number Diff line
@@ -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);


		(&regs)->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, &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");