On Sat, Jul 23, 2022 at 08:14:32PM -0500, Scott Cheloha wrote:
> 
> [...]
> 
> I don't have a powerpc64 machine, so this is untested.  [...]

gkoehler@ has pointed out two dumb typos in the prior patch.  My bad.

Here is a corrected patch that, according to gkoehler@, actually
compiles.

Index: include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/powerpc64/include/cpu.h,v
retrieving revision 1.31
diff -u -p -r1.31 cpu.h
--- include/cpu.h       6 Jul 2021 09:34:07 -0000       1.31
+++ include/cpu.h       25 Jul 2022 00:30:33 -0000
@@ -74,9 +74,9 @@ struct cpu_info {
        uint64_t        ci_lasttb;
        uint64_t        ci_nexttimerevent;
        uint64_t        ci_nextstatevent;
-       int             ci_statspending;
        
        volatile int    ci_cpl;
+       volatile int    ci_dec_deferred;
        uint32_t        ci_ipending;
        uint32_t        ci_idepth;
 #ifdef DIAGNOSTIC
Index: powerpc64/clock.c
===================================================================
RCS file: /cvs/src/sys/arch/powerpc64/powerpc64/clock.c,v
retrieving revision 1.3
diff -u -p -r1.3 clock.c
--- powerpc64/clock.c   23 Feb 2021 04:44:31 -0000      1.3
+++ powerpc64/clock.c   25 Jul 2022 00:30:33 -0000
@@ -130,30 +130,23 @@ decr_intr(struct trapframe *frame)
        mtdec(nextevent - tb);
        mtdec(nextevent - mftb());
 
-       if (ci->ci_cpl >= IPL_CLOCK) {
-               ci->ci_statspending += nstats;
-       } else {
-               nstats += ci->ci_statspending;
-               ci->ci_statspending = 0;
+       s = splclock();
+       intr_enable();
 
-               s = splclock();
-               intr_enable();
-
-               /*
-                * Do standard timer interrupt stuff.
-                */
-               while (ci->ci_lasttb < prevtb) {
-                       ci->ci_lasttb += tick_increment;
-                       clock_count.ec_count++;
-                       hardclock((struct clockframe *)frame);
-               }
+       /*
+        * Do standard timer interrupt stuff.
+        */
+       while (ci->ci_lasttb < prevtb) {
+               ci->ci_lasttb += tick_increment;
+               clock_count.ec_count++;
+               hardclock((struct clockframe *)frame);
+       }
 
-               while (nstats-- > 0)
-                       statclock((struct clockframe *)frame);
+       while (nstats-- > 0)
+               statclock((struct clockframe *)frame);
 
-               intr_disable();
-               splx(s);
-       }
+       intr_disable();
+       splx(s);
 }
 
 void
Index: powerpc64/intr.c
===================================================================
RCS file: /cvs/src/sys/arch/powerpc64/powerpc64/intr.c,v
retrieving revision 1.9
diff -u -p -r1.9 intr.c
--- powerpc64/intr.c    26 Sep 2020 17:56:54 -0000      1.9
+++ powerpc64/intr.c    25 Jul 2022 00:30:33 -0000
@@ -139,6 +139,11 @@ splx(int new)
 {
        struct cpu_info *ci = curcpu();
 
+       if (ci->ci_dec_deferred && new < IPL_CLOCK) {
+               mtdec(0);
+               mtdec(UINT32_MAX);      /* raise DEC exception */
+       }
+
        if (ci->ci_ipending & intr_smask[new])
                intr_do_pending(new);
 
Index: powerpc64/trap.c
===================================================================
RCS file: /cvs/src/sys/arch/powerpc64/powerpc64/trap.c,v
retrieving revision 1.51
diff -u -p -r1.51 trap.c
--- powerpc64/trap.c    11 May 2021 18:21:12 -0000      1.51
+++ powerpc64/trap.c    25 Jul 2022 00:30:33 -0000
@@ -65,9 +65,15 @@ trap(struct trapframe *frame)
        switch (type) {
        case EXC_DECR:
                uvmexp.intrs++;
-               ci->ci_idepth++;
-               decr_intr(frame);
-               ci->ci_idepth--;
+               if (ci->ci_cpl < IPL_CLOCK) {
+                       ci->ci_dec_deferred = 0;
+                       ci->ci_idepth++;
+                       decr_intr(frame);
+                       ci->ci_idepth--;
+               } else {
+                       ci->ci_dec_deferred = 1;
+                       mtdec(UINT32_MAX >> 1); /* clear DEC exception */
+               }
                return;
        case EXC_EXI:
                uvmexp.intrs++;

Reply via email to