aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/debug
diff options
context:
space:
mode:
authorJason Wessel <jason.wessel@windriver.com>2010-08-05 10:22:22 -0400
committerJason Wessel <jason.wessel@windriver.com>2010-08-05 10:22:22 -0400
commit6d855b1d83c980c1283d98d2d63a2bd3a87e21b7 (patch)
treed510c23f3387520b027ba30403db5981e82d3e90 /kernel/debug
parent55751145dc1e08e16df418cdd101661f5c6ac991 (diff)
gdbstub: do not directly use dbg_reg_def[] in gdb_cmd_reg_set()
Presently the usable registers definitions on x86 are not contiguous for kgdb. The x86 kgdb uses a case statement for the sparse register accesses. The array which defines the registers (dbg_reg_def) should not be used directly in order to safely work with sparse register definitions. Specifically there was a problem when gdb accesses ORIG_AX, which is accessed only through the case statement. This patch encodes register memory using the size information provided from the debugger which avoids the need to look up the size of the register. The dbg_set_reg() function always further validates the inputs from the debugger. Signed-off-by: Jason Wessel <jason.wessel@windriver.com> Signed-off-by: Dongdong Deng <dongdong.deng@windriver.com>
Diffstat (limited to 'kernel/debug')
-rw-r--r--kernel/debug/gdbstub.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/kernel/debug/gdbstub.c b/kernel/debug/gdbstub.c
index 4ef9dddf4588..fc7b174c4718 100644
--- a/kernel/debug/gdbstub.c
+++ b/kernel/debug/gdbstub.c
@@ -604,6 +604,7 @@ static void gdb_cmd_reg_set(struct kgdb_state *ks)
604{ 604{
605 unsigned long regnum; 605 unsigned long regnum;
606 char *ptr = &remcom_in_buffer[1]; 606 char *ptr = &remcom_in_buffer[1];
607 int i = 0;
607 608
608 kgdb_hex2long(&ptr, &regnum); 609 kgdb_hex2long(&ptr, &regnum);
609 if (*ptr++ != '=' || 610 if (*ptr++ != '=' ||
@@ -612,7 +613,14 @@ static void gdb_cmd_reg_set(struct kgdb_state *ks)
612 error_packet(remcom_out_buffer, -EINVAL); 613 error_packet(remcom_out_buffer, -EINVAL);
613 return; 614 return;
614 } 615 }
615 kgdb_hex2mem(ptr, (char *)gdb_regs, dbg_reg_def[regnum].size); 616 memset(gdb_regs, 0, sizeof(gdb_regs));
617 while (i < sizeof(gdb_regs) * 2)
618 if (hex_to_bin(ptr[i]) >= 0)
619 i++;
620 else
621 break;
622 i = i / 2;
623 kgdb_hex2mem(ptr, (char *)gdb_regs, i);
616 dbg_set_reg(regnum, gdb_regs, ks->linux_regs); 624 dbg_set_reg(regnum, gdb_regs, ks->linux_regs);
617 strcpy(remcom_out_buffer, "OK"); 625 strcpy(remcom_out_buffer, "OK");
618} 626}