Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 Mar 2016 15:05:00 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r297351 - head/sys/x86/x86
Message-ID:  <201603281505.u2SF50JE005805@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201603281505.u2SF50JE005805>