Module Name:    src
Committed By:   rin
Date:           Mon Nov  8 23:57:23 UTC 2021

Modified Files:
        src/sys/arch/arm/sa11x0: sa11x0_irq.S

Log Message:
irq_entry(): Do not clobber fp (= r11), in order not to confuse DDB.

Use r10 instead; no need to preserve saipic_base, previous content of
r10, throughout this function, except for the case of INTR_DEBUG.

For INTR_DEBUG, load saipic_base to scratch register every time it
becomes necessary. This is no performance penalty compared with
subsequent printf() calls.

XXX
Rewrite this function by C. There seems no particular reason to
use assembler, and no major performance regression is expected.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/arm/sa11x0/sa11x0_irq.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/sa11x0/sa11x0_irq.S
diff -u src/sys/arch/arm/sa11x0/sa11x0_irq.S:1.20 src/sys/arch/arm/sa11x0/sa11x0_irq.S:1.21
--- src/sys/arch/arm/sa11x0/sa11x0_irq.S:1.20	Sat Nov 21 19:59:10 2020
+++ src/sys/arch/arm/sa11x0/sa11x0_irq.S	Mon Nov  8 23:57:23 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sa11x0_irq.S,v 1.20 2020/11/21 19:59:10 skrll Exp $	*/
+/*	$NetBSD: sa11x0_irq.S,v 1.21 2021/11/08 23:57:23 rin Exp $	*/
 
 /*
  * Copyright (c) 1998 Mark Brinicombe.
@@ -78,8 +78,7 @@ AST_ALIGNMENT_FAULT_LOCALS
  *  r7	- pspr mode
  *  r8  - Current IRQ requests.
  *  r9  - Used to count through possible IRQ bits.
- *  r10 - Base address of SAIP
- *  r11 - Pointer to handler pointer list
+ *  r10 - Pointer to handler pointer list
  */
 
 ASENTRY_NP(irq_entry)
@@ -90,13 +89,14 @@ ASENTRY_NP(irq_entry)
 
 	/* Load r8 with the SAIPIC interrupt requests */
 
-	ldr	r10, _C_LABEL(saipic_base)
-	ldr	r8, [r10, #(SAIPIC_IP)]	/* Load IRQ pending register */
+	ldr	r8, _C_LABEL(saipic_base)
+	ldr	r8, [r8, #(SAIPIC_IP)]	/* Load IRQ pending register */
 
 #ifdef INTR_DEBUG
-	ldr	r2, [r10, #(SAIPIC_MR)]
 	adr	r0, Ldbg_str
 	mov	r1, r8
+	ldr	r2, _C_LABEL(saipic_base)
+	ldr	r2, [r2, #(SAIPIC_MR)]
 	bl	_C_LABEL(printf)
 #endif
 	/*
@@ -124,17 +124,17 @@ ASENTRY_NP(irq_entry)
 	 */
 
 	mov	r9, #(NIPL - 1)
-	ldr	r11, Lspl_masks
+	ldr	r10, Lspl_masks
 
 Lfind_highest_ipl:
-	ldr	r2, [r11, r9, lsl #2]
+	ldr	r2, [r10, r9, lsl #2]
 	tst	r8, r2
 	subeq	r9, r9, #1
 	beq	Lfind_highest_ipl
 
 	/* r9 = SPL level of highest priority interrupt */
 	add	r9, r9, #1
-	ldr	r2, [r11, r9, lsl #2]
+	ldr	r2, [r10, r9, lsl #2]
 
 	ldr	r1, [r4, #CI_CPL]
 	str	r9, [r4, #CI_CPL]
@@ -155,7 +155,7 @@ Lfind_highest_ipl:
 	bic	r0, r0, #I32_bit
 	msr	cpsr_all, r0
 
-	ldr	r11, Lirqhandlers
+	ldr	r10, Lirqhandlers
         mov	r9, #0x00000001
 
 irqloop:
@@ -163,7 +163,7 @@ irqloop:
 	tst	r8, r9			/* Is a bit set ? */
 	beq	nextirq			/* No ? try next bit */
 
-	ldr	r6, [r11]		/* Get address of first handler structure */
+	ldr	r6, [r10]		/* Get address of first handler structure */
 
 	teq	r6, #0x00000000		/* Do we have a handler */
 	moveq	r0, r8			/* IRQ requests as arg 0 */
@@ -219,7 +219,7 @@ irqchainloop:
 
 irqdone:
 nextirq:
-	add	r11, r11, #0x00000004	/* update pointer to handlers */
+	add	r10, r10, #0x00000004	/* update pointer to handlers */
 	mov	r9, r9, lsl #1		/* move on to next bit */
 	teq	r9, #(1 << 31)		/* done the last bit ? */
 	bne	irqloop			/* no - loop back. */
@@ -238,7 +238,8 @@ nextirq:
 #ifdef INTR_DEBUG
 	adr	r0, Ldbg_str
 	mov	r1, #3
-	ldr	r2, [r10, #(SAIPIC_MR)]
+	ldr	r2, _C_LABEL(saipic_base)
+	ldr	r2, [r2, #(SAIPIC_MR)]
 	bl	_C_LABEL(printf)
 #endif
 

Reply via email to