6 static int test_log_only();
7 static int test_break(char *errbuf, size_t bufsize);
13 #include <sys/types.h> // for pid_t
14 #include "boot_info.h"
17 #include "jdb_kobject.h"
21 Breakpoint::restricted_task()
23 return restrict.task.task;
28 Breakpoint::set(Address _addr, Mword _len, Mode _mode, Log _log)
32 user = ADDR_USER; // we don't allow breakpoints in kernel space
39 Jdb_bp::global_breakpoints()
46 Jdb_bp::read_debug_register(int reg, Space *s)
48 pid_t pid = s ? s->pid() : Boot_info::pid();
50 if (!Usermode::read_debug_register(pid, reg, val))
51 printf("[read debugreg #%d task %p/%lx failed]\n", reg, s,
52 static_cast<Task*>(s)->dbg_id());
59 Jdb_bp::write_debug_register(int reg, Mword val, Space *s)
61 pid_t pid = s ? s->pid() : Boot_info::pid();
62 if (!Usermode::write_debug_register(pid, reg, val))
63 printf("[write %08lx to debugreg #%d task %p/%lx failed]\n", val, reg, s,
64 static_cast<Task*>(s)->dbg_id());
69 Jdb_bp::get_debug_control_register(Space *task)
71 return read_debug_register(7, task);
76 Jdb_bp::set_debug_control_register(Mword val, Space *task)
78 printf("set_debug_control_register\n");
79 for (int i=0; i<4; i++)
80 if (!(val & (2 << 2*i)))
81 val &= ~(0x0f << (16 + 4*i));
82 write_debug_register(7, val, task);
87 Jdb_bp::set_debug_address_register(int num, Mword addr, Mword len,
88 Breakpoint::Mode mode, Task *task)
92 putstr(" => kernel task not allowed for breakpoints");
95 if (num >= 0 && num <= 3)
98 Task *old_task = Kobject::dcast<Task*>(Kobject::id_to_obj(bps[num].restricted_task()));
102 // clear old breakpoint of other process
103 local_dr7 = get_debug_control_register(old_task);
104 clr_dr7(num, local_dr7);
105 set_debug_control_register(local_dr7, old_task);
107 bps[num].restrict_task(0, task->dbg_id());
108 write_debug_register(num, addr, task);
109 local_dr7 = get_debug_control_register(task);
110 clr_dr7(num, local_dr7);
111 set_dr7(num, len, mode, local_dr7);
112 set_debug_control_register(local_dr7, task);
121 Jdb_bp::clr_debug_address_register(int num)
123 Task *task = Kobject::dcast<Task*>(Kobject::id_to_obj(bps[num].restricted_task()));
124 Mword local_dr7 = get_debug_control_register(task);
125 clr_dr7(num, local_dr7);
126 set_debug_control_register(local_dr7, task);
131 Jdb_bp::at_jdb_enter()
136 Jdb_bp::at_jdb_leave()
138 if (Jdb::get_current_active()
139 && Jdb::get_current_active()->space() != Kernel_task::kernel_task())
140 write_debug_register(6, 0, Jdb::get_current_active()->space());
145 Jdb_bp::test_log_only()
147 Space *t = Jdb::get_thread(0)->space();
148 Mword dr6 = read_debug_register(6, t);
150 if (dr6 & 0x0000000f)
153 write_debug_register(6, dr6, t);
154 if (!(dr6 & 0x0000e00f))
155 // don't enter jdb, breakpoints only logged
162 /** @return 1 if breakpoint occured */
165 Jdb_bp::test_break(char *errbuf, size_t bufsize)
167 Space *t = Jdb::get_thread(0)->space();
168 Mword dr6 = read_debug_register(6, t);
170 if (!(dr6 & 0x000000f))
173 test_break(dr6, errbuf, bufsize);
174 write_debug_register(6, dr6 & ~0x0000000f, t);
182 Jdb::bp_test_log_only = test_log_only;
183 Jdb::bp_test_break = test_break;