"Dustin Howett" <alaricx@xxxxxxxxx> wrote:
> I have yet another patch for consideration (sending to haiku-gsoc so
> all discussion on it can get captured here).
>
> I haven't tried it on native hardware but it boots in qemu (in both
> uniprocessor mode and multiprocessor mode, the PIT and APIC timers
> get
> used)
>
> It addresses many of Axel's concerns (anything that remains, please
> let me know)
Looks much better now, thanks!
I still have a few comments mostly on the coding style, and I would
like to see them resolved before applying the patch:
> +++ src/system/kernel/arch/x86/arch_timer.c (working copy)
> -//#define TRACE_TIMER
> +#define TRACE_TIMER
That is probably not intended.
> + if(sBestTimer != NULL)
Just one of many occasions: there is always a space after if/while/for/
select/... keywords
> +static timer_info *timers[] = {
Global static, hence it should be called sTimers.
> + int cur_timer = 0;
> + int cur_prio = -1;
> + char cur_best_name[B_FILE_NAME_LENGTH];
>
> + cpu_status state = disable_interrupts();
>
> + while(true) {
> + timer_info *timer = timers[cur_timer++];
>
> + if(timer == NULL) break;
Same if/while issue, please always put the statement after "if" on the
next line. Naming cur_timer: first of all, it would be currentTimer,
and then, why use such a specific name (only to abbreviate it), when
"i" or "index" is not used? cur_best_name seems to be unused, and
doesn't make much sense either.
BTW a for loop would be more appropriate here.
> +/*
> + * Copyright 2008, Dustin Howett, dustin.howett@xxxxxxxxxx All
> rights reserved.
> + * Distributed under the terms of the MIT License.
> +
> + * Copyright 2005, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx All rights
> reserved.
> + * Distributed under the terms of the MIT License.
First of all, there would be a '*' in the separation line. Then, since
both licenses are MIT, you would fold the license together like this:
+ * Copyright 2008, Dustin Howett, dustin.howett@xxxxxxxxxx All rights
reserved.
+ * Copyright 2005, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx All rights
reserved.
+ * Distributed under the terms of the MIT License.
> +++ src/system/kernel/arch/x86/timers/pit.h (revision 0)
> +static status_t pit_clear_hardware_timer();
Always use (void) in plain C rather than this form; () means (...) in
C, not actually ().
> +++ src/system/kernel/arch/x86/timers/hpet.h (revision 0)
> +#endif
Please add the closing comment like:
+#endif // _KERNEL_ARCH_x86_TIMERS_HPET_H
(this is not the only place you left that out)
> +static int
> +hpet_set_legacy(struct hpet_regs *regs, bool enabled)
> +{
> + if(!HPET_IS_LEGACY_CAPABLE(regs)) return B_NOT_SUPPORTED;
> + if(enabled == true) regs->config |= HPET_CONF_MASK_LEGACY;
> + else regs->config &= ~HPET_CONF_MASK_LEGACY;
> + return B_OK;
> +}
Following our style guide a bit this would be:
static int
hpet_set_legacy(struct hpet_regs *regs, bool enabled)
{
if (!HPET_IS_LEGACY_CAPABLE(regs))
return B_NOT_SUPPORTED;
if (enabled)
regs->config |= HPET_CONF_MASK_LEGACY;
else
regs->config &= ~HPET_CONF_MASK_LEGACY;
return B_OK;
}
It's also not a crime to utilize spacing to make functions clearer and
cleaner :-)
> +++ src/system/kernel/arch/x86/arch_smp.c (working copy)
> if (args->num_cpus > 1) {
> +
> // setup some globals
Please don't do that.
> +++ headers/private/kernel/timer.h (working copy)
> +#include <module.h>
It obviously doesn't need this header anymore.
> +/* Timer info structure */
> +struct timer_info
> +{
That would be:
struct timer_info {
...
};
> + bool initialized;
Any particular reason to have this field in there?
It doesn't really belong there, and you could also make the structs
const without this.
Bye,
Axel.