diff options
author | Kamil Rytarowski <n54@gmx.com> | 2020-10-06 21:36:22 +0200 |
---|---|---|
committer | Kamil Rytarowski <kamil@moritz.systems> | 2020-10-13 13:33:35 +0200 |
commit | 1b71cfcfdc3e13a655fefa6566b5564cec044c10 (patch) | |
tree | 774c4a2694be59e0d9075bee00fbc9045776fef5 /gdb/i386-netbsd-tdep.c | |
parent | d7a78e5c41c77ad32de668b0b2fde74deeb8190d (diff) | |
download | gdb-1b71cfcfdc3e13a655fefa6566b5564cec044c10.zip gdb-1b71cfcfdc3e13a655fefa6566b5564cec044c10.tar.gz gdb-1b71cfcfdc3e13a655fefa6566b5564cec044c10.tar.bz2 |
Normalize names of the NetBSD files
The files used to be named 'nbsd', which incorrectly reflects
the name of the OS and confuses it with other BSD derived OSes.
gdb/ChangeLog:
* Makefile.in (ALL_64_TARGET_OBS, ALL_TARGET_OBS)
HFILES_NO_SRCDIR, ALLDEPFILES): Rename files.
* alpha-bsd-nat.c: Adjust include.
* alpha-bsd-tdep.h: Adjust comment.
* alpha-nbsd-tdep.c: Rename to ...
* alpha-netbsd-tdep.c: ... this, adjust include.
* amd64-nbsd-nat.c: Rename to ...
* amd64-netbsd-nat.c: ... this, adjust include.
* amd64-nbsd-tdep.c: Rename to ...
* amd64-netbsd-tdep.c: ... this, adjust include.
* amd64-tdep.h: Adjust include.
* arm-nbsd-nat.c: Rename to ...
* arm-netbsd-nat.c: ... this, adjust include.
* arm-nbsd-tdep.c: Rename to ...
* arm-netbsd-tdep.c: ... this, adjust include.
* arm-nbsd-tdep.h: Rename to ...
* arm-netbsd-tdep.h: ... this, adjust include.
* configure.nat: Adjust file lists.
* configure.tgt: Likewise.
* hppa-nbsd-nat.c: Rename to ...
* hppa-netbsd-nat.c: ... this, adjust include.
* hppa-nbsd-tdep.c: Rename to ...
* hppa-netbsd-tdep.c: ... this, adjust include.
* i386-nbsd-nat.c: Rename to ...
* i386-netbsd-nat.c: ... this, adjust include.
* i386-nbsd-tdep.c: Rename to ...
* i386-netbsd-tdep.c: ... this, adjust include.
* m68k-bsd-nat.c: Adjust include.
* mips-nbsd-nat.c: Rename to ...
* mips-netbsd-nat.c: ... this, adjust include.
* mips-nbsd-tdep.c: Rename to ...
* mips-netbsd-tdep.c: ... this, adjust include.
* mips-nbsd-tdep.h: Rename to ...
* mips-netbsd-tdep.h: ... this.
* nbsd-nat.c: Rename to ...
* netbsd-nat.c: ... this, adjust include.
* nbsd-nat.h: Rename to ...
* netbsd-nat.h: ... this, adjust include.
* nbsd-tdep.c: Rename to ...
* netbsd-tdep.c: ... this, adjust include.
* nbsd-tdep.h: Rename to ...
* netbsd-tdep.h: ... this.
* ppc-nbsd-nat.c: Rename to ...
* ppc-netbsd-nat.c: ... this, adjust include.
* ppc-nbsd-tdep.c: Rename to ...
* ppc-netbsd-tdep.c: ... this, adjust include and comment.
* ppc-nbsd-tdep.h: Rename to ...
* ppc-netbsd-tdep.h: ... this.
* sh-nbsd-nat.c: Rename to ...
* sh-netbsd-nat.c: ... this, adjust include.
* sh-nbsd-tdep.c: Rename to ...
* sh-netbsd-tdep.c: ... this, adjust include.
* sparc-nbsd-nat.c: Rename to ...
* sparc-netbsd-nat.c: ... this.
* sparc-nbsd-tdep.c: Rename to ...
* sparc-netbsd-tdep.c: ... this, adjust include.
* sparc64-nbsd-nat.c: Rename to ...
* sparc64-netbsd-nat.c: ... this.
* sparc64-nbsd-tdep.c: Rename to ...
* sparc64-netbsd-tdep.c: ... this, adjust include.
* sparc64-tdep.h: Adjust comment.
* vax-bsd-nat.c: Adjust include.
* vax-nbsd-tdep.c: Rename to ...
* vax-netbsd-tdep.c: ... this, adjust include.
Diffstat (limited to 'gdb/i386-netbsd-tdep.c')
-rw-r--r-- | gdb/i386-netbsd-tdep.c | 432 |
1 files changed, 432 insertions, 0 deletions
diff --git a/gdb/i386-netbsd-tdep.c b/gdb/i386-netbsd-tdep.c new file mode 100644 index 0000000..905c4ff --- /dev/null +++ b/gdb/i386-netbsd-tdep.c @@ -0,0 +1,432 @@ +/* Target-dependent code for NetBSD/i386. + + Copyright (C) 1988-2020 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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/>. */ + +#include "defs.h" +#include "arch-utils.h" +#include "frame.h" +#include "gdbcore.h" +#include "regcache.h" +#include "regset.h" +#include "osabi.h" +#include "symtab.h" +#include "trad-frame.h" +#include "tramp-frame.h" + +#include "i386-tdep.h" +#include "i387-tdep.h" +#include "netbsd-tdep.h" +#include "solib-svr4.h" + +/* From <machine/reg.h>. */ +static int i386nbsd_r_reg_offset[] = +{ + 0 * 4, /* %eax */ + 1 * 4, /* %ecx */ + 2 * 4, /* %edx */ + 3 * 4, /* %ebx */ + 4 * 4, /* %esp */ + 5 * 4, /* %ebp */ + 6 * 4, /* %esi */ + 7 * 4, /* %edi */ + 8 * 4, /* %eip */ + 9 * 4, /* %eflags */ + 10 * 4, /* %cs */ + 11 * 4, /* %ss */ + 12 * 4, /* %ds */ + 13 * 4, /* %es */ + 14 * 4, /* %fs */ + 15 * 4 /* %gs */ +}; + +/* From <machine/signal.h>. */ +static int i386nbsd_sc_reg_offset[] = +{ + 10 * 4, /* %eax */ + 9 * 4, /* %ecx */ + 8 * 4, /* %edx */ + 7 * 4, /* %ebx */ + 14 * 4, /* %esp */ + 6 * 4, /* %ebp */ + 5 * 4, /* %esi */ + 4 * 4, /* %edi */ + 11 * 4, /* %eip */ + 13 * 4, /* %eflags */ + 12 * 4, /* %cs */ + 15 * 4, /* %ss */ + 3 * 4, /* %ds */ + 2 * 4, /* %es */ + 1 * 4, /* %fs */ + 0 * 4 /* %gs */ +}; + +/* From <machine/mcontext.h>. */ +int i386nbsd_mc_reg_offset[] = +{ + 11 * 4, /* %eax */ + 10 * 4, /* %ecx */ + 9 * 4, /* %edx */ + 8 * 4, /* %ebx */ + 7 * 4, /* %esp */ + 6 * 4, /* %ebp */ + 5 * 4, /* %esi */ + 4 * 4, /* %edi */ + 14 * 4, /* %eip */ + 16 * 4, /* %eflags */ + 15 * 4, /* %cs */ + 18 * 4, /* %ss */ + 3 * 4, /* %ds */ + 2 * 4, /* %es */ + 1 * 4, /* %fs */ + 0 * 4 /* %gs */ +}; + +static void i386nbsd_sigtramp_cache_init (const struct tramp_frame *, + struct frame_info *, + struct trad_frame_cache *, + CORE_ADDR); + +static const struct tramp_frame i386nbsd_sigtramp_sc16 = +{ + SIGTRAMP_FRAME, + 1, + { + /* leal 0x10(%esp), %eax */ + { 0x8d, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x10, ULONGEST_MAX }, + + /* pushl %eax */ + { 0x50, ULONGEST_MAX }, + + /* pushl %eax */ + { 0x50, ULONGEST_MAX }, + + /* movl $0x127, %eax # __sigreturn14 */ + { 0xb8, ULONGEST_MAX }, + { 0x27, ULONGEST_MAX }, + {0x01, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + + /* int $0x80 */ + { 0xcd, ULONGEST_MAX }, + { 0x80, ULONGEST_MAX}, + + /* movl $0x1, %eax # exit */ + { 0xb8, ULONGEST_MAX }, + { 0x01, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + + /* int $0x80 */ + { 0xcd, ULONGEST_MAX }, + { 0x80, ULONGEST_MAX}, + + { TRAMP_SENTINEL_INSN, ULONGEST_MAX } + }, + i386nbsd_sigtramp_cache_init +}; + +static const struct tramp_frame i386nbsd_sigtramp_sc2 = +{ + SIGTRAMP_FRAME, + 1, + { + /* leal 0x0c(%esp), %eax */ + { 0x8d, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x0c, ULONGEST_MAX }, + /* movl %eax, 0x4(%esp) */ + { 0x89, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x04, ULONGEST_MAX }, + /* movl $0x127, %eax # __sigreturn14 */ + { 0xb8, ULONGEST_MAX }, + { 0x27, ULONGEST_MAX }, + {0x01, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + /* int $0x80 */ + { 0xcd, ULONGEST_MAX }, + { 0x80, ULONGEST_MAX}, + /* movl %eax, 0x4(%esp) */ + { 0x89, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x04, ULONGEST_MAX }, + /* movl $0x1, %eax */ + { 0xb8, ULONGEST_MAX }, + { 0x01, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + /* int $0x80 */ + { 0xcd, ULONGEST_MAX }, + { 0x80, ULONGEST_MAX}, + { TRAMP_SENTINEL_INSN, ULONGEST_MAX } + }, + i386nbsd_sigtramp_cache_init +}; + +static const struct tramp_frame i386nbsd_sigtramp_si2 = +{ + SIGTRAMP_FRAME, + 1, + { + /* movl 8(%esp),%eax */ + { 0x8b, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x08, ULONGEST_MAX }, + /* movl %eax, 0x4(%esp) */ + { 0x89, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x04, ULONGEST_MAX }, + /* movl $0x134, %eax # setcontext */ + { 0xb8, ULONGEST_MAX }, + { 0x34, ULONGEST_MAX }, + { 0x01, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + /* int $0x80 */ + { 0xcd, ULONGEST_MAX }, + { 0x80, ULONGEST_MAX }, + /* movl %eax, 0x4(%esp) */ + { 0x89, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x04, ULONGEST_MAX }, + /* movl $0x1, %eax */ + { 0xb8, ULONGEST_MAX }, + { 0x01, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + /* int $0x80 */ + { 0xcd, ULONGEST_MAX }, + { 0x80, ULONGEST_MAX }, + { TRAMP_SENTINEL_INSN, ULONGEST_MAX } + }, + i386nbsd_sigtramp_cache_init +}; + +static const struct tramp_frame i386nbsd_sigtramp_si31 = +{ + SIGTRAMP_FRAME, + 1, + { + /* leal 0x8c(%esp), %eax */ + { 0x8d, ULONGEST_MAX }, + { 0x84, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x8c, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + /* movl %eax, 0x4(%esp) */ + { 0x89, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x04, ULONGEST_MAX }, + /* movl $0x134, %eax # setcontext */ + { 0xb8, ULONGEST_MAX }, + { 0x34, ULONGEST_MAX }, + { 0x01, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + /* int $0x80 */ + { 0xcd, ULONGEST_MAX }, + { 0x80, ULONGEST_MAX}, + /* movl %eax, 0x4(%esp) */ + { 0x89, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x04, ULONGEST_MAX }, + /* movl $0x1, %eax */ + { 0xb8, ULONGEST_MAX }, + { 0x01, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + /* int $0x80 */ + { 0xcd, ULONGEST_MAX }, + { 0x80, ULONGEST_MAX}, + { TRAMP_SENTINEL_INSN, ULONGEST_MAX } + }, + i386nbsd_sigtramp_cache_init +}; + +static const struct tramp_frame i386nbsd_sigtramp_si4 = +{ + SIGTRAMP_FRAME, + 1, + { + /* leal 0x8c(%esp), %eax */ + { 0x8d, ULONGEST_MAX }, + { 0x84, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x8c, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + /* movl %eax, 0x4(%esp) */ + { 0x89, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x04, ULONGEST_MAX }, + /* movl $0x134, %eax # setcontext */ + { 0xb8, ULONGEST_MAX }, + { 0x34, ULONGEST_MAX }, + { 0x01, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + { 0x00, ULONGEST_MAX }, + /* int $0x80 */ + { 0xcd, ULONGEST_MAX }, + { 0x80, ULONGEST_MAX}, + /* movl $0xffffffff,0x4(%esp) */ + { 0xc7, ULONGEST_MAX }, + { 0x44, ULONGEST_MAX }, + { 0x24, ULONGEST_MAX }, + { 0x04, ULONGEST_MAX }, + { 0xff, ULONGEST_MAX }, + { 0xff, ULONGEST_MAX }, + { 0xff, ULONGEST_MAX }, + { 0xff, ULONGEST_MAX }, + /* movl $0x1, %eax */ + { 0xb8, ULONGEST_MAX }, + { 0x01, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + {0x00, ULONGEST_MAX }, + /* int $0x80 */ + { 0xcd, ULONGEST_MAX }, + { 0x80, ULONGEST_MAX}, + { TRAMP_SENTINEL_INSN, ULONGEST_MAX } + }, + i386nbsd_sigtramp_cache_init +}; + +static void +i386nbsd_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); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + CORE_ADDR sp = get_frame_register_unsigned (this_frame, I386_ESP_REGNUM); + CORE_ADDR base; + int *reg_offset; + int num_regs; + int i; + + if (self == &i386nbsd_sigtramp_sc16 || self == &i386nbsd_sigtramp_sc2) + { + reg_offset = i386nbsd_sc_reg_offset; + num_regs = ARRAY_SIZE (i386nbsd_sc_reg_offset); + + /* Read in the sigcontext address. */ + base = read_memory_unsigned_integer (sp + 8, 4, byte_order); + } + else + { + reg_offset = i386nbsd_mc_reg_offset; + num_regs = ARRAY_SIZE (i386nbsd_mc_reg_offset); + + /* Read in the ucontext address. */ + base = read_memory_unsigned_integer (sp + 8, 4, byte_order); + /* 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 +i386nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + /* Obviously NetBSD is BSD-based. */ + i386bsd_init_abi (info, gdbarch); + + nbsd_init_abi (info, gdbarch); + + /* NetBSD has a different `struct reg'. */ + tdep->gregset_reg_offset = i386nbsd_r_reg_offset; + tdep->gregset_num_regs = ARRAY_SIZE (i386nbsd_r_reg_offset); + tdep->sizeof_gregset = 16 * 4; + + /* NetBSD uses -freg-struct-return by default. */ + tdep->struct_return = reg_struct_return; + + /* NetBSD uses tramp_frame sniffers for signal trampolines. */ + tdep->sigcontext_addr= 0; + tdep->sigtramp_start = 0; + tdep->sigtramp_end = 0; + tdep->sigtramp_p = 0; + tdep->sc_reg_offset = 0; + tdep->sc_num_regs = 0; + + tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_sc16); + tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_sc2); + tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_si2); + tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_si31); + tramp_frame_prepend_unwinder (gdbarch, &i386nbsd_sigtramp_si4); +} + +/* NetBSD ELF. */ + +static void +i386nbsdelf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + /* It's still NetBSD. */ + i386nbsd_init_abi (info, gdbarch); + + /* But ELF-based. */ + i386_elf_init_abi (info, gdbarch); + + /* NetBSD ELF uses SVR4-style shared libraries. */ + set_solib_svr4_fetch_link_map_offsets + (gdbarch, svr4_ilp32_fetch_link_map_offsets); + + /* NetBSD ELF uses -fpcc-struct-return by default. */ + tdep->struct_return = pcc_struct_return; +} + +void _initialize_i386nbsd_tdep (); +void +_initialize_i386nbsd_tdep () +{ + gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_NETBSD, + i386nbsdelf_init_abi); +} |