1 IMPLEMENTATION [arm-debug]:
6 #include "jdb_entry_frame.h"
10 #include "static_init.h"
12 #include "outer_cache.h"
13 #include "processor.h"
15 static void outchar(Thread *, Entry_frame *r)
16 { putchar(r->r[0] & 0xff); }
18 static void outstring(Thread *, Entry_frame *r)
19 { putstr((char*)r->r[0]); }
21 static void outnstring(Thread *, Entry_frame *r)
22 { putnstr((char*)r->r[0], r->r[1]); }
24 static void outdec(Thread *, Entry_frame *r)
25 { printf("%ld", r->r[0]); }
27 static void outhex(Thread *, Entry_frame *r)
28 { printf("%08lx", r->r[0]); }
30 static void outhex20(Thread *, Entry_frame *r)
31 { printf("%05lx", r->r[0] & 0xfffff); }
33 static void outhex16(Thread *, Entry_frame *r)
34 { printf("%04lx", r->r[0] & 0xffff); }
36 static void outhex12(Thread *, Entry_frame *r)
37 { printf("%03lx", r->r[0] & 0xfff); }
39 static void outhex8(Thread *, Entry_frame *r)
40 { printf("%02lx", r->r[0] & 0xff); }
42 static void inchar(Thread *, Entry_frame *r)
44 r->r[0] = Vkey::get();
48 static void tbuf(Thread *t, Entry_frame *r)
50 Mem_space *s = t->mem_space();
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.
62 user = entry_frame->from_user();
64 switch (entry_frame->param())
66 case 0: // fiasco_tbuf_get_status()
68 Jdb_status_page_frame *regs =
69 reinterpret_cast<Jdb_status_page_frame*>(entry_frame);
70 regs->set(Mem_layout::Tbuf_ustatus_page);
73 case 1: // fiasco_tbuf_log()
75 Jdb_log_frame *regs = reinterpret_cast<Jdb_log_frame*>(entry_frame);
76 Tb_entry_ke *tb = Jdb_tbuf::new_entry<Tb_entry_ke>();
79 for (len=0; (c = s->peek(str++, user)); len++)
82 regs->set_tb_entry(tb);
83 Jdb_tbuf::commit_entry();
86 case 2: // fiasco_tbuf_clear()
87 Jdb_tbuf::clear_tbuf();
89 case 3: // fiasco_tbuf_dump()
91 case 4: // fiasco_tbuf_log_3val()
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>();
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++)
105 regs->set_tb_entry(tb);
106 Jdb_tbuf::commit_entry();
109 case 5: // fiasco_tbuf_get_status_phys()
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));
116 case 6: // fiasco_timer_disable
117 printf("JDB: no more timer disable\n");
120 case 7: // fiasco_timer_enable
121 printf("JDB: no more timer enable\n");
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>();
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();
138 static void do_cli(Thread *, Entry_frame *r)
139 { r->psr |= Proc::Status_preempt_disabled; }
141 static void do_sti(Thread *, Entry_frame *r)
142 { r->psr &= ~Proc::Status_preempt_disabled; }
144 static void getcpu(Thread *, Entry_frame *r)
146 r->r[0] = cxx::int_value<Cpu_number>(current_cpu());
149 static void init_dbg_extensions()
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;
165 Thread::dbg_extension[0x32] = &do_cli;
166 Thread::dbg_extension[0x33] = &do_sti;
167 Thread::dbg_extension[0x34] = &getcpu;
171 STATIC_INITIALIZER(init_dbg_extensions);