summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-07-20 15:48:29 +0000
committermav <mav@FreeBSD.org>2010-07-20 15:48:29 +0000
commit0ea74c96a2f40bc01acfd1e4eaff94f73860e331 (patch)
tree2c5e8d78cfbbe53e780bacd903f0ccd75cd9597a
parente1bb40d4c52c58d39b2ef9cf56223c4419e7bd99 (diff)
downloadFreeBSD-src-0ea74c96a2f40bc01acfd1e4eaff94f73860e331.zip
FreeBSD-src-0ea74c96a2f40bc01acfd1e4eaff94f73860e331.tar.gz
Fix several un-/signedness bugs of r210290 and r210293. Add one more check.
-rw-r--r--sys/arm/mv/timer.c6
-rw-r--r--sys/dev/acpica/acpi_hpet.c6
-rw-r--r--sys/kern/kern_clocksource.c5
-rw-r--r--sys/x86/isa/atrtc.c4
-rw-r--r--sys/x86/isa/clock.c5
-rw-r--r--sys/x86/x86/local_apic.c6
6 files changed, 17 insertions, 15 deletions
diff --git a/sys/arm/mv/timer.c b/sys/arm/mv/timer.c
index 2845593..bcc4e81 100644
--- a/sys/arm/mv/timer.c
+++ b/sys/arm/mv/timer.c
@@ -158,10 +158,10 @@ mv_timer_attach(device_t dev)
sc->et.et_frequency = get_tclk();
sc->et.et_min_period.sec = 0;
sc->et.et_min_period.frac =
- ((0xfLL << 60) / sc->et.et_frequency) << 4;
- sc->et.et_max_period.sec = 0xfffffff0 / sc->et.et_frequency;
+ ((0x00000002LLU << 32) / sc->et.et_frequency) << 32;
+ sc->et.et_max_period.sec = 0xfffffff0U / sc->et.et_frequency;
sc->et.et_max_period.frac =
- ((0xfffffff0LL << 32) / sc->et.et_frequency) << 32;
+ ((0xfffffffeLLU << 32) / sc->et.et_frequency) << 32;
sc->et.et_start = mv_timer_start;
sc->et.et_stop = mv_timer_stop;
sc->et.et_priv = sc;
diff --git a/sys/dev/acpica/acpi_hpet.c b/sys/dev/acpica/acpi_hpet.c
index a789418..b943092 100644
--- a/sys/dev/acpica/acpi_hpet.c
+++ b/sys/dev/acpica/acpi_hpet.c
@@ -585,10 +585,10 @@ hpet_attach(device_t dev)
t->et.et_quality -= 10;
t->et.et_frequency = sc->freq;
t->et.et_min_period.sec = 0;
- t->et.et_min_period.frac = 0x00004000LL << 32;
- t->et.et_max_period.sec = 0xffffffff / sc->freq;
+ t->et.et_min_period.frac = 0x00004000LLU << 32;
+ t->et.et_max_period.sec = 0xfffffffeLLU / sc->freq;
t->et.et_max_period.frac =
- ((0xffffffffLL << 32) / sc->freq) << 32;
+ ((0xfffffffeLLU << 32) / sc->freq) << 32;
t->et.et_start = hpet_start;
t->et.et_stop = hpet_stop;
t->et.et_priv = &sc->t[i];
diff --git a/sys/kern/kern_clocksource.c b/sys/kern/kern_clocksource.c
index 9656db6..6b005de 100644
--- a/sys/kern/kern_clocksource.c
+++ b/sys/kern/kern_clocksource.c
@@ -299,14 +299,14 @@ round_freq(struct eventtimer *et, int freq)
uint64_t div;
if (et->et_frequency != 0) {
- div = (et->et_frequency + freq / 2) / freq;
+ div = lmax((et->et_frequency + freq / 2) / freq, 1);
if (et->et_flags & ET_FLAGS_POW2DIV)
div = 1 << (flsl(div + div / 2) - 1);
freq = (et->et_frequency + div / 2) / div;
}
if (et->et_min_period.sec > 0)
freq = 0;
- else if (et->et_max_period.frac != 0)
+ else if (et->et_min_period.frac != 0)
freq = min(freq, BT2FREQ(&et->et_min_period));
if (et->et_max_period.sec == 0 && et->et_max_period.frac != 0)
freq = max(freq, BT2FREQ(&et->et_max_period));
@@ -365,6 +365,7 @@ cpu_initclocks_bsp(void)
stathz = round_freq(timer[1], 127);
profhz = round_freq(timer[1], stathz * 64);
}
+ tick = 1000000 / hz;
ET_LOCK();
cpu_restartclocks();
ET_UNLOCK();
diff --git a/sys/x86/isa/atrtc.c b/sys/x86/isa/atrtc.c
index b01e933..929f7e7 100644
--- a/sys/x86/isa/atrtc.c
+++ b/sys/x86/isa/atrtc.c
@@ -280,9 +280,9 @@ atrtc_attach(device_t dev)
sc->et.et_quality = 0;
sc->et.et_frequency = 32768;
sc->et.et_min_period.sec = 0;
- sc->et.et_min_period.frac = 0x0008LL << 48;
+ sc->et.et_min_period.frac = 0x0008LLU << 48;
sc->et.et_max_period.sec = 0;
- sc->et.et_max_period.frac = 0x8000LL << 48;
+ sc->et.et_max_period.frac = 0x8000LLU << 48;
sc->et.et_start = rtc_start;
sc->et.et_stop = rtc_stop;
sc->et.et_priv = dev;
diff --git a/sys/x86/isa/clock.c b/sys/x86/isa/clock.c
index 62869a6..2c0e788 100644
--- a/sys/x86/isa/clock.c
+++ b/sys/x86/isa/clock.c
@@ -666,10 +666,11 @@ attimer_attach(device_t dev)
sc->et.et_quality = 100;
sc->et.et_frequency = i8254_freq;
sc->et.et_min_period.sec = 0;
- sc->et.et_min_period.frac = ((1LL << 62) / i8254_freq) << 2;
+ sc->et.et_min_period.frac =
+ ((0x0002LLU << 48) / i8254_freq) << 16;
sc->et.et_max_period.sec = 0xffff / i8254_freq;
sc->et.et_max_period.frac =
- ((0xffffLL << 48) / i8254_freq) << 16;
+ ((0xfffeLLU << 48) / i8254_freq) << 16;
sc->et.et_start = attimer_start;
sc->et.et_stop = attimer_stop;
sc->et.et_priv = dev;
diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index ffa34a5..9dba483 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -500,10 +500,10 @@ lapic_et_start(struct eventtimer *et,
et->et_frequency = value;
et->et_min_period.sec = 0;
et->et_min_period.frac =
- ((1LL << 63) / et->et_frequency) << 1;
- et->et_max_period.sec = 0xffffffff / et->et_frequency;
+ ((0x00000002LLU << 32) / et->et_frequency) << 32;
+ et->et_max_period.sec = 0xfffffffeLLU / et->et_frequency;
et->et_max_period.frac =
- ((0xffffffffLL << 32) / et->et_frequency) << 32;
+ ((0xfffffffeLLU << 32) / et->et_frequency) << 32;
}
la = &lapics[lapic_id()];
/*
OpenPOWER on IntegriCloud