summaryrefslogtreecommitdiffstats
path: root/sys/x86/x86/local_apic.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/x86/x86/local_apic.c')
-rw-r--r--sys/x86/x86/local_apic.c31
1 files changed, 9 insertions, 22 deletions
diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index c60db22..ac87ebd 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -169,7 +169,7 @@ static void lapic_timer_stop(struct lapic *);
static void lapic_timer_set_divisor(u_int divisor);
static uint32_t lvt_mode(struct lapic *la, u_int pin, uint32_t value);
static int lapic_et_start(struct eventtimer *et,
- struct bintime *first, struct bintime *period);
+ sbintime_t first, sbintime_t period);
static int lapic_et_stop(struct eventtimer *et);
struct pic lapic_pic = { .pic_resume = lapic_resume };
@@ -268,10 +268,8 @@ lapic_init(vm_paddr_t addr)
}
lapic_et.et_frequency = 0;
/* We don't know frequency yet, so trying to guess. */
- lapic_et.et_min_period.sec = 0;
- lapic_et.et_min_period.frac = 0x00001000LL << 32;
- lapic_et.et_max_period.sec = 1;
- lapic_et.et_max_period.frac = 0;
+ lapic_et.et_min_period = 0x00001000LL;
+ lapic_et.et_max_period = SBT_1S;
lapic_et.et_start = lapic_et_start;
lapic_et.et_stop = lapic_et_stop;
lapic_et.et_priv = NULL;
@@ -487,8 +485,7 @@ lapic_disable_pmc(void)
}
static int
-lapic_et_start(struct eventtimer *et,
- struct bintime *first, struct bintime *period)
+lapic_et_start(struct eventtimer *et, sbintime_t first, sbintime_t period)
{
struct lapic *la;
u_long value;
@@ -513,28 +510,18 @@ lapic_et_start(struct eventtimer *et,
printf("lapic: Divisor %lu, Frequency %lu Hz\n",
lapic_timer_divisor, value);
et->et_frequency = value;
- et->et_min_period.sec = 0;
- et->et_min_period.frac =
- ((0x00000002LLU << 32) / et->et_frequency) << 32;
- et->et_max_period.sec = 0xfffffffeLLU / et->et_frequency;
- et->et_max_period.frac =
- ((0xfffffffeLLU << 32) / et->et_frequency) << 32;
+ et->et_min_period = (0x00000002LLU << 32) / et->et_frequency;
+ et->et_max_period = (0xfffffffeLLU << 32) / et->et_frequency;
}
if (la->la_timer_mode == 0)
lapic_timer_set_divisor(lapic_timer_divisor);
- if (period != NULL) {
+ if (period != 0) {
la->la_timer_mode = 1;
- la->la_timer_period =
- (et->et_frequency * (period->frac >> 32)) >> 32;
- if (period->sec != 0)
- la->la_timer_period += et->et_frequency * period->sec;
+ la->la_timer_period = ((uint32_t)et->et_frequency * period) >> 32;
lapic_timer_periodic(la, la->la_timer_period, 1);
} else {
la->la_timer_mode = 2;
- la->la_timer_period =
- (et->et_frequency * (first->frac >> 32)) >> 32;
- if (first->sec != 0)
- la->la_timer_period += et->et_frequency * first->sec;
+ la->la_timer_period = ((uint32_t)et->et_frequency * first) >> 32;
lapic_timer_oneshot(la, la->la_timer_period, 1);
}
return (0);
OpenPOWER on IntegriCloud