]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/arm-netbsd-tdep.c
Finalized intl-update patches
[thirdparty/binutils-gdb.git] / gdb / arm-netbsd-tdep.c
CommitLineData
424f3115 1/* Target-dependent code for NetBSD/arm.
527ca6bb 2
213516ef 3 Copyright (C) 2002-2023 Free Software Foundation, Inc.
66e810cd
RE
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
66e810cd
RE
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/>. */
66e810cd
RE
19
20#include "defs.h"
4de283e4 21#include "osabi.h"
66e810cd 22
cba7e83f 23#include "arch/arm.h"
1b71cfcf
KR
24#include "arm-netbsd-tdep.h"
25#include "netbsd-tdep.h"
66e810cd 26#include "arm-tdep.h"
8dd8e1c7 27#include "regset.h"
9eeef8ef 28#include "solib-svr4.h"
66e810cd 29
9df628e0 30/* Description of the longjmp buffer. */
625602f2 31#define ARM_NBSD_JB_PC 24
f0452268 32#define ARM_NBSD_JB_ELEMENT_SIZE ARM_INT_REGISTER_SIZE
9df628e0 33
85102364 34/* For compatibility with previous implementations of GDB on arm/NetBSD,
66e810cd 35 override the default little-endian breakpoint. */
948f8e3d
PA
36static const gdb_byte arm_nbsd_arm_le_breakpoint[] = {0x11, 0x00, 0x00, 0xe6};
37static const gdb_byte arm_nbsd_arm_be_breakpoint[] = {0xe6, 0x00, 0x00, 0x11};
38static const gdb_byte arm_nbsd_thumb_le_breakpoint[] = {0xfe, 0xde};
39static const gdb_byte arm_nbsd_thumb_be_breakpoint[] = {0xde, 0xfe};
66e810cd 40
8dd8e1c7
CB
41/* This matches struct reg from NetBSD's sys/arch/arm/include/reg.h:
42 https://github.com/NetBSD/src/blob/7c13e6e6773bb171f4ed3ed53013e9d24b3c1eac/sys/arch/arm/include/reg.h#L39
43 */
44struct arm_nbsd_reg
45{
46 uint32_t reg[13];
47 uint32_t sp;
48 uint32_t lr;
49 uint32_t pc;
50 uint32_t cpsr;
51};
52
53void
54arm_nbsd_supply_gregset (const struct regset *regset, struct regcache *regcache,
55 int regnum, const void *gregs, size_t len)
56{
57 const arm_nbsd_reg *gregset = static_cast<const arm_nbsd_reg *>(gregs);
58 gdb_assert (len >= sizeof (arm_nbsd_reg));
59
60 /* Integer registers. */
61 for (int i = ARM_A1_REGNUM; i < ARM_SP_REGNUM; i++)
62 if (regnum == -1 || regnum == i)
63 regcache->raw_supply (i, (char *) &gregset->reg[i]);
64
65 if (regnum == -1 || regnum == ARM_SP_REGNUM)
66 regcache->raw_supply (ARM_SP_REGNUM, (char *) &gregset->sp);
67
68 if (regnum == -1 || regnum == ARM_LR_REGNUM)
69 regcache->raw_supply (ARM_LR_REGNUM, (char *) &gregset->lr);
70
71 if (regnum == -1 || regnum == ARM_PC_REGNUM)
72 {
73 CORE_ADDR r_pc = gdbarch_addr_bits_remove (regcache->arch (), gregset->pc);
74 regcache->raw_supply (ARM_PC_REGNUM, (char *) &r_pc);
75 }
76
77 if (regnum == -1 || regnum == ARM_PS_REGNUM)
78 {
79 if (arm_apcs_32)
80 regcache->raw_supply (ARM_PS_REGNUM, (char *) &gregset->cpsr);
81 else
82 regcache->raw_supply (ARM_PS_REGNUM, (char *) &gregset->pc);
83 }
84}
85
86static const struct regset arm_nbsd_regset = {
87 nullptr,
88 arm_nbsd_supply_gregset,
89 /* We don't need a collect function because we only use this reading registers
90 (via iterate_over_regset_sections and fetch_regs/fetch_register). */
91 nullptr,
92 0
93};
94
95static void
96arm_nbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
97 iterate_over_regset_sections_cb *cb,
98 void *cb_data,
99 const struct regcache *regcache)
100{
101 cb (".reg", sizeof (arm_nbsd_reg), sizeof (arm_nbsd_reg), &arm_nbsd_regset,
102 NULL, cb_data);
103 /* cbiesinger/2020-02-12 -- as far as I can tell, ARM/NetBSD does
104 not write any floating point registers into the core file (tested
105 with NetBSD 9.1_RC1). When it does, this function will need to read them,
106 and the arm-netbsd gdbarch will need a core_read_description function
107 to return the right description for them. */
108}
109
66e810cd
RE
110static void
111arm_netbsd_init_abi_common (struct gdbarch_info info,
112 struct gdbarch *gdbarch)
113{
08106042 114 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
66e810cd
RE
115
116 tdep->lowest_pc = 0x8000;
2afeb6b8
RE
117 switch (info.byte_order)
118 {
119 case BFD_ENDIAN_LITTLE:
120 tdep->arm_breakpoint = arm_nbsd_arm_le_breakpoint;
121 tdep->thumb_breakpoint = arm_nbsd_thumb_le_breakpoint;
122 tdep->arm_breakpoint_size = sizeof (arm_nbsd_arm_le_breakpoint);
123 tdep->thumb_breakpoint_size = sizeof (arm_nbsd_thumb_le_breakpoint);
124 break;
125
126 case BFD_ENDIAN_BIG:
127 tdep->arm_breakpoint = arm_nbsd_arm_be_breakpoint;
128 tdep->thumb_breakpoint = arm_nbsd_thumb_be_breakpoint;
129 tdep->arm_breakpoint_size = sizeof (arm_nbsd_arm_be_breakpoint);
130 tdep->thumb_breakpoint_size = sizeof (arm_nbsd_thumb_be_breakpoint);
131 break;
132
133 default:
f34652de 134 internal_error (_("arm_gdbarch_init: bad byte order for float format"));
2afeb6b8 135 }
9df628e0 136
625602f2
RE
137 tdep->jb_pc = ARM_NBSD_JB_PC;
138 tdep->jb_elt_size = ARM_NBSD_JB_ELEMENT_SIZE;
190dce09 139
8dd8e1c7
CB
140 set_gdbarch_iterate_over_regset_sections
141 (gdbarch, arm_nbsd_iterate_over_regset_sections);
190dce09
UW
142 /* Single stepping. */
143 set_gdbarch_software_single_step (gdbarch, arm_software_single_step);
66e810cd 144}
8dd8e1c7 145
66e810cd 146static void
424f3115 147arm_netbsd_elf_init_abi (struct gdbarch_info info,
66e810cd
RE
148 struct gdbarch *gdbarch)
149{
08106042 150 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
08216dd7 151
66e810cd 152 arm_netbsd_init_abi_common (info, gdbarch);
79743962
KR
153
154 nbsd_init_abi (info, gdbarch);
155
28e97307
DJ
156 if (tdep->fp_model == ARM_FLOAT_AUTO)
157 tdep->fp_model = ARM_FLOAT_SOFT_VFP;
a4ab4a25
MK
158
159 /* NetBSD ELF uses SVR4-style shared libraries. */
160 set_solib_svr4_fetch_link_map_offsets
424f3115 161 (gdbarch, svr4_ilp32_fetch_link_map_offsets);
66e810cd
RE
162}
163
6c265988 164void _initialize_arm_netbsd_tdep ();
66e810cd 165void
6c265988 166_initialize_arm_netbsd_tdep ()
66e810cd 167{
1736a7bd 168 gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_NETBSD,
dda83cd7 169 arm_netbsd_elf_init_abi);
66e810cd 170}