diff options
-rw-r--r-- | sys/amd64/amd64/machdep.c | 7 | ||||
-rw-r--r-- | sys/amd64/include/clock.h | 3 | ||||
-rw-r--r-- | sys/amd64/isa/clock.c | 23 | ||||
-rw-r--r-- | sys/i386/i386/machdep.c | 7 | ||||
-rw-r--r-- | sys/i386/include/clock.h | 3 | ||||
-rw-r--r-- | sys/i386/isa/clock.c | 23 | ||||
-rw-r--r-- | sys/isa/atrtc.c | 23 |
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) { |