]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/jdb/ia32/jdb_trace_set-ia32-ux.cpp
d6de9b71fd959c6d7294f63f9d2b4a5b5188a283
[l4.git] / kernel / fiasco / src / jdb / ia32 / jdb_trace_set-ia32-ux.cpp
1 IMPLEMENTATION:
2 #include "syscalls.h"
3 #include "idt.h"
4 #include "jdb.h"
5
6 extern "C" void entry_sys_ipc_log (void);
7 extern "C" void entry_sys_ipc_c (void);
8 extern "C" void entry_sys_ipc (void);
9 extern "C" void entry_sys_fast_ipc_log (void);
10 extern "C" void entry_sys_fast_ipc_c (void);
11 extern "C" void entry_sys_fast_ipc (void);
12
13 extern "C" void sys_ipc_wrapper (void);
14 extern "C" void ipc_short_cut_wrapper (void);
15 extern "C" void sys_ipc_log_wrapper (void);
16 extern "C" void sys_ipc_trace_wrapper (void);
17
18 typedef void (Fast_entry_func)(void);
19
20 PUBLIC static
21 void
22 Jdb_set_trace::ia32_set_fast_entry(unsigned cpu, void *entry)
23 {
24   Cpu::cpus.cpu(cpu).set_fast_entry((Fast_entry_func*)entry);
25 }
26
27 struct Set_fast_entry
28 {
29   void *entry;
30   Set_fast_entry(Fast_entry_func *entry) : entry((void*)entry) {}
31   void operator () (unsigned cpu) const
32   { Jdb::remote_work(cpu, Jdb_set_trace::ia32_set_fast_entry, entry, true); }
33 };
34
35 static
36 void
37 Jdb_set_trace::set_ipc_vector()
38 {
39   void (*int30_entry)(void);
40   void (*fast_entry)(void);
41
42   if (Jdb_ipc_trace::_trace || Jdb_ipc_trace::_slow_ipc || 
43       Jdb_ipc_trace::_log   || Jdb_nextper_trace::_log)
44     {
45       int30_entry = entry_sys_ipc_log;
46       fast_entry  = entry_sys_fast_ipc_log;
47     }
48   else
49     {
50       int30_entry = entry_sys_ipc_c;
51       fast_entry  = entry_sys_fast_ipc_c;
52     }
53
54   Idt::set_entry(0x30, (Address) int30_entry, true);
55   Jdb::foreach_cpu(Set_fast_entry(fast_entry));
56
57   if (Jdb_ipc_trace::_trace)
58     syscall_table[0] = sys_ipc_trace_wrapper;
59   else if ((Jdb_ipc_trace::_log && !Jdb_ipc_trace::_slow_ipc) ||
60            Jdb_nextper_trace::_log)            
61     syscall_table[0] = sys_ipc_log_wrapper;
62   else
63     syscall_table[0] = sys_ipc_wrapper;
64 }
65
66 PUBLIC static FIASCO_NOINLINE
67 void
68 Jdb_set_trace::set_cpath()
69 {
70   Jdb_ipc_trace::_cpath = 0;
71   BEGIN_LOG_EVENT("Context switches", "csw", Tb_entry_empty)
72   Jdb_ipc_trace::_cpath = 1;
73   END_LOG_EVENT;
74   BEGIN_LOG_EVENT("Shortcut", "sc", Tb_entry_empty)
75   Jdb_ipc_trace::_cpath = 1;
76   END_LOG_EVENT;
77   set_ipc_vector();
78 }
79
80 void
81 jdb_trace_set_cpath(void)
82 {
83   Jdb_set_trace::set_cpath();
84 }
85
86 IMPLEMENT void
87 Jdb_set_trace::next_preiod_tracing(bool enable)
88 {
89   if (enable)
90     Jdb_nextper_trace::_log = 1;
91   else
92     Jdb_nextper_trace::_log = 0;
93
94   set_ipc_vector();
95 }
96
97 IMPLEMENT void
98 Jdb_set_trace::page_fault_tracing(bool /*enable*/)
99 {
100 }
101
102 IMPLEMENT void
103 Jdb_set_trace::ipc_tracing(Mode mode)
104 {
105   switch (mode)
106     {
107     case Off:
108       Jdb_ipc_trace::_trace = 0;
109       Jdb_ipc_trace::_log = 0;
110       Jdb_ipc_trace::_cshortcut = 0;
111       Jdb_ipc_trace::_slow_ipc = 0;
112       break;
113     case Log:
114       Jdb_ipc_trace::_trace = 0;
115       Jdb_ipc_trace::_log = 1;
116       Jdb_ipc_trace::_log_to_buf = 0;
117       Jdb_ipc_trace::_cshortcut = 0;
118       Jdb_ipc_trace::_slow_ipc = 0;
119       break;
120     case Log_to_buf:
121       Jdb_ipc_trace::_trace = 0;
122       Jdb_ipc_trace::_log = 1;
123       Jdb_ipc_trace::_log_to_buf = 1;
124       Jdb_ipc_trace::_cshortcut = 0;
125       Jdb_ipc_trace::_slow_ipc = 0;
126       break;
127     case Trace:
128       Jdb_ipc_trace::_trace = 1;
129       Jdb_ipc_trace::_cshortcut = 0;
130       Jdb_ipc_trace::_log = 0;
131       Jdb_ipc_trace::_slow_ipc = 0;
132       break;
133     case Use_c_short_cut:
134       Jdb_ipc_trace::_cshortcut = 1;
135       break;
136     case Use_slow_path:
137       Jdb_ipc_trace::_slow_ipc = 1;
138       break;
139     }
140   set_ipc_vector();
141 }
142
143
144 static
145 void
146 Jdb_set_trace::set_unmap_vector()
147 {
148 }
149
150 IMPLEMENT void
151 Jdb_set_trace::unmap_tracing(bool /*enable*/)
152 {
153 }