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-head mailing list