]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/m68k-bsd-tdep.c
Fix buffer overrun parsing a corrupt tekhex binary.
[thirdparty/binutils-gdb.git] / gdb / m68k-bsd-tdep.c
CommitLineData
8f2d3ea0
MK
1/* Target-dependent code for Motorola 68000 BSD's.
2
61baf725 3 Copyright (C) 2004-2017 Free Software Foundation, Inc.
8f2d3ea0
MK
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
8f2d3ea0
MK
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
8f2d3ea0
MK
19
20#include "defs.h"
21#include "arch-utils.h"
059cb7d2 22#include "frame.h"
8f2d3ea0
MK
23#include "osabi.h"
24#include "regcache.h"
25#include "regset.h"
059cb7d2
MK
26#include "trad-frame.h"
27#include "tramp-frame.h"
ec20a626 28#include "gdbtypes.h"
8f2d3ea0 29
8f2d3ea0
MK
30#include "m68k-tdep.h"
31#include "solib-svr4.h"
32
33/* Core file support. */
34
35/* Sizeof `struct reg' in <machine/reg.h>. */
36#define M68KBSD_SIZEOF_GREGS (18 * 4)
37
38/* Sizeof `struct fpreg' in <machine/reg.h. */
39#define M68KBSD_SIZEOF_FPREGS (((8 * 3) + 3) * 4)
40
41int
6ba38425 42m68kbsd_fpreg_offset (struct gdbarch *gdbarch, int regnum)
8f2d3ea0 43{
6ba38425 44 int fp_len = TYPE_LENGTH (gdbarch_register_type (gdbarch, regnum));
8ed86d01 45
8f2d3ea0 46 if (regnum >= M68K_FPC_REGNUM)
8ed86d01 47 return 8 * fp_len + (regnum - M68K_FPC_REGNUM) * 4;
8f2d3ea0 48
8ed86d01 49 return (regnum - M68K_FP0_REGNUM) * fp_len;
8f2d3ea0
MK
50}
51
52/* Supply register REGNUM from the buffer specified by FPREGS and LEN
53 in the floating-point register set REGSET to register cache
54 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
55
56static void
57m68kbsd_supply_fpregset (const struct regset *regset,
58 struct regcache *regcache,
59 int regnum, const void *fpregs, size_t len)
60{
6ba38425 61 struct gdbarch *gdbarch = get_regcache_arch (regcache);
9a3c8263 62 const gdb_byte *regs = (const gdb_byte *) fpregs;
8f2d3ea0
MK
63 int i;
64
65 gdb_assert (len >= M68KBSD_SIZEOF_FPREGS);
66
67 for (i = M68K_FP0_REGNUM; i <= M68K_PC_REGNUM; i++)
68 {
69 if (regnum == i || regnum == -1)
6ba38425
UW
70 regcache_raw_supply (regcache, i,
71 regs + m68kbsd_fpreg_offset (gdbarch, i));
8f2d3ea0
MK
72 }
73}
74
75/* Supply register REGNUM from the buffer specified by GREGS and LEN
76 in the general-purpose register set REGSET to register cache
77 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
78
79static void
80m68kbsd_supply_gregset (const struct regset *regset,
81 struct regcache *regcache,
82 int regnum, const void *gregs, size_t len)
83{
9a3c8263 84 const gdb_byte *regs = (const gdb_byte *) gregs;
8f2d3ea0
MK
85 int i;
86
87 gdb_assert (len >= M68KBSD_SIZEOF_GREGS);
88
89 for (i = M68K_D0_REGNUM; i <= M68K_PC_REGNUM; i++)
90 {
91 if (regnum == i || regnum == -1)
92 regcache_raw_supply (regcache, i, regs + i * 4);
93 }
94
95 if (len >= M68KBSD_SIZEOF_GREGS + M68KBSD_SIZEOF_FPREGS)
96 {
97 regs += M68KBSD_SIZEOF_GREGS;
98 len -= M68KBSD_SIZEOF_GREGS;
99 m68kbsd_supply_fpregset (regset, regcache, regnum, regs, len);
100 }
101}
102
103/* Motorola 68000 register sets. */
104
3ca7dae4 105static const struct regset m68kbsd_gregset =
8f2d3ea0
MK
106{
107 NULL,
f962539a
AA
108 m68kbsd_supply_gregset,
109 NULL,
110 REGSET_VARIABLE_SIZE
8f2d3ea0
MK
111};
112
3ca7dae4 113static const struct regset m68kbsd_fpregset =
8f2d3ea0
MK
114{
115 NULL,
116 m68kbsd_supply_fpregset
117};
118
022c98ab 119/* Iterate over core file register note sections. */
8f2d3ea0 120
022c98ab
AA
121static void
122m68kbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
123 iterate_over_regset_sections_cb *cb,
124 void *cb_data,
125 const struct regcache *regcache)
8f2d3ea0 126{
022c98ab
AA
127 cb (".reg", M68KBSD_SIZEOF_GREGS, &m68kbsd_gregset, NULL, cb_data);
128 cb (".reg2", M68KBSD_SIZEOF_FPREGS, &m68kbsd_fpregset, NULL, cb_data);
8f2d3ea0 129}
059cb7d2
MK
130\f
131
8f2d3ea0
MK
132static void
133m68kbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
134{
135 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
136
137 tdep->jb_pc = 5;
138 tdep->jb_elt_size = 4;
139
9418f048
UW
140 set_gdbarch_decr_pc_after_break (gdbarch, 2);
141
022c98ab
AA
142 set_gdbarch_iterate_over_regset_sections
143 (gdbarch, m68kbsd_iterate_over_regset_sections);
8f2d3ea0 144
5ab5aa0f
MK
145 /* NetBSD ELF uses the SVR4 ABI. */
146 m68k_svr4_init_abi (info, gdbarch);
8f2d3ea0
MK
147 tdep->struct_return = pcc_struct_return;
148
149 /* NetBSD ELF uses SVR4-style shared libraries. */
8f2d3ea0
MK
150 set_solib_svr4_fetch_link_map_offsets
151 (gdbarch, svr4_ilp32_fetch_link_map_offsets);
152}
153\f
154
8f2d3ea0
MK
155/* Provide a prototype to silence -Wmissing-prototypes. */
156void _initialize_m68kbsd_tdep (void);
157
158void
159_initialize_m68kbsd_tdep (void)
160{
1736a7bd
PA
161 gdbarch_register_osabi (bfd_arch_m68k, 0, GDB_OSABI_NETBSD,
162 m68kbsd_init_abi);
8f2d3ea0 163}