[OpenBIOS] r566 - trunk/openbios-devel/arch/sparc64

svn at openbios.org svn at openbios.org
Sat Aug 22 08:04:03 CEST 2009


Author: blueswirl
Date: 2009-08-22 08:04:00 +0200 (Sat, 22 Aug 2009)
New Revision: 566

Modified:
   trunk/openbios-devel/arch/sparc64/vectors.S
Log:
v1 Preliminary support for softint handler with trap to bug on other irqs

v0->v1: removed extra instructions

Signed-off-by: igor.v.kovalenko at gmail.com
Signed-off-by: Blue Swirl <blauwirbel at gmail.com>

Modified: trunk/openbios-devel/arch/sparc64/vectors.S
===================================================================
--- trunk/openbios-devel/arch/sparc64/vectors.S	2009-08-22 06:03:40 UTC (rev 565)
+++ trunk/openbios-devel/arch/sparc64/vectors.S	2009-08-22 06:04:00 UTC (rev 566)
@@ -29,11 +29,13 @@
 #define ASI_BP ASI_PHYS_BYPASS_EC_E
 #define PROM_ADDR 0x1fff0000000
 #define SER_ADDR 0x1fe020003f8
+#define TICK_INT_DIS 0x8000000000000000
+#define TICK_INTERVAL 10*1000*1000
 
         .section ".text.vectors", "ax"
         .align 16384
 /* Sparc64 trap table */
-        .globl trap_table, __divide_error
+        .globl trap_table, __divide_error, softint_irq, softint_irq_tl1
         .register %g2, #scratch
         .register %g3, #scratch
         .register %g6, #scratch
@@ -96,7 +98,7 @@
         nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
 
 #define TRAP_IRQ(routine, level)                        \
-                ba routine; nop; nop; nop; nop; nop; nop; nop;
+                ba routine;  mov level, %g1; nop; nop; nop; nop; nop; nop;
 #define BTRAP(lvl)                                      \
                  ba bug; mov lvl, %g1; nop; nop; nop; nop; nop; nop;
 #define BTRAPTL1(lvl) BTRAP(lvl)
@@ -119,7 +121,6 @@
 		CLEAN_WINDOW ! 24-27
 		BTRAPS(0x28)
 		BTRAPS(0x30) BTRAPS(0x38)
-#if 0
 		BTRAP(0x40) BTRAP(0x41) BTRAP(0x42) BTRAP(0x43)
 tl0_irq4:	TRAP_IRQ(handler_irq, 4)
 tl0_irq5:	TRAP_IRQ(handler_irq, 5)  TRAP_IRQ(handler_irq, 6)
@@ -127,11 +128,8 @@
 tl0_irq9:	TRAP_IRQ(handler_irq, 9)  TRAP_IRQ(handler_irq, 10)
 tl0_irq11:	TRAP_IRQ(handler_irq, 11) TRAP_IRQ(handler_irq, 12)
 tl0_irq13:	TRAP_IRQ(handler_irq, 13)
-tl0_irq14:	TRAP_IRQ(handler_irq, 14)
+tl0_irq14:	TRAP_IRQ(softint_irq, 14)
 tl0_irq15:	TRAP_IRQ(handler_irq, 15)
-#else
-		BTRAPS(0x40) BTRAPS(0x48)
-#endif
 		BTRAPS(0x50) BTRAPS(0x58)
 		BTRAPS4(0x60)
 		TRAP_HANDLER(reload_IMMU_tlb)    ! 0x64 : instruction_access_MMU_miss
@@ -196,6 +194,9 @@
 #undef BTRAPS
 #define BTRAPS(x) BTRAPTL1(x) BTRAPTL1(x+1) BTRAPTL1(x+2) BTRAPTL1(x+3) BTRAPTL1(x+4) BTRAPTL1(x+5) BTRAPTL1(x+6) BTRAPTL1(x+7)
 
+#define SKIP_IRQ(routine, level) \
+                retry;  nop; nop; nop; nop; nop; nop; nop;
+
 sparc64_ttable_tl1:
 		BTRAPS(0x00) BTRAPS(0x08)
 		BTRAPS(0x10) BTRAPS(0x18)
@@ -203,7 +204,6 @@
 		CLEAN_WINDOW ! 24-27
 		BTRAPS(0x28)
 		BTRAPS(0x30) BTRAPS(0x38)
-#if 0
 		BTRAPTL1(0x40) BTRAPTL1(0x41) BTRAPTL1(0x42) BTRAPTL1(0x43)
 tl1_irq4:	TRAP_IRQ(handler_irq, 4)
 tl1_irq5:	TRAP_IRQ(handler_irq, 5)  TRAP_IRQ(handler_irq, 6)
@@ -211,11 +211,8 @@
 tl1_irq9:	TRAP_IRQ(handler_irq, 9)  TRAP_IRQ(handler_irq, 10)
 tl1_irq11:	TRAP_IRQ(handler_irq, 11) TRAP_IRQ(handler_irq, 12)
 tl1_irq13:	TRAP_IRQ(handler_irq, 13)
-tl1_irq14:	TRAP_IRQ(handler_irq, 14)
+tl1_irq14:	SKIP_IRQ(softint_irq, 14)
 tl1_irq15:	TRAP_IRQ(handler_irq, 15)
-#else
-		BTRAPS(0x40) BTRAPS(0x48)
-#endif
 		BTRAPS(0x50) BTRAPS(0x58)
 		BTRAPS4(0x60)
 		TRAP_HANDLER(reload_IMMU_tlb)    ! 0x64 : instruction_access_MMU_miss
@@ -400,6 +397,28 @@
 
         retry
 
+softint_irq_tl1:
+softint_irq:
+        mov     1, %g2
+        /* clear tick interrupt */
+        wr      %g2, 0x0, %clear_softint
+        sll     %g2, %g1, %g2
+        sra     %g2, 0, %g2
+        /* clear softint interrupt */
+        wr      %g2, 0x0, %clear_softint
+
+        setx    TICK_INT_DIS, %g2, %g1
+        rd      %tick, %g2
+        and     %g1, %g2, %g1
+        brnz,pn %g1, tick_compare_disabled
+         nop
+        set     TICK_INTERVAL, %g1
+        add     %g1, %g2, %g1
+        wr      %g1, 0, %tick_cmpr
+tick_compare_disabled:
+        retry
+
+handler_irq:
 __divide_error:
 bug:
         /* Dump the exception and its context */




More information about the OpenBIOS mailing list