Hi.  I have a question about splx, below.

On Thu, 23 Jun 2022 21:58:48 -0500
Scott Cheloha <scottchel...@gmail.com> wrote:

> My machine uses openpic(4).  I would appreciate tests on a
> non-openpic(4) Mac, though all tests are appreciated.

We only run on New World Macs, and the only ones without openpic(4)
might be the oldest models of iMac G3 from 1998; these would attach
macintr0 and not openpic0 in dmesg.  I don't know anyone who might
have such an iMac.  The iMac model PowerMac2,1 from 1999 (with the
(slot-loading cd drive) does have openpic(4).

> Index: macppc/dev/openpic.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/macppc/dev/openpic.c,v
> retrieving revision 1.89
> diff -u -p -r1.89 openpic.c
> --- macppc/dev/openpic.c      21 Feb 2022 10:38:50 -0000      1.89
> +++ macppc/dev/openpic.c      24 Jun 2022 02:49:59 -0000
> @@ -382,6 +382,10 @@ openpic_splx(int newcpl)
>  
>       intr = ppc_intr_disable();
>       openpic_setipl(newcpl);
> +     if (ci->ci_dec_deferred && newcpl < IPL_CLOCK) {
> +             ppc_mtdec(0);
> +             ppc_mtdec(UINT32_MAX);  /* raise DEC exception */
> +     }
>       if (newcpl < IPL_SOFTTTY && (ci->ci_ipending & ppc_smask[newcpl])) {
>               s = splsofttty();
>               dosoftint(newcpl);

The 2nd mtdec tries to raise dec_intr by changing bit 1 << 31 of the
decrementer register from 0 to 1.  I suspect if the decrementer can
also decrement itself from 0 to UINT32_MAX, and raise dec_intr early,
before we reach the 2nd mtdec.  This would be bad, because this
ppc_mtdec(UINT32_MAX) would override the ppc_mtdec(nextevent - tb) in
dec_intr and lose the next scheduled clock interrupt.

Testing might miss this problem.  For example, a randomly reordered
kernel might place the 2 mtdec instructions in different pages, which
has a small chance of a page fault on a Mac G5.

Would this be better?

        ppc_mtdec(1 >> UINT32_MAX);
        ppc_mtdec(UINT32_MAX);

Reply via email to