Rev 2918 | Rev 2923 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2918 | Rev 2922 | ||
---|---|---|---|
Line 65... | Line 65... | ||
65 | volatile bool abort_debug; |
65 | volatile bool abort_debug; |
66 | 66 | ||
67 | thash_t thash; |
67 | thash_t thash; |
68 | volatile int paused; |
68 | volatile int paused; |
69 | 69 | ||
- | 70 | breakpoint_t brk_list[MAX_BRKPTS]; |
|
- | 71 | int lifted_brkpt; |
|
- | 72 | ||
70 | void read_line(char *buffer, int n) |
73 | void read_line(char *buffer, int n) |
71 | { |
74 | { |
72 | char c; |
75 | char c; |
73 | int i; |
76 | int i; |
74 | 77 | ||
Line 214... | Line 217... | ||
214 | async_serialize_end(); |
217 | async_serialize_end(); |
215 | 218 | ||
216 | thread_debug_start(hash); |
219 | thread_debug_start(hash); |
217 | } |
220 | } |
218 | 221 | ||
- | 222 | static unsigned buffer[1024]; |
|
- | 223 | ||
219 | void debug_loop(void *thread_hash_arg) |
224 | void debug_loop(void *thread_hash_arg) |
220 | { |
225 | { |
221 | int rc; |
226 | int rc; |
222 | unsigned ev_type; |
227 | unsigned ev_type; |
223 | unsigned thread_hash; |
228 | unsigned thread_hash; |
Line 263... | Line 268... | ||
263 | printf("thread 0x%x exited\n", val0); |
268 | printf("thread 0x%x exited\n", val0); |
264 | abort_debug = true; |
269 | abort_debug = true; |
265 | break; |
270 | break; |
266 | case UDEBUG_EVENT_BREAKPOINT: |
271 | case UDEBUG_EVENT_BREAKPOINT: |
267 | printf("breakpoint reached\n"); |
272 | printf("breakpoint reached\n"); |
- | 273 | rc = udebug_regs_read(app_phone, thread_hash, buffer); |
|
- | 274 | printf("udebug_regs_read -> %d\n", rc); |
|
- | 275 | int eip_idx = 12; |
|
- | 276 | int efl_idx = 14; |
|
- | 277 | printf("EIP was 0x%08x\n", buffer[eip_idx]); |
|
- | 278 | int brk_addr = buffer[eip_idx] - 1; |
|
- | 279 | int bi; |
|
- | 280 | for (bi = 0; bi < MAX_BRKPTS; bi++) |
|
- | 281 | if (brk_list[bi].set && brk_list[bi].addr == brk_addr) |
|
- | 282 | break; |
|
- | 283 | if (bi < MAX_BRKPTS) { |
|
- | 284 | buffer[eip_idx] = brk_addr; |
|
- | 285 | buffer[efl_idx] |= 0x0100; /* trap flag */ |
|
- | 286 | printf("setting EIP to 0x%08x\n", buffer[eip_idx]); |
|
- | 287 | rc = udebug_regs_write(app_phone, thread_hash, buffer); |
|
- | 288 | rc = udebug_mem_write(app_phone, &brk_list[bi].back, brk_addr, 1); |
|
- | 289 | printf("udebug_mem_write(phone, 0x%x, 0x%02x, 1) -> %d\n", brk_addr, brk_list[bi].back, rc); |
|
- | 290 | lifted_brkpt = bi; |
|
- | 291 | } else { |
|
- | 292 | printf("unrecognized breakpoint at 0x%x\n", brk_addr); |
|
- | 293 | } |
|
- | 294 | break; |
|
- | 295 | case UDEBUG_EVENT_TRAP: |
|
- | 296 | printf("trap event\n"); |
|
- | 297 | unsigned char brkinstr[1]; |
|
- | 298 | breakpoint_t *lb = &brk_list[lifted_brkpt]; |
|
268 | usleep(2000*2000); |
299 | brkinstr[0] = 0xcc; |
- | 300 | rc = udebug_mem_write(app_phone, brkinstr, lb->addr, 1); |
|
- | 301 | printf("restore breakpoint -> %d\n", rc); |
|
- | 302 | ||
- | 303 | rc = udebug_regs_read(app_phone, thread_hash, buffer); |
|
- | 304 | printf("udebug_regs_read -> %d\n", rc); |
|
- | 305 | int efl_idx2 = 14; |
|
- | 306 | buffer[efl_idx2] &= ~0x0100; /* trap flag */ |
|
- | 307 | rc = udebug_regs_write(app_phone, thread_hash, buffer); |
|
269 | break; |
308 | break; |
270 | default: |
309 | default: |
271 | printf("unknown event type %d\n", ev_type); |
310 | printf("unknown event type %d\n", ev_type); |
- | 311 | usleep(1000*1000); |
|
272 | break; |
312 | break; |
273 | } |
313 | } |
274 | } |
314 | } |
275 | 315 | ||
276 | } |
316 | } |