summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/clock.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/i386/isa/clock.c')
-rw-r--r--sys/i386/isa/clock.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c
index 98ef6f78..8e812a1 100644
--- a/sys/i386/isa/clock.c
+++ b/sys/i386/isa/clock.c
@@ -130,6 +130,8 @@ static void setup_8254_mixed_mode(void);
int adjkerntz; /* local offset from GMT in seconds */
int clkintr_pending;
int disable_rtc_set; /* disable resettodr() if != 0 */
+int pscnt = 1;
+int psdiv = 1;
int statclock_disable;
#ifndef TIMER_FREQ
#define TIMER_FREQ 1193182
@@ -380,7 +382,13 @@ static void
rtcintr(struct clockframe frame)
{
while (rtcin(RTC_INTR) & RTCIR_PERIOD) {
- statclock(&frame);
+ if (profprocs != 0) {
+ if (--pscnt == 0)
+ pscnt = psdiv;
+ profclock(&frame);
+ }
+ if (pscnt == psdiv)
+ statclock(&frame);
#ifdef SMP
forward_statclock();
#endif
@@ -1169,13 +1177,21 @@ setup_8254_mixed_mode()
#endif
void
-setstatclockrate(int newhz)
+cpu_startprofclock(void)
{
- if (newhz == RTC_PROFRATE)
- rtc_statusa = RTCSA_DIVIDER | RTCSA_PROF;
- else
- rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF;
+
+ rtc_statusa = RTCSA_DIVIDER | RTCSA_PROF;
+ writertc(RTC_STATUSA, rtc_statusa);
+ psdiv = pscnt = psratio;
+}
+
+void
+cpu_stopprofclock(void)
+{
+
+ rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF;
writertc(RTC_STATUSA, rtc_statusa);
+ psdiv = pscnt = 1;
}
static int
OpenPOWER on IntegriCloud