lkml.org 
[lkml]   [2004]   [Mar]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[KGDB][RFC] Send a fuller T packet
    Hello.  Since a 'T' packet is allowed to send back information on an
    arbitrary number of registers, and on PPC32 we've always been including
    information on the stack pointer and program counter, I was wondering
    what people thought of the following patch:

    diff -u linux-2.6.3/include/asm-x86_64/kgdb.h linux-2.6.3/include/asm-x86_64/kgdb.h
    --- linux-2.6.3/include/asm-x86_64/kgdb.h 2004-02-27 11:30:37.445782703 -0700
    +++ linux-2.6.3/include/asm-x86_64/kgdb.h 2004-03-02 14:42:47.854532793 -0700
    @@ -48,6 +48,10 @@
    /* Number of bytes of registers. */
    #define NUMREGBYTES (_LASTREG*8)

    +#define PC_REGNUM _PC /* Program Counter */
    +#define SP_REGNUM _RSP /* Stack Pointer */
    +#define PTRACE_PC rip /* Program Counter, in ptrace regs. */
    +
    #define BREAKPOINT() asm(" int $3");
    #define BREAK_INSTR_SIZE 1

    diff -u linux-2.6.3/include/asm-i386/kgdb.h linux-2.6.3/include/asm-i386/kgdb.h
    --- linux-2.6.3/include/asm-i386/kgdb.h 2004-02-26 13:14:41.769186750 -0700
    +++ linux-2.6.3/include/asm-i386/kgdb.h 2004-03-02 14:42:03.232624041 -0700
    @@ -43,6 +43,10 @@
    _GS /* 15 */
    };

    +#define PC_REGNUM _PC /* Program Counter */
    +#define SP_REGNUM _ESP /* Stack Pointer */
    +#define PTRACE_PC eip /* Program Counter, in ptrace regs. */
    +
    #define BREAKPOINT() asm(" int $3");
    #define BREAK_INSTR_SIZE 1

    diff -u linux-2.6.3/kernel/kgdb.c linux-2.6.3/kernel/kgdb.c
    --- linux-2.6.3/kernel/kgdb.c 2004-03-02 14:25:42.590401068 -0700
    +++ linux-2.6.3/kernel/kgdb.c 2004-03-02 14:51:51.535627684 -0700
    @@ -695,12 +695,24 @@
    /* Master processor is completely in the debugger */
    kgdb_post_master_code(linux_regs, exVector, err_code);

    + /* If kgdb is connected, then an exception has occured, and
    + * we need to pass something back to GDB. */
    if (kgdb_connected) {
    - /* reply to host that an exception has occurred */
    ptr = remcom_out_buffer;
    *ptr++ = 'T';
    *ptr++ = hexchars[(signo >> 4) % 16];
    *ptr++ = hexchars[signo % 16];
    + *ptr++ = hexchars[(PC_REGNUM >> 4) % 16];
    + *ptr++ = hexchars[PC_REGNUM % 16];
    + *ptr++ = ':';
    + ptr = kgdb_mem2hex((char *)&linux_regs->PTRACE_PC, ptr, 4);
    + *ptr++ = ';';
    + *ptr++ = hexchars[SP_REGNUM >> 4];
    + *ptr++ = hexchars[SP_REGNUM & 0xf];
    + *ptr++ = ':';
    + ptr = kgdb_mem2hex(((char *)linux_regs) + SP_REGNUM * 4, ptr,
    + 4);
    + *ptr++ = ';';
    ptr += strlen(strcpy(ptr, "thread:"));
    int_to_threadref(&thref, shadow_pid(current->pid));
    ptr = pack_threadid(ptr, &thref);
    @@ -728,11 +740,28 @@
    * we clear out our breakpoints now incase
    * GDB is reconnecting. */
    remove_all_break();
    - remcom_out_buffer[0] = 'S';
    - remcom_out_buffer[1] = hexchars[signo >> 4];
    - remcom_out_buffer[2] = hexchars[signo % 16];
    + /* reply to host that an exception has occurred */
    + ptr = remcom_out_buffer;
    + *ptr++ = 'T';
    + *ptr++ = hexchars[(signo >> 4) % 16];
    + *ptr++ = hexchars[signo % 16];
    + *ptr++ = hexchars[(PC_REGNUM >> 4) % 16];
    + *ptr++ = hexchars[PC_REGNUM % 16];
    + *ptr++ = ':';
    + ptr = kgdb_mem2hex((char *)&linux_regs->PTRACE_PC, ptr,
    + 4);
    + *ptr++ = ';';
    + *ptr++ = hexchars[SP_REGNUM >> 4];
    + *ptr++ = hexchars[SP_REGNUM & 0xf];
    + *ptr++ = ':';
    + ptr = kgdb_mem2hex(((char *)linux_regs) + SP_REGNUM * 4,
    + ptr, 4);
    + *ptr++ = ';';
    + ptr += strlen(strcpy(ptr, "thread:"));
    + int_to_threadref(&thref, shadow_pid(current->pid));
    + ptr = pack_threadid(ptr, &thref);
    + *ptr++ = ';';
    break;
    -
    case 'g': /* return the value of the CPU registers */
    thread = kgdb_usethread;

    Is this too much extra stuff to bother with, since that information can
    be gotten elsewhere?

    --
    Tom Rini
    http://gate.crashing.org/~trini/
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 14:01    [W:0.038 / U:31.284 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site