diff options
Diffstat (limited to 'kernel/debug')
| -rw-r--r-- | kernel/debug/gdbstub.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/kernel/debug/gdbstub.c b/kernel/debug/gdbstub.c index 3517fd71963..e117cfd7588 100644 --- a/kernel/debug/gdbstub.c +++ b/kernel/debug/gdbstub.c | |||
| @@ -367,28 +367,31 @@ static void error_packet(char *pkt, int error) | |||
| 367 | * remapped to negative TIDs. | 367 | * remapped to negative TIDs. |
| 368 | */ | 368 | */ |
| 369 | 369 | ||
| 370 | #define BUF_THREAD_ID_SIZE 16 | 370 | #define BUF_THREAD_ID_SIZE 8 |
| 371 | 371 | ||
| 372 | static char *pack_threadid(char *pkt, unsigned char *id) | 372 | static char *pack_threadid(char *pkt, unsigned char *id) |
| 373 | { | 373 | { |
| 374 | char *limit; | 374 | unsigned char *limit; |
| 375 | int lzero = 1; | ||
| 376 | |||
| 377 | limit = id + (BUF_THREAD_ID_SIZE / 2); | ||
| 378 | while (id < limit) { | ||
| 379 | if (!lzero || *id != 0) { | ||
| 380 | pkt = pack_hex_byte(pkt, *id); | ||
| 381 | lzero = 0; | ||
| 382 | } | ||
| 383 | id++; | ||
| 384 | } | ||
| 375 | 385 | ||
| 376 | limit = pkt + BUF_THREAD_ID_SIZE; | 386 | if (lzero) |
| 377 | while (pkt < limit) | 387 | pkt = pack_hex_byte(pkt, 0); |
| 378 | pkt = pack_hex_byte(pkt, *id++); | ||
| 379 | 388 | ||
| 380 | return pkt; | 389 | return pkt; |
| 381 | } | 390 | } |
| 382 | 391 | ||
| 383 | static void int_to_threadref(unsigned char *id, int value) | 392 | static void int_to_threadref(unsigned char *id, int value) |
| 384 | { | 393 | { |
| 385 | unsigned char *scan; | 394 | put_unaligned_be32(value, id); |
| 386 | int i = 4; | ||
| 387 | |||
| 388 | scan = (unsigned char *)id; | ||
| 389 | while (i--) | ||
| 390 | *scan++ = 0; | ||
| 391 | put_unaligned_be32(value, scan); | ||
| 392 | } | 395 | } |
| 393 | 396 | ||
| 394 | static struct task_struct *getthread(struct pt_regs *regs, int tid) | 397 | static struct task_struct *getthread(struct pt_regs *regs, int tid) |
| @@ -601,7 +604,7 @@ static void gdb_cmd_query(struct kgdb_state *ks) | |||
| 601 | { | 604 | { |
| 602 | struct task_struct *g; | 605 | struct task_struct *g; |
| 603 | struct task_struct *p; | 606 | struct task_struct *p; |
| 604 | unsigned char thref[8]; | 607 | unsigned char thref[BUF_THREAD_ID_SIZE]; |
| 605 | char *ptr; | 608 | char *ptr; |
| 606 | int i; | 609 | int i; |
| 607 | int cpu; | 610 | int cpu; |
| @@ -621,8 +624,7 @@ static void gdb_cmd_query(struct kgdb_state *ks) | |||
| 621 | for_each_online_cpu(cpu) { | 624 | for_each_online_cpu(cpu) { |
| 622 | ks->thr_query = 0; | 625 | ks->thr_query = 0; |
| 623 | int_to_threadref(thref, -cpu - 2); | 626 | int_to_threadref(thref, -cpu - 2); |
| 624 | pack_threadid(ptr, thref); | 627 | ptr = pack_threadid(ptr, thref); |
| 625 | ptr += BUF_THREAD_ID_SIZE; | ||
| 626 | *(ptr++) = ','; | 628 | *(ptr++) = ','; |
| 627 | i++; | 629 | i++; |
| 628 | } | 630 | } |
| @@ -631,8 +633,7 @@ static void gdb_cmd_query(struct kgdb_state *ks) | |||
| 631 | do_each_thread(g, p) { | 633 | do_each_thread(g, p) { |
| 632 | if (i >= ks->thr_query && !finished) { | 634 | if (i >= ks->thr_query && !finished) { |
| 633 | int_to_threadref(thref, p->pid); | 635 | int_to_threadref(thref, p->pid); |
| 634 | pack_threadid(ptr, thref); | 636 | ptr = pack_threadid(ptr, thref); |
| 635 | ptr += BUF_THREAD_ID_SIZE; | ||
| 636 | *(ptr++) = ','; | 637 | *(ptr++) = ','; |
| 637 | ks->thr_query++; | 638 | ks->thr_query++; |
| 638 | if (ks->thr_query % KGDB_MAX_THREAD_QUERY == 0) | 639 | if (ks->thr_query % KGDB_MAX_THREAD_QUERY == 0) |
| @@ -851,7 +852,7 @@ int gdb_serial_stub(struct kgdb_state *ks) | |||
| 851 | memset(remcom_out_buffer, 0, sizeof(remcom_out_buffer)); | 852 | memset(remcom_out_buffer, 0, sizeof(remcom_out_buffer)); |
| 852 | 853 | ||
| 853 | if (kgdb_connected) { | 854 | if (kgdb_connected) { |
| 854 | unsigned char thref[8]; | 855 | unsigned char thref[BUF_THREAD_ID_SIZE]; |
| 855 | char *ptr; | 856 | char *ptr; |
| 856 | 857 | ||
| 857 | /* Reply to host that an exception has occurred */ | 858 | /* Reply to host that an exception has occurred */ |
