The UltraSPARC IIe's %TICK register has a variable frequency.  See
section 2.3 in this document here:

https://web.archive.org/web/20221028065731/https://www.oracle.com/technetwork/server-storage/sun-sparc-enterprise/documentation/ultrasparc-iie-2516664.pdf

Timecounters need to have a constant frequency, so we should not
install tick_timecounter if the implementation is an UltraSPARC IIe
("Hummingbird").

As far as I know this issue is unique to the IIe.  I can't find any
reference to a varying %TICK frequency in the documentation for the
IIi or the UltraSPARC III.

miod@ confirmed that the problem is real.

ok?

Index: clock.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/sparc64/clock.c,v
retrieving revision 1.72
diff -u -p -r1.72 clock.c
--- clock.c     10 Nov 2022 07:08:01 -0000      1.72
+++ clock.c     9 Dec 2022 22:19:33 -0000
@@ -567,17 +567,23 @@ cpu_initclocks(void)
                /* Default to 200MHz clock XXXXX */
                cpu_clockrate = 200000000;
 
-       tick_timecounter.tc_frequency = cpu_clockrate;
-       tc_init(&tick_timecounter);
+       if (CPU_ISSUN4U || CPU_ISSUN4US)
+               impl = (getver() & VER_IMPL) >> VER_IMPL_SHIFT;
+
+       /*
+        * The TICK frequency varies on the UltraSPARc IIe, so it isn't
+        * a suitable timecounter.
+        */
+       if (impl != IMPL_HUMMINGBIRD) {
+               tick_timecounter.tc_frequency = cpu_clockrate;
+               tc_init(&tick_timecounter);
+       }
 
        /*
         * UltraSPARC IIe processors do have a STICK register, but it
         * lives on the PCI host bridge and isn't accessible through
         * ASR24.
         */
-       if (CPU_ISSUN4U || CPU_ISSUN4US)
-               impl = (getver() & VER_IMPL) >> VER_IMPL_SHIFT;
-
        sys_tick_rate = getpropint(findroot(), "stick-frequency", 0);
        if (sys_tick_rate > 0 && impl != IMPL_HUMMINGBIRD) {
                sys_tick_timecounter.tc_frequency = sys_tick_rate;

Reply via email to