summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/amd64/machdep.c7
-rw-r--r--sys/amd64/include/clock.h3
-rw-r--r--sys/amd64/isa/clock.c23
-rw-r--r--sys/i386/i386/machdep.c7
-rw-r--r--sys/i386/include/clock.h3
-rw-r--r--sys/i386/isa/clock.c23
-rw-r--r--sys/isa/atrtc.c23
7 files changed, 46 insertions, 43 deletions
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 905b490..2aac078 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -1176,7 +1176,6 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
* under witness.
*/
mutex_init();
- mtx_init(&clock_lock, "clk", NULL, MTX_SPIN);
mtx_init(&icu_lock, "icu", NULL, MTX_SPIN | MTX_NOWITNESS);
/* exceptions */
@@ -1207,6 +1206,12 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
lidt(&r_idt);
/*
+ * Initialize the i8254 before the console so that console
+ * initialization can use DELAY().
+ */
+ i8254_init();
+
+ /*
* Initialize the console before we print anything out.
*/
cninit();
diff --git a/sys/amd64/include/clock.h b/sys/amd64/include/clock.h
index 36d0beb..30c2f26 100644
--- a/sys/amd64/include/clock.h
+++ b/sys/amd64/include/clock.h
@@ -22,7 +22,8 @@ extern u_int timer_freq;
extern int timer0_max_count;
extern uint64_t tsc_freq;
extern int tsc_is_broken;
-extern struct mtx clock_lock;
+
+void i8254_init(void);
/*
* Driver to clock driver interface.
diff --git a/sys/amd64/isa/clock.c b/sys/amd64/isa/clock.c
index 0b1fc4d..e548b26 100644
--- a/sys/amd64/isa/clock.c
+++ b/sys/amd64/isa/clock.c
@@ -103,11 +103,11 @@ int statclock_disable;
u_int timer_freq = TIMER_FREQ;
int timer0_max_count;
int timer0_real_max_count;
-struct mtx clock_lock;
#define RTC_LOCK mtx_lock_spin(&clock_lock)
#define RTC_UNLOCK mtx_unlock_spin(&clock_lock)
static int beeping = 0;
+static struct mtx clock_lock;
static const u_char daysinmonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};
static struct intsrc *i8254_intsrc;
static u_int32_t i8254_lastcount;
@@ -295,13 +295,6 @@ DELAY(int n)
printf("DELAY(%d)...", n);
#endif
/*
- * Guard against the timer being uninitialized if we are called
- * early for console i/o.
- */
- if (timer0_max_count == 0)
- set_timer_freq(timer_freq, hz);
-
- /*
* Read the counter first, so that the rest of the setup overhead is
* counted. Guess the initial overhead is 20 usec (on most systems it
* takes about 1.5 usec for each of the i/o's in getit(). The loop
@@ -560,10 +553,15 @@ set_timer_freq(u_int freq, int intr_freq)
mtx_unlock_spin(&clock_lock);
}
-/*
- * Initialize 8254 timer 0 early so that it can be used in DELAY().
- * XXX initialization of other timers is unintentionally left blank.
- */
+/* This is separate from startrtclock() so that it can be called early. */
+void
+i8254_init(void)
+{
+
+ mtx_init(&clock_lock, "clk", NULL, MTX_SPIN);
+ set_timer_freq(timer_freq, hz);
+}
+
void
startrtclock()
{
@@ -572,7 +570,6 @@ startrtclock()
writertc(RTC_STATUSA, rtc_statusa);
writertc(RTC_STATUSB, RTCSB_24HR);
- set_timer_freq(timer_freq, hz);
freq = calibrate_clocks();
#ifdef CLK_CALIBRATION_LOOP
if (bootverbose) {
diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c
index 01348d5..7d649e4 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -2118,7 +2118,6 @@ init386(first)
* under witness.
*/
mutex_init();
- mtx_init(&clock_lock, "clk", NULL, MTX_SPIN | MTX_NOPROFILE);
mtx_init(&icu_lock, "icu", NULL, MTX_SPIN | MTX_NOWITNESS | MTX_NOPROFILE);
/* make ldt memory segments */
@@ -2202,6 +2201,12 @@ init386(first)
#endif /* XBOX */
/*
+ * Initialize the i8254 before the console so that console
+ * initialization can use DELAY().
+ */
+ i8254_init();
+
+ /*
* Initialize the console before we print anything out.
*/
cninit();
diff --git a/sys/i386/include/clock.h b/sys/i386/include/clock.h
index 74679b9..a91b252 100644
--- a/sys/i386/include/clock.h
+++ b/sys/i386/include/clock.h
@@ -22,7 +22,8 @@ extern u_int timer_freq;
extern int timer0_max_count;
extern uint64_t tsc_freq;
extern int tsc_is_broken;
-extern struct mtx clock_lock;
+
+void i8254_init(void);
/*
* Driver to clock driver interface.
diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c
index bc0bf61..29ddd39 100644
--- a/sys/i386/isa/clock.c
+++ b/sys/i386/isa/clock.c
@@ -106,11 +106,11 @@ int statclock_disable;
u_int timer_freq = TIMER_FREQ;
int timer0_max_count;
int timer0_real_max_count;
-struct mtx clock_lock;
#define RTC_LOCK mtx_lock_spin(&clock_lock)
#define RTC_UNLOCK mtx_unlock_spin(&clock_lock)
static int beeping = 0;
+static struct mtx clock_lock;
static struct intsrc *i8254_intsrc;
static u_int32_t i8254_lastcount;
static u_int32_t i8254_offset;
@@ -302,13 +302,6 @@ DELAY(int n)
printf("DELAY(%d)...", n);
#endif
/*
- * Guard against the timer being uninitialized if we are called
- * early for console i/o.
- */
- if (timer0_max_count == 0)
- set_timer_freq(timer_freq, hz);
-
- /*
* Read the counter first, so that the rest of the setup overhead is
* counted. Guess the initial overhead is 20 usec (on most systems it
* takes about 1.5 usec for each of the i/o's in getit(). The loop
@@ -605,10 +598,15 @@ timer_restore(void)
rtc_restore(); /* reenable RTC interrupts */
}
-/*
- * Initialize 8254 timer 0 early so that it can be used in DELAY().
- * XXX initialization of other timers is unintentionally left blank.
- */
+/* This is separate from startrtclock() so that it can be called early. */
+void
+i8254_init(void)
+{
+
+ mtx_init(&clock_lock, "clk", NULL, MTX_SPIN | MTX_NOPROFILE);
+ set_timer_freq(timer_freq, hz);
+}
+
void
startrtclock()
{
@@ -617,7 +615,6 @@ startrtclock()
writertc(RTC_STATUSA, rtc_statusa);
writertc(RTC_STATUSB, RTCSB_24HR);
- set_timer_freq(timer_freq, hz);
freq = calibrate_clocks();
#ifdef CLK_CALIBRATION_LOOP
if (bootverbose) {
diff --git a/sys/isa/atrtc.c b/sys/isa/atrtc.c
index bc0bf61..29ddd39 100644
--- a/sys/isa/atrtc.c
+++ b/sys/isa/atrtc.c
@@ -106,11 +106,11 @@ int statclock_disable;
u_int timer_freq = TIMER_FREQ;
int timer0_max_count;
int timer0_real_max_count;
-struct mtx clock_lock;
#define RTC_LOCK mtx_lock_spin(&clock_lock)
#define RTC_UNLOCK mtx_unlock_spin(&clock_lock)
static int beeping = 0;
+static struct mtx clock_lock;
static struct intsrc *i8254_intsrc;
static u_int32_t i8254_lastcount;
static u_int32_t i8254_offset;
@@ -302,13 +302,6 @@ DELAY(int n)
printf("DELAY(%d)...", n);
#endif
/*
- * Guard against the timer being uninitialized if we are called
- * early for console i/o.
- */
- if (timer0_max_count == 0)
- set_timer_freq(timer_freq, hz);
-
- /*
* Read the counter first, so that the rest of the setup overhead is
* counted. Guess the initial overhead is 20 usec (on most systems it
* takes about 1.5 usec for each of the i/o's in getit(). The loop
@@ -605,10 +598,15 @@ timer_restore(void)
rtc_restore(); /* reenable RTC interrupts */
}
-/*
- * Initialize 8254 timer 0 early so that it can be used in DELAY().
- * XXX initialization of other timers is unintentionally left blank.
- */
+/* This is separate from startrtclock() so that it can be called early. */
+void
+i8254_init(void)
+{
+
+ mtx_init(&clock_lock, "clk", NULL, MTX_SPIN | MTX_NOPROFILE);
+ set_timer_freq(timer_freq, hz);
+}
+
void
startrtclock()
{
@@ -617,7 +615,6 @@ startrtclock()
writertc(RTC_STATUSA, rtc_statusa);
writertc(RTC_STATUSB, RTCSB_24HR);
- set_timer_freq(timer_freq, hz);
freq = calibrate_clocks();
#ifdef CLK_CALIBRATION_LOOP
if (bootverbose) {
OpenPOWER on IntegriCloud