svn commit: r297351 - head/sys/x86/x86
Konstantin Belousov
kib at FreeBSD.org
Mon Mar 28 15:05:01 UTC 2016
Author: kib
Date: Mon Mar 28 15:05:00 2016
New Revision: 297351
URL: https://svnweb.freebsd.org/changeset/base/297351
Log:
Do not load LAPIC_DCR_TIMER with an undefined value. If we are in the
deadline mode the divide configuration is not used and
lapic_timer_divisor is not set.
Reported by: dhw, mav
Tested by: mav
Sponsored by: The FreeBSD Foundation
Modified:
head/sys/x86/x86/local_apic.c
Modified: head/sys/x86/x86/local_apic.c
==============================================================================
--- head/sys/x86/x86/local_apic.c Mon Mar 28 11:51:35 2016 (r297350)
+++ head/sys/x86/x86/local_apic.c Mon Mar 28 15:05:00 2016 (r297351)
@@ -636,12 +636,13 @@ native_lapic_setup(int boot)
if (la->la_timer_mode != LAT_MODE_UNDEF) {
KASSERT(la->la_timer_period != 0, ("lapic%u: zero divisor",
lapic_id()));
- lapic_timer_set_divisor(lapic_timer_divisor);
switch (la->la_timer_mode) {
case LAT_MODE_PERIODIC:
+ lapic_timer_set_divisor(lapic_timer_divisor);
lapic_timer_periodic(la);
break;
case LAT_MODE_ONESHOT:
+ lapic_timer_set_divisor(lapic_timer_divisor);
lapic_timer_oneshot(la);
break;
case LAT_MODE_DEADLINE:
@@ -803,9 +804,9 @@ lapic_et_start(struct eventtimer *et, sb
et->et_min_period = (0x00000002LLU << 32) / et->et_frequency;
et->et_max_period = (0xfffffffeLLU << 32) / et->et_frequency;
}
- if (la->la_timer_mode == LAT_MODE_UNDEF)
- lapic_timer_set_divisor(lapic_timer_divisor);
if (period != 0) {
+ if (la->la_timer_mode == LAT_MODE_UNDEF)
+ lapic_timer_set_divisor(lapic_timer_divisor);
la->la_timer_mode = LAT_MODE_PERIODIC;
la->la_timer_period = ((uint32_t)et->et_frequency * period) >>
32;
@@ -815,6 +816,8 @@ lapic_et_start(struct eventtimer *et, sb
la->la_timer_period = (et->et_frequency * first) >> 32;
lapic_timer_deadline(la);
} else {
+ if (la->la_timer_mode == LAT_MODE_UNDEF)
+ lapic_timer_set_divisor(lapic_timer_divisor);
la->la_timer_mode = LAT_MODE_ONESHOT;
la->la_timer_period = ((uint32_t)et->et_frequency * first) >>
32;
More information about the svn-src-all
mailing list