]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ppc32/decrementer.cpp
update
[l4.git] / kernel / fiasco / src / kern / ppc32 / decrementer.cpp
1 INTERFACE:
2
3 #include "types.h"
4
5 class Decrementer
6 {
7 public:
8   void init(unsigned long interval);
9   inline void set();
10   inline void enable();
11   inline void disable();
12   Decrementer() : _interval(0), _enabled(false) {}
13
14 private:
15   Unsigned32 _interval;
16   bool _enabled;
17 };
18
19
20 //------------------------------------------------------------------------------
21 IMPLEMENTATION[ppc32]:
22
23 PUBLIC static inline
24 Decrementer *
25 Decrementer::d()
26 {
27   static Decrementer _kernel_decr;
28   return &_kernel_decr;
29 }
30
31 PRIVATE inline
32 void
33 Decrementer::set2(unsigned long interval)
34 {
35   if (!_enabled && interval)
36     return;
37
38   asm volatile("mtdec %0" : : "r"(interval) : "memory");
39 }
40
41 IMPLEMENT
42 void
43 Decrementer::init(unsigned long interval)
44 {
45   _interval = interval;
46 }
47
48 IMPLEMENT inline NEEDS[Decrementer::set2]
49 void
50 Decrementer::set()
51 {
52   set2(_interval);
53 }
54
55 IMPLEMENT inline
56 void
57 Decrementer::enable()
58 {
59   _enabled = true;
60   set();
61 }
62
63 IMPLEMENT inline
64 void
65 Decrementer::disable()
66 {
67   _enabled = false;
68   set2(0);
69 }