Browse Source

[SPARC64]: Fix tl1 trap state capture/dump on SUN4V.

No trap levels above 2 in privileged mode on SUN4V.

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 19 years ago
parent
commit
3d6395cb77
2 changed files with 9 additions and 1 deletions
  1. 6 0
      arch/sparc64/kernel/etrap.S
  2. 3 1
      arch/sparc64/kernel/traps.c

+ 6 - 0
arch/sparc64/kernel/etrap.S

@@ -188,6 +188,11 @@ etraptl1:	/* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself.
 		rdpr	%tt, %g3
 		stx	%g3, [%g2 + STACK_BIAS + 0x38]
 
+		sethi	%hi(is_sun4v), %g3
+		lduw	[%g3 + %lo(is_sun4v)], %g3
+		brnz,pn	%g3, finish_tl1_capture
+		 nop
+
 		wrpr	%g0, 3, %tl
 		rdpr	%tstate, %g3
 		stx	%g3, [%g2 + STACK_BIAS + 0x40]
@@ -210,6 +215,7 @@ etraptl1:	/* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself.
 
 		stx	%g1, [%g2 + STACK_BIAS + 0x80]
 
+finish_tl1_capture:
 		wrpr	%g0, 1, %tl
 661:		nop
 		.section .sun4v_1insn_patch, "ax"

+ 3 - 1
arch/sparc64/kernel/traps.c

@@ -73,10 +73,12 @@ struct tl1_traplog {
 
 static void dump_tl1_traplog(struct tl1_traplog *p)
 {
-	int i;
+	int i, limit;
 
 	printk("TRAPLOG: Error at trap level 0x%lx, dumping track stack.\n",
 	       p->tl);
+
+	limit = (tlb_type == hypervisor) ? 2 : 4;
 	for (i = 0; i < 4; i++) {
 		printk(KERN_CRIT
 		       "TRAPLOG: Trap level %d TSTATE[%016lx] TPC[%016lx] "