6 class Timer_tick : public Irq_base
11 Any_cpu, ///< Might hit on any CPU
12 Sys_cpu, ///< Hit only on the CPU that manages the system time
13 App_cpu, ///< Hit only on application CPUs
15 /// Create a timer IRQ object
16 explicit Timer_tick(Mode mode)
20 case Any_cpu: set_hit(&handler_all); break;
21 case Sys_cpu: set_hit(&handler_sys_time); break;
22 case App_cpu: set_hit(&handler_app); break;
26 static void setup(Cpu_number cpu);
27 static void enable(Cpu_number cpu);
28 static void disable(Cpu_number cpu);
30 static Timer_tick *boot_cpu_timer_tick();
33 static bool allocate_irq(Irq_base *irq, unsigned irqnum);
36 // we do not support triggering modes
37 void switch_mode(bool) {}
40 // ------------------------------------------------------------------------
45 EXTENSION class Timer_tick
48 struct Log : public Tb_entry
52 void print(String_buffer *) const;
56 // ------------------------------------------------------------------------
61 #include "kernel_console.h"
64 PRIVATE static inline NEEDS["thread.h", "timer.h", "kernel_console.h", "vkey.h"]
66 Timer_tick::handle_timer(Irq_base *_s, Upstream_irq const *ui,
67 Thread *t, Cpu_number cpu)
69 Timer_tick *self = nonull_static_cast<Timer_tick *>(_s);
72 Timer::update_system_clock(cpu);
73 if (Config::esc_hack && cpu == Cpu_number::boot_cpu())
75 if (Kconsole::console()->char_avail() && !Vkey::check_())
79 t->handle_timer_interrupt();
82 PUBLIC static inline NEEDS[Timer_tick::handle_timer]
84 Timer_tick::handler_all(Irq_base *_s, Upstream_irq const *ui)
86 Thread *t = current_thread();
87 handle_timer(_s, ui, t, current_cpu());
90 PUBLIC static inline NEEDS[Timer_tick::handle_timer]
92 Timer_tick::handler_sys_time(Irq_base *_s, Upstream_irq const *ui)
94 // assume the boot CPU to be the CPU that manages the system time
95 handle_timer(_s, ui, current_thread(), Cpu_number::boot_cpu());
98 PUBLIC static inline NEEDS["thread.h", "timer.h"]
100 Timer_tick::handler_app(Irq_base *_s, Upstream_irq const *ui)
102 Timer_tick *self = nonull_static_cast<Timer_tick *>(_s);
106 current_thread()->handle_timer_interrupt();
109 // --------------------------------------------------------------------------
110 IMPLEMENTATION [!debug]:
114 Timer_tick::log_timer()
117 // --------------------------------------------------------------------------
118 IMPLEMENTATION [debug]:
121 #include "irq_chip.h"
122 #include "string_buffer.h"
126 Timer_tick::Log::print(String_buffer *buf) const
128 buf->printf("u-ip=0x%lx", user_ip);
131 PUBLIC inline NEEDS["logdefs.h"]
133 Timer_tick::log_timer()
135 Context *c = current();
136 LOG_TRACE("Timer IRQs (kernel scheduling)", "timer", c, Log,
137 l->user_ip = c->regs()->ip();