]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
Use PCB/LR from PCB rather from stack on armv7-gdb
authorzbb <zbb@FreeBSD.org>
Fri, 30 Oct 2015 12:37:40 +0000 (12:37 +0000)
committerzbb <zbb@FreeBSD.org>
Fri, 30 Oct 2015 12:37:40 +0000 (12:37 +0000)
The kernel dump does not store these values on the stack.
Use PCB structure to resolve PC and LR properly.

Submitted by:  Wojciech Macek <wma@semihalf.com>
Reviewed by:   jhb, kib
Obtained from: Semihalf
Sponsored by:  Juniper Networks Inc.
Differential Revision: https://reviews.freebsd.org/D4013

gnu/usr.bin/gdb/kgdb/trgt_arm.c

index cb23aa675ec1d033f96ebb0a5d311a51c6b24fa6..d457bd3b43ddfc1eb50437e9b075985ee7334ee6 100644 (file)
@@ -63,7 +63,7 @@ kgdb_trgt_fetch_registers(int regno __unused)
 #ifndef CROSS_DEBUGGER
        struct kthr *kt;
        struct pcb pcb;
-       int i, reg;
+       int i;
 
        kt = kgdb_thr_lookup_tid(ptid_get_pid(inferior_ptid));
        if (kt == NULL)
@@ -76,12 +76,8 @@ kgdb_trgt_fetch_registers(int regno __unused)
                supply_register(i, (char *)&pcb.pcb_regs.sf_r4 +
                    (i - (ARM_A1_REGNUM + 4 )) * 4);
        }
-       if (pcb.pcb_regs.sf_sp != 0) {
-               if (kvm_read(kvm, pcb.pcb_regs.sf_sp + 4 * 4, &reg, 4) != 4)
-                       warnx("kvm_read :%s", kvm_geterr(kvm));
-               else
-                       supply_register(ARM_PC_REGNUM, (char *)&reg);
-       }
+       supply_register(ARM_PC_REGNUM, (char *)&pcb.pcb_regs.sf_pc);
+       supply_register(ARM_LR_REGNUM, (char *)&pcb.pcb_regs.sf_lr);
 #endif
 }