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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to