]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/timer_tick-broadcast.cpp
update
[l4.git] / kernel / fiasco / src / kern / timer_tick-broadcast.cpp
1 INTERFACE:
2
3 #include "types.h"
4
5 EXTENSION class Timer_tick
6 {
7 public:
8   static Static_object<Timer_tick> _glbl_timer;
9 };
10
11 IMPLEMENTATION:
12
13 #include "ipi.h"
14 #include "timer.h"
15
16 Static_object<Timer_tick> Timer_tick::_glbl_timer;
17
18 IMPLEMENT void
19 Timer_tick::setup(Cpu_number cpu)
20 {
21   if (cpu == Cpu_number::boot_cpu())
22     {
23       _glbl_timer.construct(Sys_cpu);
24       if (!allocate_irq(_glbl_timer, Timer::irq()))
25         panic("Could not allocate scheduling IRQ %d\n", Timer::irq());
26       else
27         printf("Timer is at IRQ %d\n", Timer::irq());
28
29       _glbl_timer->chip()->set_mode(_glbl_timer->pin(), Timer::irq_mode());
30     }
31 }
32
33 IMPLEMENT
34 void
35 Timer_tick::enable(Cpu_number)
36 {
37   _glbl_timer->chip()->unmask(_glbl_timer->pin());
38 }
39
40 IMPLEMENT
41 void
42 Timer_tick::disable(Cpu_number cpu)
43 {
44   if (cpu == Cpu_number::boot_cpu())
45     _glbl_timer->chip()->mask(_glbl_timer->pin());
46   else
47     {
48       // disable IPI
49     }
50
51 }
52
53 PUBLIC inline NEEDS["timer.h", "ipi.h"]
54 void
55 Timer_tick::ack()
56 {
57   Timer::acknowledge();
58   Irq_base::ack();
59   Ipi::bcast(Ipi::Timer, Cpu_number::boot_cpu());
60 }
61
62 // ------------------------------------------------------------------------
63 IMPLEMENTATION [debug]:
64
65 IMPLEMENT
66 Timer_tick *
67 Timer_tick::boot_cpu_timer_tick()
68 { return _glbl_timer; }