]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/jdb/arm/jdb_extensions.cpp
update
[l4.git] / kernel / fiasco / src / jdb / arm / jdb_extensions.cpp
1 IMPLEMENTATION [arm-debug]:
2
3 #include <cstdio>
4 #include <simpleio.h>
5 #include "jdb_tbuf.h"
6 #include "jdb_entry_frame.h"
7 #include "kdb_ke.h"
8 #include "cpu_lock.h"
9 #include "vkey.h"
10 #include "static_init.h"
11 #include "thread.h"
12 #include "outer_cache.h"
13 #include "processor.h"
14
15 static void outchar(Thread *, Entry_frame *r)
16 { putchar(r->r[0] & 0xff); }
17
18 static void outstring(Thread *, Entry_frame *r)
19 { putstr((char*)r->r[0]); }
20
21 static void outnstring(Thread *, Entry_frame *r)
22 { putnstr((char*)r->r[0], r->r[1]); }
23
24 static void outdec(Thread *, Entry_frame *r)
25 { printf("%ld", r->r[0]); }
26
27 static void outhex(Thread *, Entry_frame *r)
28 { printf("%08lx", r->r[0]); }
29
30 static void outhex20(Thread *, Entry_frame *r)
31 { printf("%05lx", r->r[0] & 0xfffff); }
32
33 static void outhex16(Thread *, Entry_frame *r)
34 { printf("%04lx", r->r[0] & 0xffff); }
35
36 static void outhex12(Thread *, Entry_frame *r)
37 { printf("%03lx", r->r[0] & 0xfff); }
38
39 static void outhex8(Thread *, Entry_frame *r)
40 { printf("%02lx", r->r[0] & 0xff); }
41
42 static void inchar(Thread *, Entry_frame *r)
43 {
44   r->r[0] = Vkey::get();
45   Vkey::clear();
46 }
47
48 static void tbuf(Thread *t, Entry_frame *r)
49 {
50   Mem_space *s = t->mem_space();
51   Address ip = r->ip();
52   Address_type user;
53   Unsigned8 *str;
54   int len;
55   char c;
56
57   Jdb_entry_frame *entry_frame = reinterpret_cast<Jdb_entry_frame*>((char *)r - 12);
58   /* Why the -12? The Jdb_entry_frame has three more members in the beginning
59    * (see Trap_state_regs) so we're compensating for this with the -12.
60    * Alex: Proper fix?
61    */
62   user = entry_frame->from_user();
63
64   switch (entry_frame->param())
65     {
66     case 0: // fiasco_tbuf_get_status()
67         {
68           Jdb_status_page_frame *regs =
69             reinterpret_cast<Jdb_status_page_frame*>(entry_frame);
70           regs->set(Mem_layout::Tbuf_ustatus_page);
71         }
72       break;
73     case 1: // fiasco_tbuf_log()
74         {
75           Jdb_log_frame *regs = reinterpret_cast<Jdb_log_frame*>(entry_frame);
76           Tb_entry_ke *tb = Jdb_tbuf::new_entry<Tb_entry_ke>();
77           str = regs->str();
78           tb->set(t, ip-4);
79           for (len=0; (c = s->peek(str++, user)); len++)
80             tb->set_buf(len, c);
81           tb->term_buf(len);
82           regs->set_tb_entry(tb);
83           Jdb_tbuf::commit_entry();
84         }
85       break;
86     case 2: // fiasco_tbuf_clear()
87       Jdb_tbuf::clear_tbuf();
88       break;
89     case 3: // fiasco_tbuf_dump()
90       return; // => Jdb
91     case 4: // fiasco_tbuf_log_3val()
92         {
93           // interrupts are disabled in handle_slow_trap()
94           Jdb_log_3val_frame *regs =
95             reinterpret_cast<Jdb_log_3val_frame*>(entry_frame);
96           Tb_entry_ke_reg *tb = Jdb_tbuf::new_entry<Tb_entry_ke_reg>();
97           str = regs->str();
98           tb->set(t, ip-4);
99           tb->v[0] = regs->val1();
100           tb->v[1] = regs->val2();
101           tb->v[2] = regs->val3();
102           for (len=0; (c = s->peek(str++, user)); len++)
103             tb->set_buf(len, c);
104           tb->term_buf(len);
105           regs->set_tb_entry(tb);
106           Jdb_tbuf::commit_entry();
107         }
108       break;
109     case 5: // fiasco_tbuf_get_status_phys()
110         {
111           Jdb_status_page_frame *regs =
112             reinterpret_cast<Jdb_status_page_frame*>(entry_frame);
113           regs->set(s->virt_to_phys(Mem_layout::Tbuf_ustatus_page));
114         }
115       break;
116     case 6: // fiasco_timer_disable
117       printf("JDB: no more timer disable\n");
118       //Timer::disable();
119       break;
120     case 7: // fiasco_timer_enable
121       printf("JDB: no more timer enable\n");
122       //Timer::enable();
123       break;
124     case 8: // fiasco_tbuf_log_binary()
125       // interrupts are disabled in handle_slow_trap()
126       Jdb_log_frame *regs = reinterpret_cast<Jdb_log_frame*>(entry_frame);
127       Tb_entry_ke_bin *tb = Jdb_tbuf::new_entry<Tb_entry_ke_bin>();
128       str = regs->str();
129       tb->set(t, ip-4);
130       for (len=0; len < Tb_entry_ke_bin::SIZE; len++)
131         tb->set_buf(len, s->peek(str++, user));
132       regs->set_tb_entry(tb);
133       Jdb_tbuf::commit_entry();
134       break;
135     }
136 }
137
138 static void do_cli(Thread *, Entry_frame *r)
139 { r->psr |= Proc::Status_preempt_disabled; }
140
141 static void do_sti(Thread *, Entry_frame *r)
142 { r->psr &= ~Proc::Status_preempt_disabled; }
143
144 static void getcpu(Thread *, Entry_frame *r)
145 {
146   r->r[0] = cxx::int_value<Cpu_number>(current_cpu());
147 }
148
149 static void init_dbg_extensions()
150 {
151   Thread::dbg_extension[0x01] = &outchar;
152   Thread::dbg_extension[0x02] = &outstring;
153   Thread::dbg_extension[0x03] = &outnstring;
154   Thread::dbg_extension[0x04] = &outdec;
155   Thread::dbg_extension[0x05] = &outhex;
156   Thread::dbg_extension[0x06] = &outhex20;
157   Thread::dbg_extension[0x07] = &outhex16;
158   Thread::dbg_extension[0x08] = &outhex12;
159   Thread::dbg_extension[0x09] = &outhex8;
160   Thread::dbg_extension[0x0d] = &inchar;
161   Thread::dbg_extension[0x1d] = &tbuf;
162
163   if (0)
164     {
165       Thread::dbg_extension[0x32] = &do_cli;
166       Thread::dbg_extension[0x33] = &do_sti;
167       Thread::dbg_extension[0x34] = &getcpu;
168     }
169 }
170
171 STATIC_INITIALIZER(init_dbg_extensions);