gdbstub: do not directly use dbg_reg_def[] in gdb_cmd_reg_set()
authorJason Wessel <jason.wessel@windriver.com>
Thu, 5 Aug 2010 14:22:22 +0000 (09:22 -0500)
committerJason Wessel <jason.wessel@windriver.com>
Thu, 5 Aug 2010 14:22:22 +0000 (09:22 -0500)
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>
kernel/debug/gdbstub.c

index 4ef9dddf4588a33196104e079292fb1b3198948d..fc7b174c4718bbd8d759f00209c119a1519bad2e 100644 (file)
@@ -604,6 +604,7 @@ static void gdb_cmd_reg_set(struct kgdb_state *ks)
 {
        unsigned long regnum;
        char *ptr = &remcom_in_buffer[1];
+       int i = 0;
 
        kgdb_hex2long(&ptr, &regnum);
        if (*ptr++ != '=' ||
@@ -612,7 +613,14 @@ static void gdb_cmd_reg_set(struct kgdb_state *ks)
                error_packet(remcom_out_buffer, -EINVAL);
                return;
        }
-       kgdb_hex2mem(ptr, (char *)gdb_regs, dbg_reg_def[regnum].size);
+       memset(gdb_regs, 0, sizeof(gdb_regs));
+       while (i < sizeof(gdb_regs) * 2)
+               if (hex_to_bin(ptr[i]) >= 0)
+                       i++;
+               else
+                       break;
+       i = i / 2;
+       kgdb_hex2mem(ptr, (char *)gdb_regs, i);
        dbg_set_reg(regnum, gdb_regs, ks->linux_regs);
        strcpy(remcom_out_buffer, "OK");
 }