Oh I see. Thanks for the help.
Looks like the check should be spl < IPL_SCHED instead of spl != IPL_SCHED.
Seems it's just that the check is bad after all.
Index: arch/mips/mips/locore.S
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/mips/locore.S,v
retrieving revision 1.226
diff -u -r1.226 locore.S
--- arch/mips/mips/locore.S 26 Sep 2020 08:21:10 -0000 1.226
+++ arch/mips/mips/locore.S 22 Feb 2021 09:49:27 -0000
@@ -224,7 +224,7 @@
PTR_L v0, L_CPU(MIPS_CURLWP)
INT_L v1, CPU_INFO_CPL(v0)
#if __mips >= 32
- tnei v1, IPL_SCHED
+ tltiu v1, IPL_SCHED
#else
li v0, IPL_SCHED
10: bne v0, v1, 10b
On Sun, Feb 21, 2021 at 11:22 PM Nick Hudson <[email protected]> wrote:
> On 22/02/2021 04:15, Alan Fisher wrote:
> > Hello,
> >
> > I've been trying to get the evbmips port working on a new chip recently,
> > and in the process I've tried building the kernel with PARANOIA enabled.
> > This has resulted in a crash on startup, and I am wondering if it is
> > surfacing a bug. Here is what's happening:
> >
> > Some code under an #ifdef PARANOIA in cpu_switchto checks whether the
> > IPL is IPL_SCHED, and if not, throws a trap. According to the manpage
> > for cpu_switchto(9), the current IPL level being IPL_SCHED is a
> > precondition for cpu_switchto(), so this check seems to make sense. The
> > callstack looks like this:
> >
> > cpu_switchto - this causes a trap when the check fails - manpage says
> > IPL must be IPL_SCHED
> > mi_switch - manpage says IPL must be IPL_SCHED
> > yield - manpage doesn't say anything about IPL_SCHED, and IPL is not
> > changed in this routine
>
>
> 276 yield(void)
> 277 {
> 278 struct lwp *l = curlwp;
> 279
> 280 KERNEL_UNLOCK_ALL(l, &l->l_biglocks);
> 281 lwp_lock(l);
>
> lwp_lock will raise the IPL to IPL_SCHED. spc_{lock,mutex} are used by
> lwp_lock (maybe others)
> HTH,
>
> Nick
>