On Thu, Jun 23, 2022 at 09:58:48PM -0500, Scott Cheloha wrote:
>
> [...]
>
> Thoughts? Tweaks?
>
> [...]
miod: Any issues?
kettenis: Anything to add? ok?
drahn: Anything to add? ok?
--
It would be nice (but not strictly necessary) to test this on a
machine doing "real work".
Who does the macppc package builds?
Index: macppc/macppc/clock.c
===================================================================
RCS file: /cvs/src/sys/arch/macppc/macppc/clock.c,v
retrieving revision 1.48
diff -u -p -r1.48 clock.c
--- macppc/macppc/clock.c 23 Feb 2021 04:44:30 -0000 1.48
+++ macppc/macppc/clock.c 24 Jun 2022 02:49:58 -0000
@@ -128,6 +128,20 @@ decr_intr(struct clockframe *frame)
return;
/*
+ * We can't actually mask DEC interrupts, i.e. mask MSR(EE),
+ * at or above IPL_CLOCK without masking other essential
+ * interrupts. To simulate masking, we retrigger the DEC
+ * by hand from splx(9) the next time our IPL drops below
+ * IPL_CLOCK.
+ */
+ if (ci->ci_cpl >= IPL_CLOCK) {
+ ci->ci_dec_deferred = 1;
+ ppc_mtdec(UINT32_MAX >> 1); /* clear DEC exception */
+ return;
+ }
+ ci->ci_dec_deferred = 0;
+
+ /*
* Based on the actual time delay since the last decrementer reload,
* we arrange for earlier interrupt next time.
*/
@@ -160,39 +174,35 @@ decr_intr(struct clockframe *frame)
*/
ppc_mtdec(nextevent - tb);
- if (ci->ci_cpl >= IPL_CLOCK) {
- ci->ci_statspending += nstats;
- } else {
- nstats += ci->ci_statspending;
- ci->ci_statspending = 0;
-
- s = splclock();
-
- /*
- * Reenable interrupts
- */
- ppc_intr_enable(1);
-
- /*
- * Do standard timer interrupt stuff.
- */
- while (ci->ci_lasttb < ci->ci_prevtb) {
- /* sync lasttb with hardclock */
- ci->ci_lasttb += ticks_per_intr;
- clk_count.ec_count++;
- hardclock(frame);
- }
-
- while (nstats-- > 0)
- statclock(frame);
-
- splx(s);
- (void) ppc_intr_disable();
-
- /* if a tick has occurred while dealing with these,
- * dont service it now, delay until the next tick.
- */
+ nstats += ci->ci_statspending;
+ ci->ci_statspending = 0;
+
+ s = splclock();
+
+ /*
+ * Reenable interrupts
+ */
+ ppc_intr_enable(1);
+
+ /*
+ * Do standard timer interrupt stuff.
+ */
+ while (ci->ci_lasttb < ci->ci_prevtb) {
+ /* sync lasttb with hardclock */
+ ci->ci_lasttb += ticks_per_intr;
+ clk_count.ec_count++;
+ hardclock(frame);
}
+
+ while (nstats-- > 0)
+ statclock(frame);
+
+ splx(s);
+ (void) ppc_intr_disable();
+
+ /* if a tick has occurred while dealing with these,
+ * dont service it now, delay until the next tick.
+ */
}
void cpu_startclock(void);
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);
Index: macppc/dev/macintr.c
===================================================================
RCS file: /cvs/src/sys/arch/macppc/dev/macintr.c,v
retrieving revision 1.56
diff -u -p -r1.56 macintr.c
--- macppc/dev/macintr.c 13 Mar 2022 12:33:01 -0000 1.56
+++ macppc/dev/macintr.c 24 Jun 2022 02:49:59 -0000
@@ -170,6 +170,10 @@ macintr_splx(int newcpl)
intr = ppc_intr_disable();
macintr_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);
Index: powerpc/powerpc/intr.c
===================================================================
RCS file: /cvs/src/sys/arch/powerpc/powerpc/intr.c,v
retrieving revision 1.9
diff -u -p -r1.9 intr.c
--- powerpc/powerpc/intr.c 13 Sep 2015 14:06:40 -0000 1.9
+++ powerpc/powerpc/intr.c 24 Jun 2022 02:49:59 -0000
@@ -120,6 +120,11 @@ ppc_dflt_splx(int newcpl)
ci->ci_cpl = newcpl;
+ if (ci->ci_dec_deferred && newcpl < IPL_CLOCK) {
+ ppc_mtdec(0);
+ ppc_mtdec(UINT32_MAX); /* raise DEC exception */
+ }
+
if (ci->ci_ipending & ppc_smask[newcpl])
dosoftint(newcpl);
}
Index: powerpc/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/powerpc/include/cpu.h,v
retrieving revision 1.71
diff -u -p -r1.71 cpu.h
--- powerpc/include/cpu.h 10 Feb 2022 05:48:02 -0000 1.71
+++ powerpc/include/cpu.h 24 Jun 2022 02:49:59 -0000
@@ -55,6 +55,7 @@ struct cpu_info {
volatile int ci_want_resched;
volatile int ci_cpl;
volatile int ci_ipending;
+ volatile int ci_dec_deferred;
volatile int ci_flags;
#define CI_FLAGS_SLEEPING 2