bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/2 gnumach] Add HPET timer for small accurate delays


From: Samuel Thibault
Subject: Re: [PATCH 1/2 gnumach] Add HPET timer for small accurate delays
Date: Fri, 2 Feb 2024 20:44:29 +0100
User-agent: NeoMutt/20170609 (1.8.3)

Damien Zammit, le ven. 02 févr. 2024 06:39:57 +0000, a ecrit:
> diff --git a/i386/i386/apic.c b/i386/i386/apic.c
> index 0cf7c37c..e3d53ce3 100644
> --- a/i386/i386/apic.c
> +++ b/i386/i386/apic.c
> @@ -26,6 +26,9 @@
>  #include <kern/printf.h>
>  #include <kern/kalloc.h>
>  
> +uint32_t hpet_period_nsec;
> +
> +extern uint32_t *hpet_addr;

We'd rather avoid extern variable declarations outside .h files.

I know we still have some left in gnumach, but let's not add even more
:)

> +void
> +hpet_udelay(uint32_t us)
> +{
> +    uint32_t start, finish, now;
> +
> +    us *= NSEC_PER_USEC / hpet_period_nsec;

You'll be more precise by using

    us = (us * NSEC_PER_USEC) / hpet_period_nsec;

Also, please loudly reject values which are not supported.

> +    start = HPET32(HPET_COUNTER);
> +
> +    finish = start + us;
> +
> +    while (1) {
> +        now = HPET32(HPET_COUNTER);
> +
> +        if (finish > start) {
> +            /* ticks did not wrap initially */
> +            if (now >= finish)
> +                break;
> +        } else {
> +            /* ticks wrapped initially */
> +            if ((now < start) && (now >= finish))
> +                break;
> +        }

Can't you rather just subtract start from now, and check when it beyond
us?

Samuel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]