Module Name:    src
Committed By:   skrll
Date:           Tue Nov 10 06:58:46 UTC 2020

Modified Files:
        src/sys/arch/riscv/riscv: spl.S

Log Message:
Revamp to the point it builds, but needs more work


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/riscv/riscv/spl.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/riscv/riscv/spl.S
diff -u src/sys/arch/riscv/riscv/spl.S:1.4 src/sys/arch/riscv/riscv/spl.S:1.5
--- src/sys/arch/riscv/riscv/spl.S:1.4	Wed Nov  4 07:09:46 2020
+++ src/sys/arch/riscv/riscv/spl.S	Tue Nov 10 06:58:46 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: spl.S,v 1.4 2020/11/04 07:09:46 skrll Exp $ */
+/* $NetBSD: spl.S,v 1.5 2020/11/10 06:58:46 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -32,41 +32,40 @@
 #include <machine/asm.h>
 #include "assym.h"
 
-__RCSID("$NetBSD: spl.S,v 1.4 2020/11/04 07:09:46 skrll Exp $")
+__RCSID("$NetBSD: spl.S,v 1.5 2020/11/10 06:58:46 skrll Exp $")
 
+#if notyet
 	.data
-	.globl	_C_LABEL(ipl_sr_map)
-	.type	_C_LABEL(ipl_sr_map), @object
+	.globl	_C_LABEL(ipl_si_map)
+	.type	_C_LABEL(ipl_si_map), @object
 	.p2align INT_SCALESHIFT
-_C_LABEL(ipl_sr_map):
-	.word	0			/* IPL_NONE */
-	.word	0			/* IPL_SOFTCLOCK */
-	.word	0			/* IPL_SOFTBIO */
-	.word	0			/* IPL_SOFTNET */
-	.word	0			/* IPL_SOFTSERIAL */
-	.word	SR_IM			/* IPL_VM */
-	.word	SR_IM			/* IPL_SCHED */
-	.word	SR_IM			/* IPL_DDB */
-	.word	SR_IM			/* IPL_HIGH */
+_C_LABEL(ipl_si_map):
+	.word	0					/* IPL_NONE */
+	.word	0					/* IPL_SOFTCLOCK */
+	.word	0					/* IPL_SOFTBIO */
+	.word	0					/* IPL_SOFTNET */
+	.word	0					/* IPL_SOFTSERIAL */
+	.word	SI_EXTERAL				/* IPL_VM */
+	.word	SI_EXTERNAL | SI_TIMER			/* IPL_SCHED */
+	.word	SI_EXTERNAL | SI_SOFTWARE | SI_TIMER	/* IPL_HIGH */
+#endif
 
 ENTRY_NP(splx)
 	// a0 = new lower IPL
+	csrci	sstatus, SR_SIE		// disable interrupts
 	PTR_L	a3, L_CPU(tp)		// get curcpu()
 	INT_L	t0, CI_CPL(a3)		// get current IPL
 	beq	a0, t0, 2f
-.L_splset:
+
 	// a0 = new ipl
-	PTR_LA	t0, ipl_sr_map
-	slli	a1, a0, 2		// make integer index
-	add	t0, t0, a1		// index into table
-	INT_L	t0, (t0)		// get new mask bits to clear
-	li	t2, SR_IM		// get mask bits
-	xor	t0, t0, t2		// invert mask bits
-	csrc	sstatus, t2		// block everything
 	INT_S	a0, CI_CPL(a3)		// change IPL
 	beqz	t0, 2f
-	csrs	sstatus, t0		// unmask appropriate bits
-2:	INT_L	t4, CI_SOFTINTS(a3)	// get softint mask
+
+	//call riscv_do_pending_irqs
+2:
+	csrsi	sstatus, SR_SIE		// enable interrupts
+
+	INT_L	t4, CI_SOFTINTS(a3)	// get softint mask
 	srl	t4, t4, a0		// see what softints are pending.
 	beqz	t4, 3f			// none, just return
 	// there are softints that need to be delivered, so instead of
@@ -74,79 +73,82 @@ ENTRY_NP(splx)
 	// will do a tailcall back to splx and then we can return (if there
 	// are no pending softints).
 	tail	_C_LABEL(softint_deliver)
-3:	ret				// return (or do softints)
+3:
+	ret				// return (or do softints)
 END(splx)
 
 #if IPL_NONE != 0
 #error IPL_NONE is not 0
 #endif
 ENTRY_NP(spl0)
+	csrci	sstatus, SR_SIE		// disable interrupts
 	PTR_L	a3, L_CPU(tp)		// get curcpu()
-	li	t0, SR_IM|SR_EI		// load SR_IM|EI
-	csrci	sstatus, SR_EI		// disable interrupts
 	INT_S	zero, CI_CPL(a3)	// set current IPL to IPL_NONE
-	csrs	sstatus, t0		// unmask all & enable interrupts
+
+	//call riscv_do_pending_irqs
+
+	csrsi	sstatus, SR_SIE		// enable interrupts
 	// spl0() is only called rarely so the overhead of always calling
 	// softint_deliver is minimal.
 	tail	_C_LABEL(softint_deliver)
 END(spl0)
 
 ENTRY_NP(splhigh)
+	csrci	sstatus, SR_SIE		// disable interrupts
 	PTR_L	a3, L_CPU(tp)		// get curcpu()
-	INT_L	a0, CI_CPL(a3)		// get current IPL
-	li	t1, SR_IM		// load SR_IM
+	INT_L	a0, CI_CPL(a3)		// get current IPL for return value
 	li	t0, IPL_HIGH		//
-	csrc	sstatus, t1		// mask all interrupts
 	INT_S	t0, CI_CPL(a3)		// set it to IPL_HIGH
+					// interrupts remain disabled???
 	ret
 END(splhigh)
 
+
 ENTRY_NP(splsoftclock)
-	li	a0, IPL_SOFTCLOCK
-	PTR_L	a3, L_CPU(tp)		// get curcpu()
-	j	.L_splset
+	li	t0, IPL_SOFTCLOCK
+	j	_splraise
 END(splsoftclock)
 
 ENTRY_NP(splsoftbio)
-	li	a0, IPL_SOFTBIO
-	PTR_L	a3, L_CPU(tp)		// get curcpu()
-	j	.L_splset
+	li	t0, IPL_SOFTBIO
+	j	_splraise
 END(splsoftbio)
 
 ENTRY_NP(splsoftnet)
-	li	a0, IPL_SOFTNET
-	PTR_L	a3, L_CPU(tp)		// get curcpu()
-	j	.L_splset
+	li	t0, IPL_SOFTNET
+	j	_splraise
 END(splsoftnet)
 
 ENTRY_NP(splsoftserial)
-	li	a0, IPL_SOFTSERIAL
-	PTR_L	a3, L_CPU(tp)		// get curcpu()
-	j	.L_splset
+	li	t0, IPL_SOFTSERIAL
+	j	_splraise
 END(splsoftserial)
 
 ENTRY_NP(splvm)
-	li	a0, IPL_VM
-	PTR_L	a3, L_CPU(tp)		// get curcpu()
-	j	.L_splset
+	li	t0, IPL_VM
+	j	_splraise
 END(splvm)
 
 ENTRY_NP(splsched)
-	li	a0, IPL_SCHED
-	PTR_L	a3, L_CPU(tp)		// get curcpu()
-	j	.L_splset
+	li	t0, IPL_SCHED
+	j	_splraise
 END(splsched)
 
 ENTRY_NP(splddb)
-	li	a0, IPL_DDB
-	PTR_L	a3, L_CPU(tp)		// get curcpu()
-	j	.L_splset
+	li	t0, IPL_DDB
+	j	_splraise
 END(splddb)
 
 ENTRY_NP(splraise)
+	// a0 = new higher IPL
 	mv	t0, a0			// need a0 for return value
+_splraise:
+	csrci	sstatus, SR_SIE		// disable interrupts
 	PTR_L	a3, L_CPU(tp)		// get curcpu()
 	INT_L	a0, CI_CPL(a3)		// get current IPL
-	bgt	t0, a0, .L_splset	// set if new IPL is higher
+	bge	a0, t0, 2f		// already at same or higher?
+	INT_S	t0, CI_CPL(a3)		// change IPL
+2:
+	csrsi	sstatus, SR_SIE		// enable interrupts
 	ret
 END(splraise)

Reply via email to