Module Name:    src
Committed By:   skrll
Date:           Sat Nov 21 19:57:35 UTC 2020

Modified Files:
        src/sys/arch/arm/ofw: ofw_irq.S

Log Message:
Adjust egister usage so that r4 and r5 are preserved as cur{cpu,lwp}
respectively as required by the change to make ASTs operate per-LWP
rather than per-CPU.  DO_AST_AND_RESTORE_ALIGNMENT_FAULTS expects this.

Remove the call to dosoftints while I'm here as it's dont in DO_AST...

XXX untested


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/ofw/ofw_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/ofw/ofw_irq.S
diff -u src/sys/arch/arm/ofw/ofw_irq.S:1.16 src/sys/arch/arm/ofw/ofw_irq.S:1.17
--- src/sys/arch/arm/ofw/ofw_irq.S:1.16	Sat Nov 21 09:36:27 2020
+++ src/sys/arch/arm/ofw/ofw_irq.S	Sat Nov 21 19:57:35 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ofw_irq.S,v 1.16 2020/11/21 09:36:27 skrll Exp $	*/
+/*	$NetBSD: ofw_irq.S,v 1.17 2020/11/21 19:57:35 skrll Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -95,12 +95,13 @@ AST_ALIGNMENT_FAULT_LOCALS
  * Regsister usage
  *
  *  r4	- Address of cpu_info (on entry)
- *  r5  - Pointer to handler pointer list
+ *  r5  - Address of curlwp
  *  r6  - Address of current handler
  *  r7  - pspr mode (must be preserved)
  *  r8  - Current IRQ requests.
  *  r9  - Used to count through possible IRQ bits.
  *  r10 - Base address of IOMD
+ *  r11  - Pointer to handler pointer list
  */
 
 ASENTRY_NP(irq_entry)
@@ -188,7 +189,7 @@ ofwtakeint:
 #ifdef EXEC_AOUT
 	ldr	r0, [sp]		/* Fetch SPSR */
 #endif
-	ENABLE_ALIGNMENT_FAULTS
+	ENABLE_ALIGNMENT_FAULTS		/* puts cur{cpu,lwp} in r4/r5 */
 
 	mov	r8, #0x00000001		/* timer interrupt pending! */
 	mov	r8, r8, lsl #IRQ_TIMER0
@@ -224,17 +225,17 @@ ofwtakeint:
 	 */
 
 	mov	r9, #(NIPL - 1)
-	ldr	r5, Lspl_masks
+	ldr	r11, Lspl_masks
 
 Lfind_highest_ipl:
-	ldr	r2, [r5, r9, lsl #2]
+	ldr	r2, [r11, 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, [r5, r9, lsl #2]
+	ldr	r2, [r11, r9, lsl #2]
 	mvn	r2, r2
 	orr	r0, r0, r2
 
@@ -252,7 +253,7 @@ Lfind_highest_ipl:
 	bic	r0, r0, #I32_bit
 	msr	cpsr_all, r0
 
-	ldr	r5, Lirqhandlers
+	ldr	r11, Lirqhandlers
 	mov	r9, #0x00000001
 
 irqloop:
@@ -260,7 +261,7 @@ irqloop:
 	tst	r8, r9			/* Is a bit set ? */
 	beq	nextirq			/* No ? try next bit */
 
-	ldr	r6, [r5]		/* Get address of first handler structure */
+	ldr	r6, [r11]		/* Get address of first handler structure */
 
 	teq	r6, #0x00000000		/* Do we have a handler */
 	moveq	r0, r8			/* IRQ requests as arg 0 */
@@ -301,7 +302,7 @@ irqdone:
 	stmia   r3, {r1-r2}		/* store ev_count */
 
 nextirq:
-	add	r5, r5, #0x00000004	/* update pointer to handlers */
+	add	r11, r11, #0x00000004	/* update pointer to handlers */
 	mov	r9, r9, lsl #1		/* move on to next bit */
 	teq	r9, #(1 << 24)		/* done the last bit ? */
 	bne	irqloop			/* no - loop back. */
@@ -315,8 +316,6 @@ nextirq:
 	str	r2, [r1]
 	bl	_C_LABEL(irq_setmasks)
 
-	bl	_C_LABEL(dosoftints)	/* Handle the soft interrupts */
-
 	/* Kill IRQ's in preparation for exit */
 	mrs     r0, cpsr
 	orr     r0, r0, #(I32_bit)

Reply via email to