Module Name: src Committed By: christos Date: Wed Nov 29 03:35:16 UTC 2017
Modified Files: src/external/gpl3/gdb/dist/gdb: alpha-nbsd-tdep.c amd64-nbsd-nat.c amd64-nbsd-tdep.c arm-nbsd-nat.c arm-nbsd-tdep.c hppa-nbsd-nat.c hppa-nbsd-tdep.c i386-nbsd-nat.c i386-nbsd-tdep.c mips-nbsd-nat.c mips-nbsd-tdep.c mips-nbsd-tdep.h ppc-nbsd-nat.c ppc-nbsd-tdep.c ppc-nbsd-tdep.h sh-nbsd-nat.c sh-nbsd-tdep.c sparc-nbsd-nat.c sparc-nbsd-tdep.c sparc64-nbsd-nat.c sparc64-nbsd-tdep.c vax-nbsd-tdep.c src/external/gpl3/gdb/dist/gdb/config/alpha: nbsd.mh src/external/gpl3/gdb/dist/gdb/config/arm: nbsdelf.mh src/external/gpl3/gdb/dist/gdb/config/i386: nbsd64.mh nbsdelf.mh src/external/gpl3/gdb/dist/gdb/config/m68k: nbsdelf.mh src/external/gpl3/gdb/dist/gdb/config/mips: nbsd.mh src/external/gpl3/gdb/dist/gdb/config/pa: nbsd.mh src/external/gpl3/gdb/dist/gdb/config/powerpc: nbsd.mh ppc64-nbsd.mh src/external/gpl3/gdb/dist/gdb/config/sh: nbsd.mh src/external/gpl3/gdb/dist/gdb/config/sparc: nbsd64.mh nbsdelf.mh src/external/gpl3/gdb/dist/gdb/config/vax: nbsdelf.mh Log Message: bring back all our foonbsd-{nat,tdep} files as foo-nbsd-{nat,tdep}. Account for that in the config glue. To generate a diff of this commit: cvs rdiff -u -r1.1.1.1 -r1.2 src/external/gpl3/gdb/dist/gdb/alpha-nbsd-tdep.c \ src/external/gpl3/gdb/dist/gdb/amd64-nbsd-nat.c \ src/external/gpl3/gdb/dist/gdb/amd64-nbsd-tdep.c \ src/external/gpl3/gdb/dist/gdb/arm-nbsd-nat.c \ src/external/gpl3/gdb/dist/gdb/arm-nbsd-tdep.c \ src/external/gpl3/gdb/dist/gdb/hppa-nbsd-nat.c \ src/external/gpl3/gdb/dist/gdb/hppa-nbsd-tdep.c \ src/external/gpl3/gdb/dist/gdb/i386-nbsd-nat.c \ src/external/gpl3/gdb/dist/gdb/i386-nbsd-tdep.c \ src/external/gpl3/gdb/dist/gdb/mips-nbsd-nat.c \ src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.c \ src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.h \ src/external/gpl3/gdb/dist/gdb/ppc-nbsd-nat.c \ src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.c \ src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.h \ src/external/gpl3/gdb/dist/gdb/sh-nbsd-nat.c \ src/external/gpl3/gdb/dist/gdb/sh-nbsd-tdep.c \ src/external/gpl3/gdb/dist/gdb/sparc-nbsd-nat.c \ src/external/gpl3/gdb/dist/gdb/sparc-nbsd-tdep.c \ src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-nat.c \ src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-tdep.c \ src/external/gpl3/gdb/dist/gdb/vax-nbsd-tdep.c cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gdb/dist/gdb/config/alpha/nbsd.mh cvs rdiff -u -r1.5 -r1.6 src/external/gpl3/gdb/dist/gdb/config/arm/nbsdelf.mh cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gdb/dist/gdb/config/i386/nbsd64.mh cvs rdiff -u -r1.3 -r1.4 \ src/external/gpl3/gdb/dist/gdb/config/i386/nbsdelf.mh cvs rdiff -u -r1.3 -r1.4 \ src/external/gpl3/gdb/dist/gdb/config/m68k/nbsdelf.mh cvs rdiff -u -r1.5 -r1.6 src/external/gpl3/gdb/dist/gdb/config/mips/nbsd.mh cvs rdiff -u -r1.2 -r1.3 src/external/gpl3/gdb/dist/gdb/config/pa/nbsd.mh cvs rdiff -u -r1.3 -r1.4 \ src/external/gpl3/gdb/dist/gdb/config/powerpc/nbsd.mh cvs rdiff -u -r1.2 -r1.3 \ src/external/gpl3/gdb/dist/gdb/config/powerpc/ppc64-nbsd.mh cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gdb/dist/gdb/config/sh/nbsd.mh cvs rdiff -u -r1.3 -r1.4 \ src/external/gpl3/gdb/dist/gdb/config/sparc/nbsd64.mh \ src/external/gpl3/gdb/dist/gdb/config/sparc/nbsdelf.mh cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gdb/dist/gdb/config/vax/nbsdelf.mh Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/gpl3/gdb/dist/gdb/alpha-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/alpha-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/alpha-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/alpha-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:04 2017 +++ src/external/gpl3/gdb/dist/gdb/alpha-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/alpha. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. @@ -28,13 +28,19 @@ #include "value.h" #include "alpha-tdep.h" -#include "alpha-bsd-tdep.h" +#include "alphabsd-tdep.h" #include "nbsd-tdep.h" #include "solib-svr4.h" +#include "trad-frame.h" +#include "frame-unwind.h" +#include "tramp-frame.h" #include "target.h" /* Core file support. */ +/* Even though NetBSD/alpha used ELF since day one, it used the + traditional a.out-style core dump format before NetBSD 1.6. */ + /* Sizeof `struct reg' in <machine/reg.h>. */ #define ALPHANBSD_SIZEOF_GREGS (32 * 8) @@ -168,31 +174,95 @@ alphanbsd_iterate_over_regset_sections ( /* Signal trampolines. */ +static void +alphanbsd_sigtramp_cache_init (const struct tramp_frame *, + struct frame_info *, + struct trad_frame_cache *, + CORE_ADDR); /* Under NetBSD/alpha, signal handler invocations can be identified by the designated code sequence that is used to return from a signal handler. In particular, the return address of a signal handler points to the - following code sequence: + following code sequences: */ +static const struct tramp_frame alphanbsd_sigtramp_sc1 = { + SIGTRAMP_FRAME, + 4, + { + { 0xa61e0000, 0xffffffff }, /* ldq a0, 0(sp) */ + { 0x23de0010, 0xffffffff }, /* lda sp, 16(sp) */ + { 0x201f0127, 0xffffffff }, /* lda v0, 295 */ + { 0x00000083, 0xffffffff }, /* call_pal callsys */ + { TRAMP_SENTINEL_INSN, -1 } + }, + alphanbsd_sigtramp_cache_init +}; - ldq a0, 0(sp) - lda sp, 16(sp) - lda v0, 295(zero) # __sigreturn14 - call_pal callsys - - Each instruction has a unique encoding, so we simply attempt to match - the instruction the PC is pointing to with any of the above instructions. - If there is a hit, we know the offset to the start of the designated - sequence and can then check whether we really are executing in the - signal trampoline. If not, -1 is returned, otherwise the offset from the - start of the return sequence is returned. */ -static const gdb_byte sigtramp_retcode[] = -{ - 0x00, 0x00, 0x1e, 0xa6, /* ldq a0, 0(sp) */ - 0x10, 0x00, 0xde, 0x23, /* lda sp, 16(sp) */ - 0x27, 0x01, 0x1f, 0x20, /* lda v0, 295(zero) */ - 0x83, 0x00, 0x00, 0x00, /* call_pal callsys */ +/* The siginfo signal trampoline for NetBSD/alpha introduced in 2.0 */ +static const struct tramp_frame alphanbsd_sigtramp_si2 = +{ + SIGTRAMP_FRAME, + 4, + { + { 0x221e0080, -1 }, /* lda a0,128(sp) */ + { 0x201f0134, -1 }, /* lda v0,308 */ + { 0x00000083, -1 }, /* callsys */ + { 0x47e00410, -1 }, /* mov v0,a0 */ + { 0x201f0001, -1 }, /* lda v0,1 */ + { 0x00000083, -1 }, /* callsys */ + { TRAMP_SENTINEL_INSN, -1 } + }, + alphanbsd_sigtramp_cache_init }; -#define RETCODE_NWORDS 4 -#define RETCODE_SIZE (RETCODE_NWORDS * 4) +/* The siginfo signal trampoline for NetBSD/alpha introduced in 4.0 */ +static const struct tramp_frame alphanbsd_sigtramp_si4 = +{ + SIGTRAMP_FRAME, + 4, + { + { 0x27ba0000, 0xffff0000 }, + { 0x23bd0000, 0xffff0000 }, /* ldgp gp,0(ra) */ + { 0x221e0080, -1 }, /* lda a0,128(sp) */ + { 0x201f0134, -1 }, /* lda v0,308 */ + { 0x00000083, -1 }, /* callsys */ + { 0x221fffff, -1 }, /* lda a0,-1 */ + { 0x201f0001, -1 }, /* lda v0,1 */ + { 0x00000083, -1 }, /* callsys */ + { TRAMP_SENTINEL_INSN, -1 } + }, + alphanbsd_sigtramp_cache_init +}; + +static void +alphanbsd_sigtramp_cache_init (const struct tramp_frame *self, + struct frame_info *this_frame, + struct trad_frame_cache *this_cache, + CORE_ADDR func) +{ + struct gdbarch *gdbarch = get_frame_arch (this_frame); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + CORE_ADDR addr, sp; + int i; + + sp = get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM); + + if (self == &alphanbsd_sigtramp_sc1) { + addr = sp; + } else { + addr = sp + 128 + 56; + } + + for (i = 0; i < 32; i++, addr += ALPHA_REGISTER_SIZE) + { + trad_frame_set_reg_addr (this_cache, i, addr); + } + trad_frame_set_reg_addr (this_cache, ALPHA_PC_REGNUM, addr); + + /* Construct the frame ID using the function start. */ + trad_frame_set_id (this_cache, frame_id_build (sp, func)); +} + +#ifdef notyet +#define RETCODE_NWORDS 4 +#define RETCODE_SIZE (RETCODE_NWORDS * 4) static LONGEST alphanbsd_sigtramp_offset (struct gdbarch *gdbarch, CORE_ADDR pc) @@ -242,6 +312,7 @@ alphanbsd_sigcontext_addr (struct frame_ return 0; return get_frame_base (get_next_frame (frame)); } +#endif static void @@ -259,32 +330,49 @@ alphanbsd_init_abi (struct gdbarch_info /* NetBSD/alpha does not provide single step support via ptrace(2); we must use software single-stepping. */ set_gdbarch_software_single_step (gdbarch, alpha_software_single_step); - /* NetBSD/alpha has SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); + set_gdbarch_skip_solib_resolver (gdbarch, nbsd_skip_solib_resolver); +#ifdef notyet tdep->dynamic_sigtramp_offset = alphanbsd_sigtramp_offset; tdep->pc_in_sigtramp = alphanbsd_pc_in_sigtramp; tdep->sigcontext_addr = alphanbsd_sigcontext_addr; +#endif tdep->jb_pc = 2; tdep->jb_elt_size = 8; + tramp_frame_prepend_unwinder (gdbarch, &alphanbsd_sigtramp_sc1); + tramp_frame_prepend_unwinder (gdbarch, &alphanbsd_sigtramp_si2); + tramp_frame_prepend_unwinder (gdbarch, &alphanbsd_sigtramp_si4); + set_gdbarch_iterate_over_regset_sections (gdbarch, alphanbsd_iterate_over_regset_sections); } +static enum gdb_osabi +alphanbsd_core_osabi_sniffer (bfd *abfd) +{ + if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0) + return GDB_OSABI_NETBSD; + + return GDB_OSABI_UNKNOWN; +} + + /* Provide a prototype to silence -Wmissing-prototypes. */ void _initialize_alphanbsd_tdep (void); void _initialize_alphanbsd_tdep (void) { - /* Even though NetBSD/alpha used ELF since day one, it used the - traditional a.out-style core dump format before NetBSD 1.6, but - we don't support those. */ + /* BFD doesn't set a flavour for NetBSD style a.out core files. */ + gdbarch_register_osabi_sniffer (bfd_arch_alpha, bfd_target_unknown_flavour, + alphanbsd_core_osabi_sniffer); + gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_NETBSD, alphanbsd_init_abi); } Index: src/external/gpl3/gdb/dist/gdb/amd64-nbsd-nat.c diff -u src/external/gpl3/gdb/dist/gdb/amd64-nbsd-nat.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/amd64-nbsd-nat.c:1.2 --- src/external/gpl3/gdb/dist/gdb/amd64-nbsd-nat.c:1.1.1.1 Tue Nov 28 13:18:06 2017 +++ src/external/gpl3/gdb/dist/gdb/amd64-nbsd-nat.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Native-dependent code for NetBSD/amd64. - Copyright (C) 2003-2017 Free Software Foundation, Inc. + Copyright (C) 2003-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -23,6 +23,23 @@ #include "nbsd-nat.h" #include "amd64-tdep.h" #include "amd64-nat.h" +#include "regcache.h" +#include "gdbcore.h" +#include "bsd-kvm.h" + +#include <machine/frame.h> +#include <machine/pcb.h> +#include <machine/reg.h> + +#ifndef HAVE_GREGSET_T +typedef struct reg gregset_t; +#endif + +#ifndef HAVE_FPREGSET_T +typedef struct fpreg fpregset_t; +#endif + +#include "gregset.h" /* Mapping between the general-purpose registers in NetBSD/amd64 `struct reg' format and GDB's register cache layout for @@ -54,6 +71,96 @@ static int amd64nbsd32_r_reg_offset[] = }; +static int +amd64nbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) +{ + struct switchframe sf; + int regnum; + long zero = 0; + + /* The following is true for NetBSD/amd64: + + The pcb contains the stack pointer at the point of the context + switch in cpu_switchto(). At that point we have a stack frame as + described by `struct switchframe', which for NetBSD/amd64 has the + following layout: + + interrupt level + %r15 + %r14 + %r13 + %r12 + %rbx + return address + + Together with %rsp in the pcb, this accounts for all callee-saved + registers specified by the psABI. From this information we + reconstruct the register state as it would look when we just + returned from cpu_switchto(). + + For kernel core dumps, dumpsys() builds a fake switchframe for us. */ + + /* The stack pointer shouldn't be zero. */ + if (pcb->pcb_rsp == 0) + return 0; + + /* Read the stack frame, and check its validity. */ + read_memory (pcb->pcb_rsp, (gdb_byte *) &sf, sizeof sf); + pcb->pcb_rsp += sizeof (struct switchframe); + regcache_raw_supply (regcache, 12, &sf.sf_r12); + regcache_raw_supply (regcache, 13, &sf.sf_r13); + regcache_raw_supply (regcache, 14, &sf.sf_r14); + regcache_raw_supply (regcache, 15, &sf.sf_r15); + regcache_raw_supply (regcache, AMD64_RBX_REGNUM, &sf.sf_rbx); + regcache_raw_supply (regcache, AMD64_RIP_REGNUM, &sf.sf_rip); + + regcache_raw_supply (regcache, AMD64_RSP_REGNUM, &pcb->pcb_rsp); + regcache_raw_supply (regcache, AMD64_RBP_REGNUM, &pcb->pcb_rbp); + regcache_raw_supply (regcache, AMD64_FS_REGNUM, &pcb->pcb_fs); + regcache_raw_supply (regcache, AMD64_GS_REGNUM, &pcb->pcb_gs); + + return 1; +} + +void +supply_gregset (struct regcache *regcache, const gregset_t *gregsetp) +{ + amd64_supply_native_gregset (regcache, gregsetp, -1); +} + +/* Fill register REGNUM (if it is a general-purpose register) in + *GREGSETP with the value in GDB's register cache. If REGNUM is -1, + do this for all registers. */ + +void +fill_gregset (const struct regcache *regcache, + gregset_t *gregsetp, int regnum) +{ + amd64_collect_native_gregset (regcache, gregsetp, regnum); +} + +/* Transfering floating-point registers between GDB, inferiors and cores. */ + +/* Fill GDB's register cache with the floating-point and SSE register + values in *FPREGSETP. */ + +void +supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp) +{ + amd64_supply_fxsave (regcache, -1, fpregsetp); +} + +/* Fill register REGNUM (if it is a floating-point or SSE register) in + *FPREGSETP with the value in GDB's register cache. If REGNUM is + -1, do this for all registers. */ + +void +fill_fpregset (const struct regcache *regcache, + fpregset_t *fpregsetp, int regnum) +{ + amd64_collect_fxsave (regcache, regnum, fpregsetp); +} + /* Provide a prototype to silence -Wmissing-prototypes. */ void _initialize_amd64nbsd_nat (void); @@ -70,4 +177,7 @@ _initialize_amd64nbsd_nat (void) t = amd64bsd_target (); t->to_pid_to_exec_file = nbsd_pid_to_exec_file; add_target (t); + + /* Support debugging kernel virtual memory images. */ + bsd_kvm_add_target (amd64nbsd_supply_pcb); } Index: src/external/gpl3/gdb/dist/gdb/amd64-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/amd64-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/amd64-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/amd64-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:24 2017 +++ src/external/gpl3/gdb/dist/gdb/amd64-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/amd64. - Copyright (C) 2003-2017 Free Software Foundation, Inc. + Copyright (C) 2003-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -27,6 +27,8 @@ #include "amd64-tdep.h" #include "nbsd-tdep.h" #include "solib-svr4.h" +#include "trad-frame.h" +#include "frame-unwind.h" /* Support for signal handlers. */ @@ -93,6 +95,178 @@ int amd64nbsd_r_reg_offset[] = 15 * 8 /* %gs */ }; +/* Kernel debugging support */ +static const int amd64nbsd_tf_reg_offset[] = +{ + 18 * 8, /* %rax */ + 17 * 8, /* %rbx */ + 10 * 8, /* %rcx */ + 2 * 8, /* %rdx */ + 1 * 8, /* %rsi */ + 0 * 8, /* %rdi */ + 16 * 8, /* %rbp */ + 28 * 8, /* %rsp */ + 4 * 8, /* %r8 .. */ + 5 * 8, + 3 * 8, + 11 * 8, + 12 * 8, + 13 * 8, + 14 * 8, + 15 * 8, /* ... %r15 */ + 25 * 8, /* %rip */ + 27 * 8, /* %eflags */ + 26 * 8, /* %cs */ + 29 * 8, /* %ss */ + 22 * 8, /* %ds */ + 21 * 8, /* %es */ + 20 * 8, /* %fs */ + 19 * 8, /* %gs */ +}; + +static struct trad_frame_cache * +amd64nbsd_trapframe_cache(struct frame_info *this_frame, void **this_cache) +{ + struct trad_frame_cache *cache; + CORE_ADDR func, sp, addr; + ULONGEST cs = 0, rip = 0; + const char *name; + int i; + struct gdbarch *gdbarch = get_frame_arch (this_frame); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + + if (*this_cache) + return (struct trad_frame_cache *)*this_cache; + + cache = trad_frame_cache_zalloc (this_frame); + *this_cache = cache; + + func = get_frame_func (this_frame); + sp = get_frame_register_unsigned (this_frame, AMD64_RSP_REGNUM); + + find_pc_partial_function (func, &name, NULL, NULL); + + /* There is an extra 'call' in the interrupt sequence - ignore the extra + * return address */ + if (name && strncmp (name, "Xintr", 5) == 0) + addr = sp + 8; /* It's an interrupt frame. */ + else + addr = sp; + + for (i = 0; i < ARRAY_SIZE (amd64nbsd_tf_reg_offset); i++) + if (amd64nbsd_tf_reg_offset[i] != -1) + trad_frame_set_reg_addr (cache, i, addr + amd64nbsd_tf_reg_offset[i]); + + /* Read %cs and %rip when we have the addresses to hand */ + cs = read_memory_unsigned_integer (addr + + amd64nbsd_tf_reg_offset[AMD64_CS_REGNUM], 8, byte_order); + rip = read_memory_unsigned_integer (addr + + amd64nbsd_tf_reg_offset[AMD64_RIP_REGNUM], 8, byte_order); + + /* The trap frame layout was changed lf the %rip value is less than 2^16 it + * is almost certainly the %ss of the old format. */ + if (rip < (1 << 16)) + { + + for (i = 0; i < ARRAY_SIZE (amd64nbsd_tf_reg_offset); i++) + { + + if (amd64nbsd_tf_reg_offset[i] == -1) + continue; + + trad_frame_set_reg_addr (cache, i, addr + amd64nbsd_r_reg_offset[i]); + + /* Read %cs when we have the address to hand */ + if (i == AMD64_CS_REGNUM) + cs = read_memory_unsigned_integer (addr + amd64nbsd_r_reg_offset[i], + 8, byte_order); + } + } + + if ((cs & I386_SEL_RPL) == I386_SEL_UPL || + (name && strncmp(name, "Xsoft", 5) == 0)) + { + /* Trap from user space or soft interrupt; terminate backtrace. */ + trad_frame_set_id (cache, outer_frame_id); + } + else + { + /* Construct the frame ID using the function start. */ + trad_frame_set_id (cache, frame_id_build (sp + 16, func)); + } + + return cache; +} + +static void +amd64nbsd_trapframe_this_id (struct frame_info *this_frame, + void **this_cache, + struct frame_id *this_id) +{ + struct trad_frame_cache *cache = + amd64nbsd_trapframe_cache (this_frame, this_cache); + + trad_frame_get_id (cache, this_id); +} + +static struct value * +amd64nbsd_trapframe_prev_register (struct frame_info *this_frame, + void **this_cache, int regnum) +{ + struct trad_frame_cache *cache = + amd64nbsd_trapframe_cache (this_frame, this_cache); + + return trad_frame_get_register (cache, this_frame, regnum); +} + +static int +amd64nbsd_trapframe_sniffer (const struct frame_unwind *self, + struct frame_info *this_frame, + void **this_prologue_cache) +{ + ULONGEST cs = 0; + const char *name; + volatile struct gdb_exception ex; + + TRY + { + cs = get_frame_register_unsigned (this_frame, AMD64_CS_REGNUM); + } + CATCH (ex, RETURN_MASK_ERROR) + { + if (ex.reason < 0 && ex.error != NOT_AVAILABLE_ERROR) + throw_exception (ex); + } + END_CATCH + if ((cs & I386_SEL_RPL) == I386_SEL_UPL) + return 0; + + find_pc_partial_function (get_frame_pc (this_frame), &name, NULL, NULL); + return (name && ((strcmp (name, "alltraps") == 0) + || (strcmp (name, "calltrap") == 0) + || (strncmp (name, "Xtrap", 5) == 0) + || (strcmp (name, "osyscall1") == 0) + || (strcmp (name, "Xsyscall") == 0) + || (strncmp (name, "Xintr", 5) == 0) + || (strncmp (name, "Xresume", 7) == 0) + || (strncmp (name, "Xstray", 6) == 0) + || (strncmp (name, "Xrecurse", 8) == 0) + || (strncmp (name, "Xsoft", 5) == 0) + || (strcmp (name, "Xdoreti") == 0))); +} + +static const struct frame_unwind amd64nbsd_trapframe_unwind = { + /* FIXME: kettenis/20051219: This really is more like an interrupt + frame, but SIGTRAMP_FRAME would print <signal handler called>, + which really is not what we want here. */ + NORMAL_FRAME, + default_frame_unwind_stop_reason, + amd64nbsd_trapframe_this_id, + amd64nbsd_trapframe_prev_register, + NULL, + amd64nbsd_trapframe_sniffer +}; + static void amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { @@ -116,6 +290,8 @@ amd64nbsd_init_abi (struct gdbarch_info /* NetBSD uses SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); + /* Unwind kernel trap frames correctly. */ + frame_unwind_prepend_unwinder (gdbarch, &amd64nbsd_trapframe_unwind); } Index: src/external/gpl3/gdb/dist/gdb/arm-nbsd-nat.c diff -u src/external/gpl3/gdb/dist/gdb/arm-nbsd-nat.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/arm-nbsd-nat.c:1.2 --- src/external/gpl3/gdb/dist/gdb/arm-nbsd-nat.c:1.1.1.1 Tue Nov 28 13:18:23 2017 +++ src/external/gpl3/gdb/dist/gdb/arm-nbsd-nat.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Native-dependent code for BSD Unix running on ARM's, for GDB. - Copyright (C) 1988-2017 Free Software Foundation, Inc. + Copyright (C) 1988-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -17,21 +17,87 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#ifndef _KERNTYPES +#define _KERNTYPES +#endif #include "defs.h" #include "gdbcore.h" #include "inferior.h" #include "regcache.h" #include "target.h" + +#include "nbsd-nat.h" #include <sys/types.h> #include <sys/ptrace.h> #include <machine/reg.h> #include <machine/frame.h> +#include <arm/arm32/frame.h> + +/* Support for debugging kernel virtual memory images. */ +#include <machine/pcb.h> #include "arm-tdep.h" #include "inf-ptrace.h" +#include "bsd-kvm.h" + +#ifndef HAVE_GREGSET_T +typedef struct reg gregset_t; +#endif + +#ifndef HAVE_FPREGSET_T +typedef struct fpreg fpregset_t; +#endif + +#include "gregset.h" extern int arm_apcs_32; +static int +armnbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) +{ + struct switchframe sf; + + /* The following is true for NetBSD/arm32 in 5.0 and after: + + The pcb contains r8-r13 (sp) at the point of context switch in + cpu_switchto() or call of dumpsys(). At that point we have a + stack frame as described by `struct switchframe', which for + NetBSD/arm32 has the following layout: + + r4 ascending. + r5 | + r6 | + r7 \|/ + old sp + pc + + we reconstruct the register state as it would look when we just + returned from cpu_switchto() or dumpsys(). */ + + if (!arm_apcs_32) + return 0; + + /* The stack pointer shouldn't be zero. */ + if (pcb->pcb_un.un_32.pcb32_sp == 0) + return 0; + + read_memory (pcb->pcb_un.un_32.pcb32_sp, (gdb_byte *) &sf, sizeof sf); + + regcache_raw_supply (regcache, ARM_PC_REGNUM, &sf.sf_pc); + regcache_raw_supply (regcache, ARM_SP_REGNUM, &pcb->pcb_un.un_32.pcb32_sp); + regcache_raw_supply (regcache, 12, &pcb->pcb_un.un_32.pcb32_r12); + regcache_raw_supply (regcache, 11, &pcb->pcb_un.un_32.pcb32_r11); + regcache_raw_supply (regcache, 10, &pcb->pcb_un.un_32.pcb32_r10); + regcache_raw_supply (regcache, 9, &pcb->pcb_un.un_32.pcb32_r9); + regcache_raw_supply (regcache, 8, &pcb->pcb_un.un_32.pcb32_r8); + regcache_raw_supply (regcache, 7, &sf.sf_r7); + regcache_raw_supply (regcache, 6, &sf.sf_r6); + regcache_raw_supply (regcache, 5, &sf.sf_r5); + regcache_raw_supply (regcache, 4, &sf.sf_r4); + + return 1; +} + static void arm_supply_gregset (struct regcache *regcache, struct reg *gregset) { @@ -59,16 +125,77 @@ arm_supply_gregset (struct regcache *reg } static void -arm_supply_fparegset (struct regcache *regcache, struct fpreg *fparegset) +arm_supply_vfpregset (struct regcache *regcache, struct fpreg *vfpregset) { int regno; - for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++) - regcache_raw_supply (regcache, regno, - (char *) &fparegset->fpr[regno - ARM_F0_REGNUM]); + for (regno = 0; regno < 16; regno++) + regcache_raw_supply (regcache, regno + ARM_D0_REGNUM, + (char *) vfpregset->fpr_vfp.vfp_regs + 8*regno); + + regcache_raw_supply (regcache, ARM_FPSCR_REGNUM, + (char *) &vfpregset->fpr_vfp.vfp_fpscr); +} + +void +fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno) +{ + if (-1 == regno) + { + int regnum; + for (regnum = ARM_A1_REGNUM; regnum < ARM_SP_REGNUM; regnum++) + regcache_raw_collect (regcache, regnum, (char *) &gregsetp->r[regnum]); + } + else if (regno >= ARM_A1_REGNUM && regno < ARM_SP_REGNUM) + regcache_raw_collect (regcache, regno, (char *) &gregsetp->r[regno]); + + if (ARM_SP_REGNUM == regno || -1 == regno) + regcache_raw_collect (regcache, ARM_SP_REGNUM, (char *) &gregsetp->r_sp); + + if (ARM_LR_REGNUM == regno || -1 == regno) + regcache_raw_collect (regcache, ARM_LR_REGNUM, (char *) &gregsetp->r_lr); + + if (ARM_PC_REGNUM == regno || -1 == regno) + regcache_raw_collect (regcache, ARM_PC_REGNUM, (char *) &gregsetp->r_pc); + + if (ARM_PS_REGNUM == regno || -1 == regno) + { + if (arm_apcs_32) + regcache_raw_collect (regcache, ARM_PS_REGNUM, (char *) &gregsetp->r_cpsr); + else + regcache_raw_collect (regcache, ARM_PS_REGNUM, (char *) &gregsetp->r_pc); + } + } + +void +fill_fpregset (const struct regcache *regcache, fpregset_t *vfpregsetp, int regno) +{ + if (-1 == regno) + { + int regnum; + for (regnum = 0; regnum <= 15; regnum++) + regcache_raw_collect(regcache, regnum + ARM_D0_REGNUM, + (char *) vfpregsetp->fpr_vfp.vfp_regs + 8*regnum); + } + else if (regno >= ARM_D0_REGNUM && regno <= ARM_D0_REGNUM + 15) + regcache_raw_collect(regcache, regno, + (char *) vfpregsetp->fpr_vfp.vfp_regs + 8 * (regno - ARM_D0_REGNUM)); + + if (ARM_FPSCR_REGNUM == regno || -1 == regno) + regcache_raw_collect (regcache, ARM_FPSCR_REGNUM, + (char *) &vfpregsetp->fpr_vfp.vfp_fpscr); +} + +void +supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp) +{ + arm_supply_gregset (regcache, (struct reg *)gregsetp); +} - regcache_raw_supply (regcache, ARM_FPS_REGNUM, - (char *) &fparegset->fpr_fpsr); +void +supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp) +{ + arm_supply_vfpregset (regcache, (struct fpreg *)fpregsetp); } static void @@ -77,8 +204,8 @@ fetch_register (struct regcache *regcach struct reg inferior_registers; int ret; - ret = ptrace (PT_GETREGS, ptid_get_pid (regcache_get_ptid (regcache)), - (PTRACE_TYPE_ARG3) &inferior_registers, 0); + ret = ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_registers, ptid_get_lwp(inferior_ptid)); if (ret < 0) { @@ -130,8 +257,8 @@ fetch_regs (struct regcache *regcache) int ret; int regno; - ret = ptrace (PT_GETREGS, ptid_get_pid (regcache_get_ptid (regcache)), - (PTRACE_TYPE_ARG3) &inferior_registers, 0); + ret = ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_registers, ptid_get_lwp(inferior_ptid)); if (ret < 0) { @@ -148,8 +275,8 @@ fetch_fp_register (struct regcache *regc struct fpreg inferior_fp_registers; int ret; - ret = ptrace (PT_GETFPREGS, ptid_get_pid (regcache_get_ptid (regcache)), - (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0); + ret = ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_fp_registers, ptid_get_lwp(inferior_ptid)); if (ret < 0) { @@ -159,14 +286,14 @@ fetch_fp_register (struct regcache *regc switch (regno) { - case ARM_FPS_REGNUM: - regcache_raw_supply (regcache, ARM_FPS_REGNUM, - (char *) &inferior_fp_registers.fpr_fpsr); + case ARM_FPSCR_REGNUM: + regcache_raw_supply (regcache, ARM_FPSCR_REGNUM, + (char *) &inferior_fp_registers.fpr_vfp.vfp_fpscr); break; default: regcache_raw_supply (regcache, regno, - (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]); + (char *) inferior_fp_registers.fpr_vfp.vfp_regs + 8 * (regno - ARM_D0_REGNUM)); break; } } @@ -178,16 +305,16 @@ fetch_fp_regs (struct regcache *regcache int ret; int regno; - ret = ptrace (PT_GETFPREGS, ptid_get_pid (regcache_get_ptid (regcache)), - (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0); + ret = ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_fp_registers, ptid_get_lwp(inferior_ptid)); if (ret < 0) { - warning (_("unable to fetch general registers")); + warning (_("unable to fetch floating-point registers")); return; } - arm_supply_fparegset (regcache, &inferior_fp_registers); + arm_supply_vfpregset (regcache, &inferior_fp_registers); } static void @@ -196,10 +323,10 @@ armnbsd_fetch_registers (struct target_o { if (regno >= 0) { - if (regno < ARM_F0_REGNUM || regno > ARM_FPS_REGNUM) - fetch_register (regcache, regno); - else + if (regno >= ARM_D0_REGNUM && regno <= ARM_FPSCR_REGNUM) fetch_fp_register (regcache, regno); + else + fetch_register (regcache, regno); } else { @@ -216,8 +343,8 @@ store_register (const struct regcache *r struct reg inferior_registers; int ret; - ret = ptrace (PT_GETREGS, ptid_get_pid (regcache_get_ptid (regcache)), - (PTRACE_TYPE_ARG3) &inferior_registers, 0); + ret = ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_registers, ptid_get_lwp(inferior_ptid)); if (ret < 0) { @@ -279,8 +406,8 @@ store_register (const struct regcache *r break; } - ret = ptrace (PT_SETREGS, ptid_get_pid (regcache_get_ptid (regcache)), - (PTRACE_TYPE_ARG3) &inferior_registers, 0); + ret = ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_registers, ptid_get_lwp(inferior_ptid)); if (ret < 0) warning (_("unable to write register %d to inferior"), regno); @@ -327,8 +454,8 @@ store_regs (const struct regcache *regca inferior_registers.r_pc = pc_val | psr_val; } - ret = ptrace (PT_SETREGS, ptid_get_pid (regcache_get_ptid (regcache)), - (PTRACE_TYPE_ARG3) &inferior_registers, 0); + ret = ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_registers, ptid_get_lwp(inferior_ptid)); if (ret < 0) warning (_("unable to store general registers")); @@ -340,8 +467,8 @@ store_fp_register (const struct regcache struct fpreg inferior_fp_registers; int ret; - ret = ptrace (PT_GETFPREGS, ptid_get_pid (regcache_get_ptid (regcache)), - (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0); + ret = ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_fp_registers, ptid_get_lwp(inferior_ptid)); if (ret < 0) { @@ -351,19 +478,20 @@ store_fp_register (const struct regcache switch (regno) { - case ARM_FPS_REGNUM: + case ARM_FPSCR_REGNUM: regcache_raw_collect (regcache, ARM_FPS_REGNUM, - (char *) &inferior_fp_registers.fpr_fpsr); + (char *) &inferior_fp_registers.fpr_vfp.vfp_fpscr); break; default: regcache_raw_collect (regcache, regno, - (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]); + (char *) inferior_fp_registers.fpr_vfp.vfp_regs + + 8 * (regno - ARM_D0_REGNUM)); break; } - ret = ptrace (PT_SETFPREGS, ptid_get_pid (regcache_get_ptid (regcache)), - (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0); + ret = ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_fp_registers, ptid_get_lwp(inferior_ptid)); if (ret < 0) warning (_("unable to write register %d to inferior"), regno); @@ -377,15 +505,16 @@ store_fp_regs (const struct regcache *re int regno; - for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++) - regcache_raw_collect (regcache, regno, - (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]); + for (regno = 0; regno <= 15; regno++) + regcache_raw_collect (regcache, regno + ARM_D0_REGNUM, + (char *) inferior_fp_registers.fpr_vfp.vfp_regs + + 8 * regno); - regcache_raw_collect (regcache, ARM_FPS_REGNUM, - (char *) &inferior_fp_registers.fpr_fpsr); + regcache_raw_collect (regcache, ARM_FPSCR_REGNUM, + (char *) &inferior_fp_registers.fpr_vfp.vfp_fpscr); - ret = ptrace (PT_SETFPREGS, ptid_get_pid (regcache_get_ptid (regcache)), - (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0); + ret = ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_fp_registers, ptid_get_lwp(inferior_ptid)); if (ret < 0) warning (_("unable to store floating-point registers")); @@ -397,10 +526,10 @@ armnbsd_store_registers (struct target_o { if (regno >= 0) { - if (regno < ARM_F0_REGNUM || regno > ARM_FPS_REGNUM) - store_register (regcache, regno); - else + if (regno >= ARM_D0_REGNUM && regno <= ARM_FPSCR_REGNUM) store_fp_register (regcache, regno); + else + store_register (regcache, regno); } else { @@ -409,13 +538,32 @@ armnbsd_store_registers (struct target_o } } +struct md_core +{ + struct reg intreg; + struct fpreg freg; +}; + +static void +fetch_core_registers (struct regcache *regcache, + char *core_reg_sect, unsigned core_reg_size, + int which, CORE_ADDR ignore) +{ + struct md_core *core_reg = (struct md_core *) core_reg_sect; + int regno; + CORE_ADDR r_pc; + + arm_supply_gregset (regcache, &core_reg->intreg); + arm_supply_vfpregset (regcache, &core_reg->freg); +} + static void fetch_elfcore_registers (struct regcache *regcache, char *core_reg_sect, unsigned core_reg_size, int which, CORE_ADDR ignore) { struct reg gregset; - struct fpreg fparegset; + struct fpreg vfpregset; switch (which) { @@ -438,8 +586,8 @@ fetch_elfcore_registers (struct regcache { /* The memcpy may be unnecessary, but we can't really be sure of the alignment of the data in the core file. */ - memcpy (&fparegset, core_reg_sect, sizeof (fparegset)); - arm_supply_fparegset (regcache, &fparegset); + memcpy (&vfpregset, core_reg_sect, sizeof (vfpregset)); + arm_supply_vfpregset (regcache, &vfpregset); } break; @@ -449,6 +597,15 @@ fetch_elfcore_registers (struct regcache } } +static struct core_fns arm_netbsd_core_fns = +{ + bfd_target_unknown_flavour, /* core_flovour. */ + default_check_format, /* check_format. */ + default_core_sniffer, /* core_sniffer. */ + fetch_core_registers, /* core_read_registers. */ + NULL +}; + static struct core_fns arm_netbsd_elfcore_fns = { bfd_target_elf_flavour, /* core_flovour. */ @@ -466,7 +623,12 @@ _initialize_arm_netbsd_nat (void) t = inf_ptrace_target (); t->to_fetch_registers = armnbsd_fetch_registers; t->to_store_registers = armnbsd_store_registers; + t->to_pid_to_exec_file = nbsd_pid_to_exec_file; add_target (t); + /* Support debugging kernel virtual memory images. */ + bsd_kvm_add_target (armnbsd_supply_pcb); + + deprecated_add_core_fns (&arm_netbsd_core_fns); deprecated_add_core_fns (&arm_netbsd_elfcore_fns); } Index: src/external/gpl3/gdb/dist/gdb/arm-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/arm-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/arm-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/arm-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:14 2017 +++ src/external/gpl3/gdb/dist/gdb/arm-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/arm. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -22,6 +22,7 @@ #include "arch/arm.h" #include "arm-tdep.h" +#include "nbsd-tdep.h" #include "solib-svr4.h" /* Description of the longjmp buffer. */ @@ -42,7 +43,7 @@ arm_netbsd_init_abi_common (struct gdbar struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); tdep->lowest_pc = 0x8000; - switch (info.byte_order) + switch (info.byte_order_for_code) { case BFD_ENDIAN_LITTLE: tdep->arm_breakpoint = arm_nbsd_arm_le_breakpoint; @@ -68,8 +69,23 @@ arm_netbsd_init_abi_common (struct gdbar /* Single stepping. */ set_gdbarch_software_single_step (gdbarch, arm_software_single_step); + /* Core support */ + set_gdbarch_iterate_over_regset_sections + (gdbarch, armbsd_iterate_over_regset_sections); + +} + +static void +arm_netbsd_aout_init_abi (struct gdbarch_info info, + struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + arm_netbsd_init_abi_common (info, gdbarch); + if (tdep->fp_model == ARM_FLOAT_AUTO) + tdep->fp_model = ARM_FLOAT_SOFT_FPA; } - + static void arm_netbsd_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) @@ -83,6 +99,9 @@ arm_netbsd_elf_init_abi (struct gdbarch_ /* NetBSD ELF uses SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); + + /* for single stepping; see PR/50773 */ + set_gdbarch_skip_solib_resolver (gdbarch, nbsd_skip_solib_resolver); } /* Provide a prototype to silence -Wmissing-prototypes. */ @@ -91,6 +110,9 @@ extern initialize_file_ftype _initialize void _initialize_arm_netbsd_tdep (void) { + gdbarch_register_osabi_sniffer (bfd_arch_arm, bfd_target_aout_flavour, + arm_netbsd_aout_osabi_sniffer); + gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_NETBSD, arm_netbsd_elf_init_abi); } Index: src/external/gpl3/gdb/dist/gdb/hppa-nbsd-nat.c diff -u src/external/gpl3/gdb/dist/gdb/hppa-nbsd-nat.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/hppa-nbsd-nat.c:1.2 --- src/external/gpl3/gdb/dist/gdb/hppa-nbsd-nat.c:1.1.1.1 Tue Nov 28 13:18:13 2017 +++ src/external/gpl3/gdb/dist/gdb/hppa-nbsd-nat.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Native-dependent code for NetBSD/hppa. - Copyright (C) 2008-2017 Free Software Foundation, Inc. + Copyright (C) 2008-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -30,6 +30,16 @@ #include "nbsd-nat.h" +#ifndef HAVE_GREGSET_T +typedef struct reg gregset_t; +#endif + +#ifndef HAVE_FPREGSET_T +typedef struct fpreg fpregset_t; +#endif + +#include "gregset.h" + static int hppanbsd_gregset_supplies_p (int regnum) { @@ -50,8 +60,7 @@ hppanbsd_fpregset_supplies_p (int regnum static void hppanbsd_supply_gregset (struct regcache *regcache, const void *gregs) { - const char *regs = gregs; - const int *r = gregs; + const char *regs = (const char *) gregs; int regnum; for (regnum = HPPA_R1_REGNUM; regnum <= HPPA_R31_REGNUM; regnum++) @@ -75,7 +84,7 @@ hppanbsd_supply_gregset (struct regcache static void hppanbsd_supply_fpregset (struct regcache *regcache, const void *fpregs) { - const char *regs = fpregs; + const char *regs = (const char *) fpregs; int regnum; for (regnum = HPPA_FP0_REGNUM; regnum <= HPPA_FP31R_REGNUM; @@ -93,8 +102,7 @@ static void hppanbsd_collect_gregset (const struct regcache *regcache, void *gregs, int regnum) { - char *regs = gregs; - int *r = gregs; + char *regs = (char *) gregs; int i; for (i = HPPA_R1_REGNUM; i <= HPPA_R31_REGNUM; i++) @@ -138,10 +146,10 @@ hppanbsd_collect_gregset (const struct r in FPREGS. */ static void -hppanbsd_collect_fpregset (struct regcache *regcache, +hppanbsd_collect_fpregset (const struct regcache *regcache, void *fpregs, int regnum) { - char *regs = fpregs; + char *regs = (char *) fpregs; int i; for (i = HPPA_FP0_REGNUM; i <= HPPA_FP31R_REGNUM; i += 2, regs += 8) @@ -163,13 +171,12 @@ hppanbsd_fetch_registers (struct target_ struct regcache *regcache, int regnum) { - pid_t pid = ptid_get_pid (regcache_get_ptid (regcache)); - if (regnum == -1 || hppanbsd_gregset_supplies_p (regnum)) { struct reg regs; - if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) ®s, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get registers")); hppanbsd_supply_gregset (regcache, ®s); @@ -179,7 +186,8 @@ hppanbsd_fetch_registers (struct target_ { struct fpreg fpregs; - if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get floating point status")); hppanbsd_supply_fpregset (regcache, &fpregs); @@ -193,18 +201,18 @@ static void hppanbsd_store_registers (struct target_ops *ops, struct regcache *regcache, int regnum) { - pid_t pid = ptid_get_pid (regcache_get_ptid (regcache)); - if (regnum == -1 || hppanbsd_gregset_supplies_p (regnum)) { struct reg regs; - if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) ®s, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get registers")); hppanbsd_collect_gregset (regcache, ®s, regnum); - if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) ®s, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't write registers")); } @@ -212,16 +220,56 @@ hppanbsd_store_registers (struct target_ { struct fpreg fpregs; - if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get floating point status")); hppanbsd_collect_fpregset (regcache, &fpregs, regnum); - if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't write floating point status")); } } +void +supply_gregset (struct regcache *regcache, const gregset_t *gregsetp) +{ + hppanbsd_supply_gregset (regcache, gregsetp); +} + +/* Fill register REGNUM (if it is a general-purpose register) in + *GREGSETP with the value in GDB's register cache. If REGNUM is -1, + do this for all registers. */ + +void +fill_gregset (const struct regcache *regcache, + gregset_t *gregsetp, int regnum) +{ + hppanbsd_collect_gregset (regcache, gregsetp, regnum); +} + +/* Transfering floating-point registers between GDB, inferiors and cores. */ + +/* Fill GDB's register cache with the floating-point and SSE register + values in *FPREGSETP. */ + +void +supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp) +{ + hppanbsd_supply_fpregset (regcache, fpregsetp); +} + +/* Fill register REGNUM (if it is a floating-point or SSE register) in + *FPREGSETP with the value in GDB's register cache. If REGNUM is + -1, do this for all registers. */ + +void +fill_fpregset (const struct regcache *regcache, + fpregset_t *fpregsetp, int regnum) +{ + hppanbsd_collect_fpregset (regcache, fpregsetp, regnum); +} /* Provide a prototype to silence -Wmissing-prototypes. */ void _initialize_hppanbsd_nat (void); Index: src/external/gpl3/gdb/dist/gdb/hppa-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/hppa-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/hppa-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/hppa-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:02 2017 +++ src/external/gpl3/gdb/dist/gdb/hppa-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/hppa - Copyright (C) 2008-2017 Free Software Foundation, Inc. + Copyright (C) 2008-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -26,7 +26,7 @@ #include "tramp-frame.h" #include "hppa-tdep.h" -#include "hppa-bsd-tdep.h" +#include "hppabsd-tdep.h" /* From <machine/mcontext.h>. */ static int hppanbsd_mc_reg_offset[] = @@ -57,6 +57,19 @@ static int hppanbsd_mc_reg_offset[] = 38 * 4, /* sr1 */ 39 * 4, /* sr2 */ 40 * 4, /* sr3 */ + -1, /* 48 */ + -1, /* 49 */ + -1, /* 50 */ + -1, /* 51 */ + -1, /* 52 */ + -1, /* 53 */ + -1, /* 54 */ + -1, /* 55 */ + -1, /* 56 */ + -1, /* 57 CR24 */ + -1, /* 58 CR25 */ + -1, /* 59 CR26 */ + 43 * 4, /* HPPA_CR27_REGNUM */ /* more tbd */ }; @@ -128,7 +141,7 @@ hppanbsd_sigtramp_cache_init (const stru /* Core file support. */ /* Sizeof `struct reg' in <machine/reg.h>. */ -#define HPPANBSD_SIZEOF_GREGS (44 * 4) +#define HPPANBSD_SIZEOF_GREGS (47 * 4) static int hppanbsd_reg_offset[] = { @@ -152,6 +165,25 @@ static int hppanbsd_reg_offset[] = -1, /* HPPA_ISR_REGNUM */ -1, /* HPPA_IOR_REGNUM */ 0 * 4, /* HPPA_IPSW_REGNUM */ + -1, /* spare? */ + 41 * 4, /* HPPA_SR4_REGNUM */ + 37 * 4, /* sr0 */ + 38 * 4, /* sr1 */ + 39 * 4, /* sr2 */ + 40 * 4, /* sr3 */ + -1, /* 48 */ + -1, /* 49 */ + -1, /* 50 */ + -1, /* 51 */ + -1, /* 52 */ + -1, /* 53 */ + -1, /* 54 */ + -1, /* 55 */ + -1, /* 56 */ + -1, /* 57 */ + -1, /* 58 */ + -1, /* 59 */ + 46 * 4, /* HPPA_CR27_REGNUM */ }; /* Supply register REGNUM from the buffer specified by GREGS and LEN Index: src/external/gpl3/gdb/dist/gdb/i386-nbsd-nat.c diff -u src/external/gpl3/gdb/dist/gdb/i386-nbsd-nat.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/i386-nbsd-nat.c:1.2 --- src/external/gpl3/gdb/dist/gdb/i386-nbsd-nat.c:1.1.1.1 Tue Nov 28 13:18:05 2017 +++ src/external/gpl3/gdb/dist/gdb/i386-nbsd-nat.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Native-dependent code for NetBSD/i386. - Copyright (C) 2004-2017 Free Software Foundation, Inc. + Copyright (C) 2004-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -23,54 +23,130 @@ #include "target.h" #include "i386-tdep.h" -#include "i386-bsd-nat.h" +#include "i387-tdep.h" +#include "i386bsd-nat.h" /* Support for debugging kernel virtual memory images. */ #include <sys/types.h> +#include <machine/reg.h> #include <machine/frame.h> #include <machine/pcb.h> #include "nbsd-nat.h" #include "bsd-kvm.h" +#ifndef HAVE_GREGSET_T +typedef struct reg gregset_t; +#endif + +#ifndef HAVE_FPREGSET_T +typedef struct fpreg fpregset_t; +#endif + +#include "gregset.h" + static int i386nbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) { struct switchframe sf; - /* The following is true for NetBSD 1.6.2: + /* The following is true for NetBSD 1.6.2 and after: The pcb contains %esp and %ebp at the point of the context switch - in cpu_switch(). At that point we have a stack frame as - described by `struct switchframe', which for NetBSD 1.6.2 has the - following layout: + in cpu_switch()/cpu_switchto(). At that point we have a stack frame as + described by `struct switchframe', which for NetBSD (2.0 and later) has + the following layout: - interrupt level %edi %esi %ebx - %eip + return address we reconstruct the register state as it would look when we just - returned from cpu_switch(). */ + returned from cpu_switch()/cpu_switchto(). + + For core dumps the pcb is saved by savectx()/dumpsys() and contains the + stack pointer and frame pointer. A new dumpsys() fakes a switchframe + whereas older code isn't reliable so use an iffy heuristic to detect this + and use the frame pointer to recover enough state. */ /* The stack pointer shouldn't be zero. */ if (pcb->pcb_esp == 0) return 0; - read_memory (pcb->pcb_esp, (gdb_byte *)&sf, sizeof sf); - pcb->pcb_esp += sizeof (struct switchframe); - regcache_raw_supply (regcache, I386_EDI_REGNUM, &sf.sf_edi); - regcache_raw_supply (regcache, I386_ESI_REGNUM, &sf.sf_esi); - regcache_raw_supply (regcache, I386_EBP_REGNUM, &pcb->pcb_ebp); - regcache_raw_supply (regcache, I386_ESP_REGNUM, &pcb->pcb_esp); - regcache_raw_supply (regcache, I386_EBX_REGNUM, &sf.sf_ebx); - regcache_raw_supply (regcache, I386_EIP_REGNUM, &sf.sf_eip); + read_memory (pcb->pcb_esp, (gdb_byte *) &sf, sizeof sf); + + if ( (unsigned long)sf.sf_eip >= (unsigned long)0xc0100000 ) + { + /* Yes, we have a switchframe that matches cpu_switchto() or + the new dumpsys(). */ + + pcb->pcb_esp += sizeof (struct switchframe); + regcache_raw_supply (regcache, I386_EDI_REGNUM, &sf.sf_edi); + regcache_raw_supply (regcache, I386_ESI_REGNUM, &sf.sf_esi); + regcache_raw_supply (regcache, I386_EBP_REGNUM, &pcb->pcb_ebp); + regcache_raw_supply (regcache, I386_ESP_REGNUM, &pcb->pcb_esp); + regcache_raw_supply (regcache, I386_EBX_REGNUM, &sf.sf_ebx); + regcache_raw_supply (regcache, I386_EIP_REGNUM, &sf.sf_eip); + } + else + { + CORE_ADDR pc, fp; + + /* No, the pcb must have been last updated by savectx() in old + dumpsys(). Use the frame pointer to recover enough state. */ + + read_memory (pcb->pcb_ebp, (gdb_byte *) &fp, sizeof(fp)); + read_memory (pcb->pcb_ebp + 4, (gdb_byte *) &pc, sizeof(pc)); + + regcache_raw_supply (regcache, I386_ESP_REGNUM, &pcb->pcb_ebp); + regcache_raw_supply (regcache, I386_EBP_REGNUM, &fp); + regcache_raw_supply (regcache, I386_EIP_REGNUM, &pc); + } return 1; } +void +supply_gregset (struct regcache *regcache, const gregset_t *gregsetp) +{ + i386bsd_supply_gregset (regcache, gregsetp); +} + +/* Fill register REGNUM (if it is a general-purpose register) in + *GREGSETP with the value in GDB's register cache. If REGNUM is -1, + do this for all registers. */ + +void +fill_gregset (const struct regcache *regcache, + gregset_t *gregsetp, int regnum) +{ + i386bsd_collect_gregset (regcache, gregsetp, regnum); +} + +/* Transfering floating-point registers between GDB, inferiors and cores. */ + +/* Fill GDB's register cache with the floating-point and SSE register + values in *FPREGSETP. */ + +void +supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp) +{ + i387_supply_fsave (regcache, -1, fpregsetp); +} + +/* Fill register REGNUM (if it is a floating-point or SSE register) in + *FPREGSETP with the value in GDB's register cache. If REGNUM is + -1, do this for all registers. */ + +void +fill_fpregset (const struct regcache *regcache, + fpregset_t *fpregsetp, int regnum) +{ + i387_collect_fsave (regcache, regnum, fpregsetp); +} + /* Provide a prototype to silence -Wmissing-prototypes. */ void _initialize_i386nbsd_nat (void); Index: src/external/gpl3/gdb/dist/gdb/i386-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/i386-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/i386-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/i386-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:04 2017 +++ src/external/gpl3/gdb/dist/gdb/i386-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/i386. - Copyright (C) 1988-2017 Free Software Foundation, Inc. + Copyright (C) 1988-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -33,6 +33,11 @@ #include "nbsd-tdep.h" #include "solib-svr4.h" +#include "elf-bfd.h" /* for header hack */ +#include "trad-frame.h" /* signal trampoline/kernel frame support */ +#include "frame-unwind.h" /* kernel frame support */ +#include "tramp-frame.h" /* signal trampoline/kernel frame support */ + /* From <machine/reg.h>. */ static int i386nbsd_r_reg_offset[] = { @@ -264,6 +269,152 @@ i386nbsd_sigtramp_cache_init (const stru } +/* From <machine/frame.h>. Note that %esp and %ess are only saved in + a trap frame when entering the kernel from user space. */ +static int i386nbsd_tf_reg_offset[] = +{ + 10 * 4, /* %eax */ + 9 * 4, /* %ecx */ + 8 * 4, /* %edx */ + 7 * 4, /* %ebx */ + -1, /* %esp */ + 6 * 4, /* %ebp */ + 5 * 4, /* %esi */ + 4 * 4, /* %edi */ + 13 * 4, /* %eip */ + 15 * 4, /* %eflags */ + 14 * 4, /* %cs */ + -1, /* %ss */ + 3 * 4, /* %ds */ + 2 * 4, /* %es */ + 1 * 4, /* %fs */ + 0 * 4 /* %gs */ +}; + +static struct trad_frame_cache * +i386nbsd_trapframe_cache(struct frame_info *this_frame, void **this_cache) +{ + struct trad_frame_cache *cache; + CORE_ADDR func, sp, addr, tmp; + ULONGEST cs; + const char *name; + int i; + struct gdbarch *gdbarch = get_frame_arch (this_frame); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + + if (*this_cache) + return (struct trad_frame_cache *)*this_cache; + + cache = trad_frame_cache_zalloc (this_frame); + *this_cache = cache; + + func = get_frame_func (this_frame); + sp = get_frame_register_unsigned (this_frame, I386_ESP_REGNUM); + + find_pc_partial_function (func, &name, NULL, NULL); + if (name && strncmp (name, "Xintr", 5) == 0) + { + /* It's an interrupt frame. */ + tmp = read_memory_unsigned_integer (sp + 4, 4, byte_order); + if (tmp < 15) + { + /* Reasonable value for 'ppl': already on interrupt stack. */ + addr = sp + 8; + } + else + { + /* Switch to previous stack. */ + addr = tmp + 4; + } + } + else + { + /* It's a trap frame. */ + addr = sp + 4; + } + + for (i = 0; i < ARRAY_SIZE (i386nbsd_tf_reg_offset); i++) + if (i386nbsd_tf_reg_offset[i] != -1) + trad_frame_set_reg_addr (cache, i, addr + i386nbsd_tf_reg_offset[i]); + + /* Read %cs from trap frame. */ + addr += i386nbsd_tf_reg_offset[I386_CS_REGNUM]; + cs = read_memory_unsigned_integer (addr, 4, byte_order); + if ((cs & I386_SEL_RPL) == I386_SEL_UPL) + { + /* Trap from user space; terminate backtrace. */ + trad_frame_set_id (cache, outer_frame_id); + } + else + { + /* Construct the frame ID using the function start. */ + trad_frame_set_id (cache, frame_id_build (sp + 8, func)); + } + + return cache; +} + +static void +i386nbsd_trapframe_this_id (struct frame_info *this_frame, + void **this_cache, struct frame_id *this_id) +{ + struct trad_frame_cache *cache = + i386nbsd_trapframe_cache (this_frame, this_cache); + + trad_frame_get_id (cache, this_id); +} + +static struct value * +i386nbsd_trapframe_prev_register (struct frame_info *this_frame, + void **this_cache, int regnum) +{ + struct trad_frame_cache *cache = + i386nbsd_trapframe_cache (this_frame, this_cache); + + return trad_frame_get_register (cache, this_frame, regnum); +} + +static int +i386nbsd_trapframe_sniffer (const struct frame_unwind *self, + struct frame_info *this_frame, + void **this_prologue_cache) +{ + ULONGEST cs; + const char *name; + + /* Check Current Privilege Level and bail out if we're not executing + in kernel space. */ + cs = get_frame_register_unsigned (this_frame, I386_CS_REGNUM); + if ((cs & I386_SEL_RPL) == I386_SEL_UPL) + return 0; + + + find_pc_partial_function (get_frame_pc (this_frame), &name, NULL, NULL); + return (name && ((strcmp (name, "alltraps") == 0) + || (strcmp (name, "calltrap") == 0) + || (strncmp (name, "Xtrap", 5) == 0) + || (strcmp (name, "syscall1") == 0) + || (strcmp (name, "Xsyscall") == 0) + || (strncmp (name, "Xintr", 5) == 0) + || (strncmp (name, "Xresume", 7) == 0) + || (strncmp (name, "Xstray", 6) == 0) + || (strncmp (name, "Xrecurse", 8) == 0) + || (strncmp (name, "Xsoft", 5) == 0) + || (strncmp (name, "Xdoreti", 5) == 0))); +} + +const struct frame_unwind i386nbsd_trapframe_unwind = { + /* FIXME: kettenis/20051219: This really is more like an interrupt + frame, but SIGTRAMP_FRAME would print <signal handler called>, + which really is not what we want here. */ + NORMAL_FRAME, + default_frame_unwind_stop_reason, + i386nbsd_trapframe_this_id, + i386nbsd_trapframe_prev_register, + NULL, + i386nbsd_trapframe_sniffer +}; + static void i386nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { @@ -293,6 +444,9 @@ i386nbsd_init_abi (struct gdbarch_info i tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_si2); tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_si31); tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_si4); + + /* Unwind kernel trap frames correctly. */ + frame_unwind_prepend_unwinder (gdbarch, &i386nbsd_trapframe_unwind); } /* NetBSD ELF. */ @@ -319,6 +473,7 @@ i386nbsdelf_init_abi (struct gdbarch_inf /* Provide a prototype to silence -Wmissing-prototypes. */ extern initialize_file_ftype _initialize_i386nbsd_tdep; + void _initialize_i386nbsd_tdep (void) { Index: src/external/gpl3/gdb/dist/gdb/mips-nbsd-nat.c diff -u src/external/gpl3/gdb/dist/gdb/mips-nbsd-nat.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/mips-nbsd-nat.c:1.2 --- src/external/gpl3/gdb/dist/gdb/mips-nbsd-nat.c:1.1.1.1 Tue Nov 28 13:18:22 2017 +++ src/external/gpl3/gdb/dist/gdb/mips-nbsd-nat.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Native-dependent code for MIPS systems running NetBSD. - Copyright (C) 2000-2017 Free Software Foundation, Inc. + Copyright (C) 2000-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -16,7 +16,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ - +#ifndef _KERNTYPES +#define _KERNTYPES +#endif #include "defs.h" #include "inferior.h" #include "regcache.h" @@ -26,9 +28,22 @@ #include <sys/ptrace.h> #include <machine/reg.h> +#ifndef HAVE_GREGSET_T +typedef struct reg gregset_t; +#endif + +#ifndef HAVE_FPREGSET_T +typedef struct fpreg fpregset_t; +#endif + +#include "gregset.h" + #include "mips-tdep.h" -#include "mips-nbsd-tdep.h" +#include "mipsnbsd-tdep.h" #include "inf-ptrace.h" +#include "bsd-kvm.h" + +#include "machine/pcb.h" /* Determine if PT_GETREGS fetches this register. */ static int @@ -42,14 +57,13 @@ static void mipsnbsd_fetch_inferior_registers (struct target_ops *ops, struct regcache *regcache, int regno) { - pid_t pid = ptid_get_pid (regcache_get_ptid (regcache)); - struct gdbarch *gdbarch = get_regcache_arch (regcache); if (regno == -1 || getregs_supplies (gdbarch, regno)) { struct reg regs; - if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) ®s, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get registers")); mipsnbsd_supply_reg (regcache, (char *) ®s, regno); @@ -62,7 +76,8 @@ mipsnbsd_fetch_inferior_registers (struc { struct fpreg fpregs; - if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get floating point status")); mipsnbsd_supply_fpreg (regcache, (char *) &fpregs, regno); @@ -73,19 +88,19 @@ static void mipsnbsd_store_inferior_registers (struct target_ops *ops, struct regcache *regcache, int regno) { - pid_t pid = ptid_get_pid (regcache_get_ptid (regcache)); - struct gdbarch *gdbarch = get_regcache_arch (regcache); if (regno == -1 || getregs_supplies (gdbarch, regno)) { struct reg regs; - if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) ®s, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get registers")); mipsnbsd_fill_reg (regcache, (char *) ®s, regno); - if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) ®s, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't write registers")); if (regno != -1) @@ -97,16 +112,81 @@ mipsnbsd_store_inferior_registers (struc { struct fpreg fpregs; - if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get floating point status")); mipsnbsd_fill_fpreg (regcache, (char *) &fpregs, regno); - if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't write floating point status")); } } + +static int mipsnbsd_supply_pcb (struct regcache *, struct pcb *); + +static int +mipsnbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) +{ + struct label_t sf; + + sf = pcb->pcb_context; + + /* really should test for n{32,64} abi for this register + unless this is purely the "n" ABI */ + + regcache_raw_supply (regcache, MIPS_S0_REGNUM, &sf.val[_L_S0]); + regcache_raw_supply (regcache, MIPS_S1_REGNUM, &sf.val[_L_S1]); + regcache_raw_supply (regcache, MIPS_S2_REGNUM, &sf.val[_L_S2]); + regcache_raw_supply (regcache, MIPS_S3_REGNUM, &sf.val[_L_S3]); + regcache_raw_supply (regcache, MIPS_S4_REGNUM, &sf.val[_L_S4]); + regcache_raw_supply (regcache, MIPS_S5_REGNUM, &sf.val[_L_S5]); + regcache_raw_supply (regcache, MIPS_S6_REGNUM, &sf.val[_L_S6]); + regcache_raw_supply (regcache, MIPS_S7_REGNUM, &sf.val[_L_S7]); + + regcache_raw_supply (regcache, MIPS_S8_REGNUM, &sf.val[_L_S8]); + + regcache_raw_supply (regcache, MIPS_T8_REGNUM, &sf.val[_L_T8]); + + regcache_raw_supply (regcache, MIPS_GP_REGNUM, &sf.val[_L_GP]); + + regcache_raw_supply (regcache, MIPS_SP_REGNUM, &sf.val[_L_SP]); + regcache_raw_supply (regcache, MIPS_RA_REGNUM, &sf.val[_L_RA]); + regcache_raw_supply (regcache, MIPS_PS_REGNUM, &sf.val[_L_SR]); + + /* provide the return address of the savectx as the current pc */ + regcache_raw_supply (regcache, MIPS_EMBED_PC_REGNUM, &sf.val[_L_RA]); + + return 0; +} +/* Wrapper functions. These are only used by nbsd-thread. */ +void +supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp) +{ + mipsnbsd_supply_reg (regcache, (const char *) gregsetp, -1); +} + +void +fill_gregset (const struct regcache *regcache, + gdb_gregset_t *gregsetp, int regno) +{ + mipsnbsd_fill_reg (regcache, (char *) gregsetp, -1); +} + +void +supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp) +{ + mipsnbsd_supply_fpreg (regcache, (const char *) fpregsetp, -1); +} + +void +fill_fpregset (const struct regcache *regcache, + gdb_fpregset_t *fpregsetp, int regno) +{ + mipsnbsd_fill_fpreg (regcache, (char *) fpregsetp, -1); +} /* Provide a prototype to silence -Wmissing-prototypes. */ void _initialize_mipsnbsd_nat (void); @@ -120,4 +200,7 @@ _initialize_mipsnbsd_nat (void) t->to_fetch_registers = mipsnbsd_fetch_inferior_registers; t->to_store_registers = mipsnbsd_store_inferior_registers; add_target (t); + + /* Support debugging kernel virtual memory images. */ + bsd_kvm_add_target (mipsnbsd_supply_pcb); } Index: src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:25 2017 +++ src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/mips. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. @@ -28,7 +28,7 @@ #include "osabi.h" #include "nbsd-tdep.h" -#include "mips-nbsd-tdep.h" +#include "mipsnbsd-tdep.h" #include "mips-tdep.h" #include "solib-svr4.h" @@ -79,15 +79,23 @@ mipsnbsd_supply_gregset (const struct re const void *gregs, size_t len) { size_t regsize = mips_isa_regsize (get_regcache_arch (regcache)); + char zerobuf[MAX_REGISTER_SIZE]; const char *regs = (const char *) gregs; int i; + memset (zerobuf, 0, MAX_REGISTER_SIZE); + gdb_assert (len >= MIPSNBSD_NUM_GREGS * regsize); for (i = 0; i <= MIPS_PC_REGNUM; i++) { if (regnum == i || regnum == -1) - regcache_raw_supply (regcache, i, regs + i * regsize); + { + if (i == MIPS_ZERO_REGNUM || i == MIPS_UNUSED_REGNUM) + regcache_raw_supply (regcache, i, zerobuf); + else + regcache_raw_supply (regcache, i, regs + i * regsize); + } } if (len >= (MIPSNBSD_NUM_GREGS + MIPSNBSD_NUM_FPREGS) * regsize) @@ -138,13 +146,18 @@ void mipsnbsd_supply_reg (struct regcache *regcache, const char *regs, int regno) { struct gdbarch *gdbarch = get_regcache_arch (regcache); + char zerobuf[MAX_REGISTER_SIZE]; int i; + memset (zerobuf, 0, MAX_REGISTER_SIZE); + for (i = 0; i <= gdbarch_pc_regnum (gdbarch); i++) { if (regno == i || regno == -1) { - if (gdbarch_cannot_fetch_register (gdbarch, i)) + if (i == MIPS_ZERO_REGNUM || i == MIPS_UNUSED_REGNUM) + regcache_raw_supply (regcache, i, zerobuf); + else if (gdbarch_cannot_fetch_register (gdbarch, i)) regcache_raw_supply (regcache, i, NULL); else regcache_raw_supply (regcache, i, Index: src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.h diff -u src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.h:1.1.1.1 src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.h:1.2 --- src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.h:1.1.1.1 Tue Nov 28 13:18:11 2017 +++ src/external/gpl3/gdb/dist/gdb/mips-nbsd-tdep.h Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Common target dependent code for GDB on MIPS systems running NetBSD. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -17,8 +17,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef MIPS_NBSD_TDEP_H -#define MIPS_NBSD_TDEP_H +#ifndef MIPSNBSD_TDEP_H +#define MIPSNBSD_TDEP_H void mipsnbsd_supply_reg (struct regcache *, const char *, int); void mipsnbsd_fill_reg (const struct regcache *, char *, int); @@ -26,4 +26,4 @@ void mipsnbsd_fill_reg (const struct reg void mipsnbsd_supply_fpreg (struct regcache *, const char *, int); void mipsnbsd_fill_fpreg (const struct regcache *, char *, int); -#endif /* MIPS_NBSD_TDEP_H */ +#endif /* MIPSNBSD_TDEP_H */ Index: src/external/gpl3/gdb/dist/gdb/ppc-nbsd-nat.c diff -u src/external/gpl3/gdb/dist/gdb/ppc-nbsd-nat.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/ppc-nbsd-nat.c:1.2 --- src/external/gpl3/gdb/dist/gdb/ppc-nbsd-nat.c:1.1.1.1 Tue Nov 28 13:18:13 2017 +++ src/external/gpl3/gdb/dist/gdb/ppc-nbsd-nat.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Native-dependent code for NetBSD/powerpc. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. @@ -19,6 +19,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#define _KMEMUSER #include "defs.h" #include <sys/types.h> @@ -31,11 +32,24 @@ #include "inferior.h" #include "regcache.h" +#include "gdb_assert.h" + +#include "nbsd-nat.h" #include "ppc-tdep.h" -#include "ppc-nbsd-tdep.h" +#include "ppcnbsd-tdep.h" #include "bsd-kvm.h" #include "inf-ptrace.h" +#ifndef HAVE_GREGSET_T +typedef struct reg gregset_t; +#endif + +#ifndef HAVE_FPREGSET_T +typedef struct fpreg fpregset_t; +#endif +#include "gregset.h" + + /* Returns true if PT_GETREGS fetches this register. */ static int @@ -81,13 +95,13 @@ ppcnbsd_fetch_inferior_registers (struct struct regcache *regcache, int regnum) { struct gdbarch *gdbarch = get_regcache_arch (regcache); - pid_t pid = ptid_get_pid (regcache_get_ptid (regcache)); if (regnum == -1 || getregs_supplies (gdbarch, regnum)) { struct reg regs; - if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) ®s, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get registers")); ppc_supply_gregset (&ppcnbsd_gregset, regcache, @@ -98,7 +112,8 @@ ppcnbsd_fetch_inferior_registers (struct { struct fpreg fpregs; - if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get FP registers")); ppc_supply_fpregset (&ppcnbsd_fpregset, regcache, @@ -111,19 +126,20 @@ ppcnbsd_store_inferior_registers (struct struct regcache *regcache, int regnum) { struct gdbarch *gdbarch = get_regcache_arch (regcache); - pid_t pid = ptid_get_pid (regcache_get_ptid (regcache)); if (regnum == -1 || getregs_supplies (gdbarch, regnum)) { struct reg regs; - if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) ®s, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get registers")); ppc_collect_gregset (&ppcnbsd_gregset, regcache, regnum, ®s, sizeof regs); - if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) ®s, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't write registers")); } @@ -131,17 +147,51 @@ ppcnbsd_store_inferior_registers (struct { struct fpreg fpregs; - if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get FP registers")); ppc_collect_fpregset (&ppcnbsd_fpregset, regcache, regnum, &fpregs, sizeof fpregs); - if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't set FP registers")); } } +void +supply_gregset (struct regcache *regcache, const gregset_t *gregs) +{ + if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) gregs, ptid_get_lwp (inferior_ptid)) == -1) + perror_with_name (_("Couldn't write registers")); +} + +void +supply_fpregset (struct regcache *regcache, const fpregset_t *fpregs) +{ + if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) fpregs, ptid_get_lwp (inferior_ptid)) == -1) + perror_with_name (_("Couldn't set FP registers")); +} + +void +fill_gregset (const struct regcache *regcache, gregset_t *gregs, int regnum) +{ + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) gregs, ptid_get_lwp (inferior_ptid)) == -1) + perror_with_name (_("Couldn't get registers")); +} + +void +fill_fpregset (const struct regcache *regcache, fpregset_t *fpregs, int regnum) +{ + if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) fpregs, ptid_get_lwp (inferior_ptid)) == -1) + perror_with_name (_("Couldn't get FP registers")); +} + static int ppcnbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) { @@ -156,20 +206,20 @@ ppcnbsd_supply_pcb (struct regcache *reg return 0; read_memory (pcb->pcb_sp, (gdb_byte *)&sf, sizeof sf); - regcache_raw_supply (regcache, tdep->ppc_cr_regnum, &sf.cr); - regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 2, &sf.fixreg2); + regcache_raw_supply (regcache, tdep->ppc_cr_regnum, &sf.sf_cr); + regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 2, &sf.sf_fixreg2); for (i = 0 ; i < 19 ; i++) regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 13 + i, - &sf.fixreg[i]); + &sf.sf_fixreg[i]); - read_memory(sf.sp, (gdb_byte *)&cf, sizeof(cf)); - regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 30, &cf.r30); - regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 31, &cf.r31); - regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 1, &cf.sp); - - read_memory(cf.sp, (gdb_byte *)&cf, sizeof(cf)); - regcache_raw_supply (regcache, tdep->ppc_lr_regnum, &cf.lr); - regcache_raw_supply (regcache, gdbarch_pc_regnum (gdbarch), &cf.lr); + read_memory(sf.sf_sp, (gdb_byte *)&cf, sizeof(cf)); + regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 30, &cf.cf_r30); + regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 31, &cf.cf_r31); + regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 1, &cf.cf_sp); + + read_memory(cf.cf_sp, (gdb_byte *)&cf, sizeof(cf)); + regcache_raw_supply (regcache, tdep->ppc_lr_regnum, &cf.cf_lr); + regcache_raw_supply (regcache, gdbarch_pc_regnum (gdbarch), &cf.cf_lr); return 1; } @@ -189,5 +239,6 @@ _initialize_ppcnbsd_nat (void) t = inf_ptrace_target (); t->to_fetch_registers = ppcnbsd_fetch_inferior_registers; t->to_store_registers = ppcnbsd_store_inferior_registers; + t->to_pid_to_exec_file = nbsd_pid_to_exec_file; add_target (t); } Index: src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:03 2017 +++ src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/powerpc. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. @@ -28,7 +28,7 @@ #include "tramp-frame.h" #include "ppc-tdep.h" -#include "ppc-nbsd-tdep.h" +#include "ppcnbsd-tdep.h" #include "solib-svr4.h" /* Register offsets from <machine/reg.h>. */ @@ -199,7 +199,7 @@ _initialize_ppcnbsd_tdep (void) ppcnbsd_init_abi); /* Avoid initializing the register offsets again if they were - already initialized by ppcnbsd-nat.c. */ + already initailized by ppcnbsd-nat.c. */ if (ppcnbsd_reg_offsets.pc_offset == 0) { /* General-purpose registers. */ Index: src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.h diff -u src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.h:1.1.1.1 src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.h:1.2 --- src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.h:1.1.1.1 Tue Nov 28 13:18:13 2017 +++ src/external/gpl3/gdb/dist/gdb/ppc-nbsd-tdep.h Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/powerpc. - Copyright (C) 2004-2017 Free Software Foundation, Inc. + Copyright (C) 2004-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -17,8 +17,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef PPC_NBSD_TDEP_H -#define PPC_NBSD_TDEP_H +#ifndef PPCNBSD_TDEP_H +#define PPCNBSD_TDEP_H struct regset; @@ -29,4 +29,4 @@ extern struct ppc_reg_offsets ppcnbsd_re extern const struct regset ppcnbsd_gregset; extern const struct regset ppcnbsd_fpregset; -#endif /* ppc-nbsd-tdep.h */ +#endif /* ppcnbsd-tdep.h */ Index: src/external/gpl3/gdb/dist/gdb/sh-nbsd-nat.c diff -u src/external/gpl3/gdb/dist/gdb/sh-nbsd-nat.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/sh-nbsd-nat.c:1.2 --- src/external/gpl3/gdb/dist/gdb/sh-nbsd-nat.c:1.1.1.1 Tue Nov 28 13:18:11 2017 +++ src/external/gpl3/gdb/dist/gdb/sh-nbsd-nat.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Native-dependent code for NetBSD/sh. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. @@ -29,30 +29,40 @@ #include "sh-tdep.h" #include "inf-ptrace.h" #include "regcache.h" +#include "inf-ptrace.h" +#include "nbsd-nat.h" +#ifndef HAVE_GREGSET_T +typedef struct reg gregset_t; +#endif + +#ifndef HAVE_FPREGSET_T +struct fpreg { }; +typedef struct fpreg fpregset_t; +#endif +#include "gregset.h" + /* Determine if PT_GETREGS fetches this register. */ #define GETREGS_SUPPLIES(gdbarch, regno) \ (((regno) >= R0_REGNUM && (regno) <= (R0_REGNUM + 15)) \ || (regno) == gdbarch_pc_regnum (gdbarch) || (regno) == PR_REGNUM \ || (regno) == MACH_REGNUM || (regno) == MACL_REGNUM \ -|| (regno) == SR_REGNUM) +|| (regno) == SR_REGNUM || (regno) == GBR_REGNUM) /* Sizeof `struct reg' in <machine/reg.h>. */ -#define SHNBSD_SIZEOF_GREGS (21 * 4) +#define SHNBSD_SIZEOF_GREGS (22 * 4) static void shnbsd_fetch_inferior_registers (struct target_ops *ops, struct regcache *regcache, int regno) { - pid_t pid = ptid_get_pid (regcache_get_ptid (regcache)); - if (regno == -1 || GETREGS_SUPPLIES (get_regcache_arch (regcache), regno)) { struct reg inferior_registers; - if (ptrace (PT_GETREGS, pid, - (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1) + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_registers, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get registers")); sh_corefile_supply_regset (&sh_corefile_gregset, regcache, regno, @@ -68,22 +78,20 @@ static void shnbsd_store_inferior_registers (struct target_ops *ops, struct regcache *regcache, int regno) { - pid_t pid = ptid_get_pid (regcache_get_ptid (regcache)); - if (regno == -1 || GETREGS_SUPPLIES (get_regcache_arch (regcache), regno)) { struct reg inferior_registers; - if (ptrace (PT_GETREGS, pid, - (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1) + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_registers, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't get registers")); sh_corefile_collect_regset (&sh_corefile_gregset, regcache, regno, (char *) &inferior_registers, SHNBSD_SIZEOF_GREGS); - if (ptrace (PT_SETREGS, pid, - (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1) + if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &inferior_registers, ptid_get_lwp (inferior_ptid)) == -1) perror_with_name (_("Couldn't set registers")); if (regno != -1) @@ -91,6 +99,22 @@ shnbsd_store_inferior_registers (struct } } +void +supply_gregset (struct regcache *regcache, const gregset_t *gregs) +{ + if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) gregs, ptid_get_lwp (inferior_ptid)) == -1) + perror_with_name (_("Couldn't set registers")); +} + +void +fill_gregset (const struct regcache *regcache, gregset_t *gregs, int regnum) +{ + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) gregs, ptid_get_lwp (inferior_ptid)) == -1) + perror_with_name (_("Couldn't get registers")); +} + /* Provide a prototype to silence -Wmissing-prototypes. */ void _initialize_shnbsd_nat (void); @@ -102,5 +126,6 @@ _initialize_shnbsd_nat (void) t = inf_ptrace_target (); t->to_fetch_registers = shnbsd_fetch_inferior_registers; t->to_store_registers = shnbsd_store_inferior_registers; + t->to_pid_to_exec_file = nbsd_pid_to_exec_file; add_target (t); } Index: src/external/gpl3/gdb/dist/gdb/sh-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/sh-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/sh-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/sh-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:06 2017 +++ src/external/gpl3/gdb/dist/gdb/sh-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/sh. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. @@ -8,7 +8,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or + the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -17,20 +17,32 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "defs.h" #include "gdbcore.h" +#include "inferior.h" +#include "regcache.h" #include "regset.h" #include "value.h" #include "osabi.h" -#include "sh-tdep.h" +#include "trad-frame.h" +#include "tramp-frame.h" + +#include "gdb_assert.h" + #include "solib-svr4.h" +#include "sh-tdep.h" +#include "shnbsd-tdep.h" +#include "nbsd-tdep.h" + /* Convert a register number into an offset into a ptrace register structure. */ -static const struct sh_corefile_regmap regmap[] = +static const struct sh_corefile_regmap gregs_table[] = { {R0_REGNUM, 20 * 4}, {R0_REGNUM + 1, 19 * 4}, @@ -53,9 +65,136 @@ static const struct sh_corefile_regmap r {PR_REGNUM, 2 * 4}, {MACH_REGNUM, 3 * 4}, {MACL_REGNUM, 4 * 4}, + {GBR_REGNUM, 21 * 4}, {-1 /* Terminator. */, 0} }; + + +#define REGSx16(base) \ + {(base), 0}, \ + {(base) + 1, 4}, \ + {(base) + 2, 8}, \ + {(base) + 3, 12}, \ + {(base) + 4, 16}, \ + {(base) + 5, 20}, \ + {(base) + 6, 24}, \ + {(base) + 7, 28}, \ + {(base) + 8, 32}, \ + {(base) + 9, 36}, \ + {(base) + 10, 40}, \ + {(base) + 11, 44}, \ + {(base) + 12, 48}, \ + {(base) + 13, 52}, \ + {(base) + 14, 56}, \ + {(base) + 15, 60} + +/* Convert an FPU register number into an offset into a ptrace + register structure. */ +static const struct sh_corefile_regmap fpregs_table[] = +{ + REGSx16 (FR0_REGNUM), + /* XXX: REGSx16(XF0_REGNUM) omitted. */ + {FPSCR_REGNUM, 128}, + {FPUL_REGNUM, 132}, + {-1 /* Terminator. */, 0} +}; + + +/* From <machine/mcontext.h>. */ +static const int shnbsd_mc_reg_offset[] = +{ + (20 * 4), /* r0 */ + (19 * 4), /* r1 */ + (18 * 4), /* r2 */ + (17 * 4), /* r3 */ + (16 * 4), /* r4 */ + (15 * 4), /* r5 */ + (14 * 4), /* r6 */ + (13 * 4), /* r7 */ + (12 * 4), /* r8 */ + (11 * 4), /* r9 */ + (10 * 4), /* r10 */ + ( 9 * 4), /* r11 */ + ( 8 * 4), /* r12 */ + ( 7 * 4), /* r13 */ + ( 6 * 4), /* r14 */ + (21 * 4), /* r15/sp */ + ( 1 * 4), /* pc */ + ( 5 * 4), /* pr */ + ( 0 * 4), /* gbr */ + -1, + ( 4 * 4), /* mach */ + ( 3 * 4), /* macl */ + ( 2 * 4), /* sr */ +}; + +/* SH register sets. */ + +static void +shnbsd_sigtramp_cache_init (const struct tramp_frame *, + struct frame_info *, + struct trad_frame_cache *, + CORE_ADDR); + +/* The siginfo signal trampoline for NetBSD/sh3 versions 2.0 and later */ +static const struct tramp_frame shnbsd_sigtramp_si2 = +{ + SIGTRAMP_FRAME, + 2, + { + { 0x64f3, -1 }, /* mov r15,r4 */ + { 0xd002, -1 }, /* mov.l .LSYS_setcontext */ + { 0xc380, -1 }, /* trapa #-128 */ + { 0xa003, -1 }, /* bra .Lskip1 */ + { 0x0009, -1 }, /* nop */ + { 0x0009, -1 }, /* nop */ + /* .LSYS_setcontext */ + { 0x0134, -1 }, { 0x0000, -1 }, /* 0x134 */ + /* .Lskip1 */ + { 0x6403, -1 }, /* mov r0,r4 */ + { 0xd002, -1 }, /* mov.l .LSYS_exit */ + { 0xc380, -1 }, /* trapa #-128 */ + { 0xa003, -1 }, /* bra .Lskip2 */ + { 0x0009, -1 }, /* nop */ + { 0x0009, -1 }, /* nop */ + /* .LSYS_exit */ + { 0x0001, -1 }, { 0x0000, -1 }, /* 0x1 */ +/* .Lskip2 */ + { TRAMP_SENTINEL_INSN, -1 } + }, + shnbsd_sigtramp_cache_init +}; + +static void +shnbsd_sigtramp_cache_init (const struct tramp_frame *self, + struct frame_info *next_frame, + struct trad_frame_cache *this_cache, + CORE_ADDR func) +{ + struct gdbarch *gdbarch = get_frame_arch (next_frame); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + int sp_regnum = gdbarch_sp_regnum (gdbarch); + CORE_ADDR sp = get_frame_register_unsigned (next_frame, sp_regnum); + CORE_ADDR base; + const int *reg_offset; + int num_regs; + int i; + + reg_offset = shnbsd_mc_reg_offset; + num_regs = ARRAY_SIZE (shnbsd_mc_reg_offset); + /* SP already points at the ucontext. */ + base = sp; + /* offsetof(ucontext_t, uc_mcontext) == 36 */ + base += 36; + + for (i = 0; i < num_regs; i++) + if (reg_offset[i] != -1) + trad_frame_set_reg_addr (this_cache, i, base + reg_offset[i]); + + /* Construct the frame ID using the function start. */ + trad_frame_set_id (this_cache, frame_id_build (sp, func)); +} static void shnbsd_init_abi (struct gdbarch_info info, @@ -63,22 +202,40 @@ shnbsd_init_abi (struct gdbarch_info inf { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - tdep->core_gregmap = (struct sh_corefile_regmap *)regmap; - tdep->sizeof_gregset = 84; + tdep->core_gregmap = (struct sh_corefile_regmap *)gregs_table; + tdep->sizeof_gregset = 88; + + tdep->core_fpregmap = (struct sh_corefile_regmap *)fpregs_table; + tdep->sizeof_fpregset = 0; /* XXX */ set_solib_svr4_fetch_link_map_offsets - (gdbarch, svr4_ilp32_fetch_link_map_offsets); + (gdbarch, nbsd_ilp32_solib_svr4_fetch_link_map_offsets); + + tramp_frame_prepend_unwinder (gdbarch, &shnbsd_sigtramp_si2); } +#define GDB_OSABI_NETBSD_CORE GDB_OSABI_NETBSD + +static enum gdb_osabi +shnbsd_core_osabi_sniffer (bfd *abfd) +{ + if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0) + return GDB_OSABI_NETBSD_CORE; + + return GDB_OSABI_UNKNOWN; +} + /* Provide a prototype to silence -Wmissing-prototypes. */ extern initialize_file_ftype _initialize_shnbsd_tdep; void _initialize_shnbsd_tdep (void) { + /* BFD doesn't set a flavour for NetBSD style a.out core files. */ + gdbarch_register_osabi_sniffer (bfd_arch_sh, bfd_target_unknown_flavour, + shnbsd_core_osabi_sniffer); + gdbarch_register_osabi (bfd_arch_sh, 0, GDB_OSABI_NETBSD, shnbsd_init_abi); - gdbarch_register_osabi (bfd_arch_sh, 0, GDB_OSABI_OPENBSD, - shnbsd_init_abi); } Index: src/external/gpl3/gdb/dist/gdb/sparc-nbsd-nat.c diff -u src/external/gpl3/gdb/dist/gdb/sparc-nbsd-nat.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/sparc-nbsd-nat.c:1.2 --- src/external/gpl3/gdb/dist/gdb/sparc-nbsd-nat.c:1.1.1.1 Tue Nov 28 13:18:22 2017 +++ src/external/gpl3/gdb/dist/gdb/sparc-nbsd-nat.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Native-dependent code for NetBSD/sparc. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -21,6 +21,7 @@ #include "regcache.h" #include "target.h" +#include "nbsd-nat.h" #include "sparc-tdep.h" #include "sparc-nat.h" @@ -28,9 +29,43 @@ #include <sys/types.h> #include <machine/pcb.h> +#include <machine/reg.h> #include "bsd-kvm.h" +#ifndef HAVE_GREGSET_T +typedef struct reg gregset_t; +#endif + +#ifndef HAVE_FPREGSET_T +typedef struct fpreg fpregset_t; +#endif +#include "gregset.h" + +void +supply_gregset (struct regcache *regcache, const gregset_t *gregs) +{ + sparc_supply_gregset (sparc_gregmap, regcache, -1, gregs); +} + +void +supply_fpregset (struct regcache *regcache, const fpregset_t *fpregs) +{ + sparc_supply_fpregset (sparc_fpregmap, regcache, -1, fpregs); +} + +void +fill_gregset (const struct regcache *regcache, gregset_t *gregs, int regnum) +{ + sparc_collect_gregset (sparc_gregmap, regcache, regnum, gregs); +} + +void +fill_fpregset (const struct regcache *regcache, fpregset_t *fpregs, int regnum) +{ + sparc_collect_fpregset (sparc_fpregmap, regcache, regnum, fpregs); +} + static int sparc32nbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) { @@ -62,11 +97,14 @@ void _initialize_sparcnbsd_nat (void); void _initialize_sparcnbsd_nat (void) { + struct target_ops *t; sparc_gregmap = &sparc32nbsd_gregmap; sparc_fpregmap = &sparc32_bsd_fpregmap; - /* We've got nothing to add to the generic SPARC target. */ - add_target (sparc_target ()); + /* Add some extra features to the generic SPARC target. */ + t = sparc_target (); + t->to_pid_to_exec_file = nbsd_pid_to_exec_file; + add_target (t); /* Support debugging kernel virtual memory images. */ bsd_kvm_add_target (sparc32nbsd_supply_pcb); Index: src/external/gpl3/gdb/dist/gdb/sparc-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/sparc-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/sparc-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/sparc-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:07 2017 +++ src/external/gpl3/gdb/dist/gdb/sparc-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/sparc. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. This file is part of GDB. @@ -290,7 +290,7 @@ static const struct regset sparc32nbsd_f NULL, sparc32nbsd_supply_fpregset, NULL }; -void +static void sparc32nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); @@ -309,11 +309,41 @@ sparc32nbsd_init_abi (struct gdbarch_inf tdep->step_trap = sparcnbsd_step_trap; frame_unwind_append_unwinder (gdbarch, &sparc32nbsd_sigcontext_frame_unwind); +} + +static void +sparc32nbsd_aout_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + sparc32nbsd_init_abi (info, gdbarch); +} + +void +sparc32nbsd_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + sparc32nbsd_init_abi (info, gdbarch); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); } +/* OpenBSD uses the traditional NetBSD core file format, even for + ports that use ELF. Therefore, if the default OS ABI is OpenBSD + ELF, we return that instead of NetBSD a.out. This is mainly for + the benfit of OpenBSD/sparc64, which inherits the sniffer below + since we include this file for an OpenBSD/sparc64 target. For + OpenBSD/sparc, the NetBSD a.out OS ABI is probably similar enough + to both the OpenBSD a.out and the OpenBSD ELF OS ABI. */ +#define GDB_OSABI_NETBSD_CORE GDB_OSABI_NETBSD + +static enum gdb_osabi +sparcnbsd_core_osabi_sniffer (bfd *abfd) +{ + if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0) + return GDB_OSABI_NETBSD_CORE; + + return GDB_OSABI_UNKNOWN; +} + /* Provide a prototype to silence -Wmissing-prototypes. */ void _initialize_sparcnbsd_tdep (void); @@ -321,6 +351,13 @@ void _initialize_sparcnbsd_tdep (void); void _initialize_sparcnbsd_tdep (void) { + gdbarch_register_osabi_sniffer (bfd_arch_sparc, bfd_target_aout_flavour, + sparcnbsd_aout_osabi_sniffer); + + /* BFD doesn't set a flavour for NetBSD style a.out core files. */ + gdbarch_register_osabi_sniffer (bfd_arch_sparc, bfd_target_unknown_flavour, + sparcnbsd_core_osabi_sniffer); + gdbarch_register_osabi (bfd_arch_sparc, 0, GDB_OSABI_NETBSD, - sparc32nbsd_init_abi); + sparc32nbsd_elf_init_abi); } Index: src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-nat.c diff -u src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-nat.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-nat.c:1.2 --- src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-nat.c:1.1.1.1 Tue Nov 28 13:18:03 2017 +++ src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-nat.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Native-dependent code for NetBSD/sparc64. - Copyright (C) 2003-2017 Free Software Foundation, Inc. + Copyright (C) 2003-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -22,9 +22,21 @@ #include "regcache.h" #include "target.h" +#include "nbsd-nat.h" #include "sparc64-tdep.h" #include "sparc-nat.h" +#include <machine/reg.h> + +#ifndef HAVE_GREGSET_T +typedef struct reg gregset_t; +#endif + +#ifndef HAVE_FPREGSET_T +typedef struct fpreg fpregset_t; +#endif +#include "gregset.h" + /* NetBSD is different from the other OSes that support both SPARC and UltraSPARC in that the result of ptrace(2) depends on whether the traced process is 32-bit or 64-bit. */ @@ -126,7 +138,29 @@ sparc64nbsd_fpregset_supplies_p (struct return 0; } +void +supply_gregset (struct regcache *regcache, const gregset_t *gregs) +{ + sparc64nbsd_supply_gregset (sparc_gregmap, regcache, -1, gregs); +} + +void +supply_fpregset (struct regcache *regcache, const fpregset_t *fpregs) +{ + sparc64nbsd_supply_fpregset (sparc_fpregmap, regcache, -1, fpregs); +} +void +fill_gregset (const struct regcache *regcache, gregset_t *gregs, int regnum) +{ + sparc64nbsd_collect_gregset (sparc_gregmap, regcache, regnum, gregs); +} + +void +fill_fpregset (const struct regcache *regcache, fpregset_t *fpregs, int regnum) +{ + sparc64nbsd_collect_fpregset (sparc_fpregmap, regcache, regnum, fpregs); +} /* Support for debugging kernel virtual memory images. */ #include <sys/types.h> @@ -174,6 +208,8 @@ void _initialize_sparc64nbsd_nat (void); void _initialize_sparc64nbsd_nat (void) { + struct target_ops *t; + sparc_supply_gregset = sparc64nbsd_supply_gregset; sparc_collect_gregset = sparc64nbsd_collect_gregset; sparc_supply_fpregset = sparc64nbsd_supply_fpregset; @@ -181,8 +217,10 @@ _initialize_sparc64nbsd_nat (void) sparc_gregset_supplies_p = sparc64nbsd_gregset_supplies_p; sparc_fpregset_supplies_p = sparc64nbsd_fpregset_supplies_p; - /* We've got nothing to add to the generic SPARC target. */ - add_target (sparc_target ()); + /* Add some extra features to the generic SPARC target. */ + t = sparc_target (); + t->to_pid_to_exec_file = nbsd_pid_to_exec_file; + add_target (t); /* Support debugging kernel virtual memory images. */ bsd_kvm_add_target (sparc64nbsd_supply_pcb); Index: src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:11 2017 +++ src/external/gpl3/gdb/dist/gdb/sparc64-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/sparc64. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. Based on code contributed by Wasabi Systems, Inc. This file is part of GDB. Index: src/external/gpl3/gdb/dist/gdb/vax-nbsd-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/vax-nbsd-tdep.c:1.1.1.1 src/external/gpl3/gdb/dist/gdb/vax-nbsd-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/vax-nbsd-tdep.c:1.1.1.1 Tue Nov 28 13:18:04 2017 +++ src/external/gpl3/gdb/dist/gdb/vax-nbsd-tdep.c Tue Nov 28 22:35:15 2017 @@ -1,6 +1,6 @@ /* Target-dependent code for NetBSD/vax. - Copyright (C) 2004-2017 Free Software Foundation, Inc. + Copyright (C) 2004-2016 Free Software Foundation, Inc. This file is part of GDB. Index: src/external/gpl3/gdb/dist/gdb/config/alpha/nbsd.mh diff -u src/external/gpl3/gdb/dist/gdb/config/alpha/nbsd.mh:1.3 src/external/gpl3/gdb/dist/gdb/config/alpha/nbsd.mh:1.4 --- src/external/gpl3/gdb/dist/gdb/config/alpha/nbsd.mh:1.3 Mon Feb 6 05:46:34 2012 +++ src/external/gpl3/gdb/dist/gdb/config/alpha/nbsd.mh Tue Nov 28 22:35:16 2017 @@ -1,5 +1,5 @@ # Host: NetBSD/alpha -NATDEPFILES= fork-child.o inf-ptrace.o alphabsd-nat.o bsd-kvm.o nbsd-nat.o \ +NATDEPFILES= fork-child.o inf-ptrace.o alpha-bsd-nat.o bsd-kvm.o nbsd-nat.o \ nbsd-thread.o LOADLIBES= -lkvm Index: src/external/gpl3/gdb/dist/gdb/config/arm/nbsdelf.mh diff -u src/external/gpl3/gdb/dist/gdb/config/arm/nbsdelf.mh:1.5 src/external/gpl3/gdb/dist/gdb/config/arm/nbsdelf.mh:1.6 --- src/external/gpl3/gdb/dist/gdb/config/arm/nbsdelf.mh:1.5 Sat Oct 22 10:57:50 2016 +++ src/external/gpl3/gdb/dist/gdb/config/arm/nbsdelf.mh Tue Nov 28 22:35:16 2017 @@ -1,5 +1,5 @@ # Host: NetBSD/arm -NATDEPFILES= fork-child.o inf-ptrace.o nbsd-nat.o armnbsd-nat.o \ +NATDEPFILES= fork-child.o inf-ptrace.o nbsd-nat.o arm-nbsd-nat.o \ bsd-kvm.o nbsd-thread.o LOADLIBES= -lkvm Index: src/external/gpl3/gdb/dist/gdb/config/i386/nbsd64.mh diff -u src/external/gpl3/gdb/dist/gdb/config/i386/nbsd64.mh:1.4 src/external/gpl3/gdb/dist/gdb/config/i386/nbsd64.mh:1.5 --- src/external/gpl3/gdb/dist/gdb/config/i386/nbsd64.mh:1.4 Wed Oct 12 16:20:33 2016 +++ src/external/gpl3/gdb/dist/gdb/config/i386/nbsd64.mh Tue Nov 28 22:35:16 2017 @@ -1,6 +1,6 @@ # Host: NetBSD/amd64 NATDEPFILES= fork-child.o inf-ptrace.o \ - nbsd-nat.o amd64-nat.o x86bsd-nat.o amd64bsd-nat.o amd64nbsd-nat.o \ + nbsd-nat.o amd64-nat.o x86-bsd-nat.o amd64-bsd-nat.o amd64-nbsd-nat.o \ bsd-kvm.o nbsd-thread.o LOADLIBES= -lkvm Index: src/external/gpl3/gdb/dist/gdb/config/i386/nbsdelf.mh diff -u src/external/gpl3/gdb/dist/gdb/config/i386/nbsdelf.mh:1.3 src/external/gpl3/gdb/dist/gdb/config/i386/nbsdelf.mh:1.4 --- src/external/gpl3/gdb/dist/gdb/config/i386/nbsdelf.mh:1.3 Wed Oct 12 16:20:33 2016 +++ src/external/gpl3/gdb/dist/gdb/config/i386/nbsdelf.mh Tue Nov 28 22:35:16 2017 @@ -1,6 +1,7 @@ # Host: NetBSD/i386 ELF NATDEPFILES= fork-child.o inf-ptrace.o \ - nbsd-nat.o x86bsd-nat.o i386bsd-nat.o i386nbsd-nat.o bsd-kvm.o \ - nbsd-thread.o + nbsd-nat.o nbsd-thread.o x86-bsd-nat.o x86-nat.o x86-dregs.o \ + i386-bsd-nat.o i386-nbsd-nat.o \ + bsd-kvm.o LOADLIBES= -lkvm Index: src/external/gpl3/gdb/dist/gdb/config/m68k/nbsdelf.mh diff -u src/external/gpl3/gdb/dist/gdb/config/m68k/nbsdelf.mh:1.3 src/external/gpl3/gdb/dist/gdb/config/m68k/nbsdelf.mh:1.4 --- src/external/gpl3/gdb/dist/gdb/config/m68k/nbsdelf.mh:1.3 Mon Feb 6 05:46:35 2012 +++ src/external/gpl3/gdb/dist/gdb/config/m68k/nbsdelf.mh Tue Nov 28 22:35:16 2017 @@ -1,5 +1,5 @@ # Host: NetBSD/m68k ELF -NATDEPFILES= nbsd-nat.o m68kbsd-nat.o bsd-kvm.o fork-child.o inf-ptrace.o \ +NATDEPFILES= nbsd-nat.o m68k-bsd-nat.o bsd-kvm.o fork-child.o inf-ptrace.o \ nbsd-thread.o LOADLIBES= -lkvm Index: src/external/gpl3/gdb/dist/gdb/config/mips/nbsd.mh diff -u src/external/gpl3/gdb/dist/gdb/config/mips/nbsd.mh:1.5 src/external/gpl3/gdb/dist/gdb/config/mips/nbsd.mh:1.6 --- src/external/gpl3/gdb/dist/gdb/config/mips/nbsd.mh:1.5 Sat Nov 3 11:07:40 2012 +++ src/external/gpl3/gdb/dist/gdb/config/mips/nbsd.mh Tue Nov 28 22:35:16 2017 @@ -1,4 +1,4 @@ # Host: NetBSD/mips -NATDEPFILES= fork-child.o inf-ptrace.o nbsd-nat.o mipsnbsd-nat.o \ +NATDEPFILES= fork-child.o inf-ptrace.o nbsd-nat.o mips-nbsd-nat.o \ nbsd-thread.o bsd-kvm.o LOADLIBES= -lkvm Index: src/external/gpl3/gdb/dist/gdb/config/pa/nbsd.mh diff -u src/external/gpl3/gdb/dist/gdb/config/pa/nbsd.mh:1.2 src/external/gpl3/gdb/dist/gdb/config/pa/nbsd.mh:1.3 --- src/external/gpl3/gdb/dist/gdb/config/pa/nbsd.mh:1.2 Mon Feb 6 05:46:35 2012 +++ src/external/gpl3/gdb/dist/gdb/config/pa/nbsd.mh Tue Nov 28 22:35:16 2017 @@ -1,3 +1,3 @@ # Host: NetBSD/hppa -NATDEPFILES= fork-child.o inf-ptrace.o nbsd-nat.o hppanbsd-nat.o \ +NATDEPFILES= fork-child.o inf-ptrace.o nbsd-nat.o hppa-nbsd-nat.o \ nbsd-thread.o Index: src/external/gpl3/gdb/dist/gdb/config/powerpc/nbsd.mh diff -u src/external/gpl3/gdb/dist/gdb/config/powerpc/nbsd.mh:1.3 src/external/gpl3/gdb/dist/gdb/config/powerpc/nbsd.mh:1.4 --- src/external/gpl3/gdb/dist/gdb/config/powerpc/nbsd.mh:1.3 Mon Feb 6 05:46:35 2012 +++ src/external/gpl3/gdb/dist/gdb/config/powerpc/nbsd.mh Tue Nov 28 22:35:16 2017 @@ -1,5 +1,5 @@ # Host: NetBSD/powerpc -NATDEPFILES= fork-child.o inf-ptrace.o nbsd-nat.o ppcnbsd-nat.o bsd-kvm.o \ +NATDEPFILES= fork-child.o inf-ptrace.o nbsd-nat.o ppc-nbsd-nat.o bsd-kvm.o \ nbsd-thread.o LOADLIBES= -lkvm Index: src/external/gpl3/gdb/dist/gdb/config/powerpc/ppc64-nbsd.mh diff -u src/external/gpl3/gdb/dist/gdb/config/powerpc/ppc64-nbsd.mh:1.2 src/external/gpl3/gdb/dist/gdb/config/powerpc/ppc64-nbsd.mh:1.3 --- src/external/gpl3/gdb/dist/gdb/config/powerpc/ppc64-nbsd.mh:1.2 Mon Feb 6 05:46:35 2012 +++ src/external/gpl3/gdb/dist/gdb/config/powerpc/ppc64-nbsd.mh Tue Nov 28 22:35:16 2017 @@ -1,5 +1,5 @@ # Host: NetBSD/powerpc64 -NATDEPFILES= fork-child.o inf-ptrace.o nbsd-nat.o ppcnbsd-nat.o bsd-kvm.o \ +NATDEPFILES= fork-child.o inf-ptrace.o nbsd-nat.o ppc-nbsd-nat.o bsd-kvm.o \ nbsd-thread.o LOADLIBES= -lkvm Index: src/external/gpl3/gdb/dist/gdb/config/sh/nbsd.mh diff -u src/external/gpl3/gdb/dist/gdb/config/sh/nbsd.mh:1.3 src/external/gpl3/gdb/dist/gdb/config/sh/nbsd.mh:1.4 --- src/external/gpl3/gdb/dist/gdb/config/sh/nbsd.mh:1.3 Mon Feb 6 05:46:36 2012 +++ src/external/gpl3/gdb/dist/gdb/config/sh/nbsd.mh Tue Nov 28 22:35:16 2017 @@ -1,3 +1,3 @@ # Host: NetBSD/sh -NATDEPFILES= inf-ptrace.o fork-child.o nbsd-nat.o shnbsd-nat.o \ +NATDEPFILES= inf-ptrace.o fork-child.o nbsd-nat.o sh-nbsd-nat.o \ nbsd-thread.o Index: src/external/gpl3/gdb/dist/gdb/config/sparc/nbsd64.mh diff -u src/external/gpl3/gdb/dist/gdb/config/sparc/nbsd64.mh:1.3 src/external/gpl3/gdb/dist/gdb/config/sparc/nbsd64.mh:1.4 --- src/external/gpl3/gdb/dist/gdb/config/sparc/nbsd64.mh:1.3 Mon Feb 6 05:46:36 2012 +++ src/external/gpl3/gdb/dist/gdb/config/sparc/nbsd64.mh Tue Nov 28 22:35:16 2017 @@ -1,6 +1,6 @@ # Host: NetBSD/sparc64 NATDEPFILES= fork-child.o inf-ptrace.o \ - nbsd-nat.o sparc64nbsd-nat.o sparc-nat.o bsd-kvm.o \ + nbsd-nat.o sparc64-nbsd-nat.o sparc-nat.o bsd-kvm.o \ nbsd-thread.o LOADLIBES= -lkvm Index: src/external/gpl3/gdb/dist/gdb/config/sparc/nbsdelf.mh diff -u src/external/gpl3/gdb/dist/gdb/config/sparc/nbsdelf.mh:1.3 src/external/gpl3/gdb/dist/gdb/config/sparc/nbsdelf.mh:1.4 --- src/external/gpl3/gdb/dist/gdb/config/sparc/nbsdelf.mh:1.3 Mon Feb 6 05:46:36 2012 +++ src/external/gpl3/gdb/dist/gdb/config/sparc/nbsdelf.mh Tue Nov 28 22:35:16 2017 @@ -1,6 +1,6 @@ # Host: NetBSD/sparc ELF NATDEPFILES= fork-child.o inf-ptrace.o \ - nbsd-nat.o sparcnbsd-nat.o sparc-nat.o bsd-kvm.o \ + nbsd-nat.o sparc-nbsd-nat.o sparc-nat.o bsd-kvm.o \ nbsd-thread.o LOADLIBES= -lkvm Index: src/external/gpl3/gdb/dist/gdb/config/vax/nbsdelf.mh diff -u src/external/gpl3/gdb/dist/gdb/config/vax/nbsdelf.mh:1.3 src/external/gpl3/gdb/dist/gdb/config/vax/nbsdelf.mh:1.4 --- src/external/gpl3/gdb/dist/gdb/config/vax/nbsdelf.mh:1.3 Mon Feb 6 05:46:36 2012 +++ src/external/gpl3/gdb/dist/gdb/config/vax/nbsdelf.mh Tue Nov 28 22:35:16 2017 @@ -1,6 +1,6 @@ # Host: NetBSD/vax ELF NATDEPFILES= fork-child.o inf-ptrace.o \ - nbsd-nat.o vaxbsd-nat.o bsd-kvm.o \ + nbsd-nat.o vax-bsd-nat.o bsd-kvm.o \ nbsd-thread.o LOADLIBES= -lkvm