1 //
2 // Copyright (c) 2012-2014 Travis Geiselbrecht
3 //
4 // Use of this source code is governed by a MIT-style
5 // license that can be found in the LICENSE file or at
6 // https://opensource.org/licenses/MIT
7 //
8 #pragma once
9 
10 #include <lk/compiler.h>
11 
12 __BEGIN_CDECLS
13 
14 #include <lk/debug.h>
15 
16 // This file defines the kernel event log, which is a simple logging mechanism
17 // for kernel events. It is primarily used for debugging and performance analysis.
18 #if WITH_KERNEL_EVLOG
19 
20 #include <lib/evlog.h>
21 
22 #ifndef KERNEL_EVLOG_LEN
23 #define KERNEL_EVLOG_LEN 1024
24 #endif
25 
26 void kernel_evlog_init(void);
27 
28 void kernel_evlog_add(uintptr_t id, uintptr_t arg0, uintptr_t arg1);
29 void kernel_evlog_dump(void);
30 
31 #else // !WITH_KERNEL_EVLOG
32 
33 // Do-nothing versions.
34 static inline void kernel_evlog_init(void) {}
35 static inline void kernel_evlog_add(uintptr_t id, uintptr_t arg0, uintptr_t arg1) {}
36 static inline void kernel_evlog_dump(void) {}
37 
38 #endif
39 
40 enum {
41     KERNEL_EVLOG_NULL = 0,
42     KERNEL_EVLOG_CONTEXT_SWITCH,
43     KERNEL_EVLOG_PREEMPT,
44     KERNEL_EVLOG_TIMER_TICK,
45     KERNEL_EVLOG_TIMER_CALL,
46     KERNEL_EVLOG_IRQ_ENTER,
47     KERNEL_EVLOG_IRQ_EXIT,
48 };
49 
50 #define KEVLOG_THREAD_SWITCH(from, to) kernel_evlog_add(KERNEL_EVLOG_CONTEXT_SWITCH, (uintptr_t)(from), (uintptr_t)(to))
51 #define KEVLOG_THREAD_PREEMPT(thread) kernel_evlog_add(KERNEL_EVLOG_PREEMPT, (uintptr_t)(thread), 0)
52 #define KEVLOG_TIMER_TICK() kernel_evlog_add(KERNEL_EVLOG_TIMER_TICK, 0, 0)
53 #define KEVLOG_TIMER_CALL(ptr, arg) kernel_evlog_add(KERNEL_EVLOG_TIMER_CALL, (uintptr_t)(ptr), (uintptr_t)(arg))
54 #define KEVLOG_IRQ_ENTER(irqn) kernel_evlog_add(KERNEL_EVLOG_IRQ_ENTER, (uintptr_t)(irqn), 0)
55 #define KEVLOG_IRQ_EXIT(irqn) kernel_evlog_add(KERNEL_EVLOG_IRQ_EXIT, (uintptr_t)(irqn), 0)
56 
57 __END_CDECLS
58