18 bool __mask() { bool o = masked(); _flags &= ~F_enabled; return o; }
19 bool __unmask() { bool o = masked(); _flags |= F_enabled; return o; }
22 void *operator new (size_t, void *p) { return p; }
24 virtual void do_mask() = 0;
25 virtual void do_unmask() = 0;
26 virtual void do_mask_and_ack() = 0;
27 virtual void do_set_mode(unsigned) {};
29 virtual void ack() = 0;
30 virtual void set_cpu(unsigned) = 0;
31 virtual bool check_debug_irq() { return true; }
32 virtual void disable() {}
33 virtual void unbind_irq() = 0;
35 void mask() { if (!__mask()) do_mask(); }
36 void mask_and_ack() { do_mask_and_ack(); }
37 void unmask() { if (__unmask()) do_unmask(); }
38 void set_mode(unsigned m)
39 { _flags = (_flags & ~6) | (m & 6); do_set_mode(m); }
41 unsigned get_mode() const
42 { return _flags & 6; }
44 bool masked() const { return !(_flags & F_enabled); }
45 Mword flags() const { return _flags; }
47 Mword *payload() { return _payload; }
52 do_set_mode(_flags & 6);
61 template<typename Pin>
63 { new (this) Pin(); __redo_flags(); }
65 template<typename Pin, typename Arg>
67 { new (this) Pin(a); __redo_flags(); }
69 template<typename Pin, typename A1, typename A2>
70 void replace(A1 a1, A2 a2)
71 { new (this) Pin(a1, a2); __redo_flags(); }
73 Mword const *payload() const { return _payload; }
82 class Irq_pin_dummy : public Irq_pin
89 void do_mask_and_ack() { __mask(); }
90 void do_set_mode(unsigned) {}
91 void set_cpu(unsigned) {}
92 char const *pin_type() const { return "DUMMY"; }
97 class Sw_irq_pin : public Irq_pin_dummy
103 Irq_base() : _next(0)
105 memset(&_pin, 0, sizeof(_pin));
106 new (&_pin) Irq_pin_dummy();
109 Irq_pin *pin() { return (Irq_pin*)_pin; }
110 Irq_pin const *pin() const { return (Irq_pin const*)_pin; }
111 virtual void hit() {}
114 typedef char Pin[sizeof (Irq_pin)] __attribute__((aligned(__alignof__(Irq_pin))));
120 static Irq_base *(*dcast)(Kobject_iface *);
123 //----------------------------------------------------------------------------
126 EXTENSION class Irq_pin
129 virtual char const *pin_type() const = 0;
133 //----------------------------------------------------------------------------
137 #include "cpu_lock.h"
138 #include "lock_guard.h"
140 Irq_base *(*Irq_base::dcast)(Kobject_iface *);
142 PUBLIC static inline NEEDS["types.h"]
144 Irq_base::self(Irq_pin const *pin)
146 #define MYoffsetof(TYPE, MEMBER) (((size_t) &((TYPE *)10)->MEMBER) - 10)
147 return reinterpret_cast<Irq_base*>(reinterpret_cast<Mword>(pin)
148 - MYoffsetof(Irq_base, _pin));
152 PUBLIC inline NEEDS["lock_guard.h", "cpu_lock.h"]
156 Lock_guard<Cpu_lock> g(&cpu_lock);
158 pin()->replace<Sw_irq_pin>();
163 Sw_irq_pin::pin_type() const