gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / arm-obsd-tdep.c
CommitLineData
a58dc200
MK
1/* Target-dependent code for OpenBSD/arm.
2
b811d2c2 3 Copyright (C) 2006-2020 Free Software Foundation, Inc.
a58dc200
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
a58dc200
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/>. */
a58dc200
MK
19
20#include "defs.h"
d55e5aa6 21#include "osabi.h"
d55e5aa6
TT
22#include "trad-frame.h"
23#include "tramp-frame.h"
a58dc200 24
4de283e4
TT
25#include "obsd-tdep.h"
26#include "arm-tdep.h"
27#include "solib-svr4.h"
28
e3ac4a1e
MK
29/* Signal trampolines. */
30
31static void
32armobsd_sigframe_init (const struct tramp_frame *self,
a262aec2 33 struct frame_info *this_frame,
e3ac4a1e
MK
34 struct trad_frame_cache *cache,
35 CORE_ADDR func)
36{
37 CORE_ADDR sp, sigcontext_addr, addr;
38 int regnum;
39
40 /* We find the appropriate instance of `struct sigcontext' at a
41 fixed offset in the signal frame. */
a262aec2 42 sp = get_frame_register_signed (this_frame, ARM_SP_REGNUM);
e3ac4a1e
MK
43 sigcontext_addr = sp + 16;
44
45 /* PC. */
46 trad_frame_set_reg_addr (cache, ARM_PC_REGNUM, sigcontext_addr + 76);
47
48 /* GPRs. */
49 for (regnum = ARM_A1_REGNUM, addr = sigcontext_addr + 12;
50 regnum <= ARM_LR_REGNUM; regnum++, addr += 4)
51 trad_frame_set_reg_addr (cache, regnum, addr);
52
53 trad_frame_set_id (cache, frame_id_build (sp, func));
54}
55
56static const struct tramp_frame armobsd_sigframe =
57{
58 SIGTRAMP_FRAME,
59 4,
60 {
7bc02706
TT
61 { 0xe28d0010, ULONGEST_MAX }, /* add r0, sp, #16 */
62 { 0xef000067, ULONGEST_MAX }, /* swi SYS_sigreturn */
63 { 0xef000001, ULONGEST_MAX }, /* swi SYS_exit */
64 { 0xeafffffc, ULONGEST_MAX }, /* b . - 8 */
65 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
e3ac4a1e
MK
66 },
67 armobsd_sigframe_init
68};
69\f
70
190dce09 71/* Override default thumb breakpoints. */
948f8e3d
PA
72static const gdb_byte arm_obsd_thumb_le_breakpoint[] = {0xfe, 0xdf};
73static const gdb_byte arm_obsd_thumb_be_breakpoint[] = {0xdf, 0xfe};
190dce09 74
a58dc200
MK
75static void
76armobsd_init_abi (struct gdbarch_info info,
77 struct gdbarch *gdbarch)
78{
79 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
80
81 if (tdep->fp_model == ARM_FLOAT_AUTO)
82 tdep->fp_model = ARM_FLOAT_SOFT_VFP;
83
e3ac4a1e
MK
84 tramp_frame_prepend_unwinder (gdbarch, &armobsd_sigframe);
85
a58dc200
MK
86 /* OpenBSD/arm uses SVR4-style shared libraries. */
87 set_solib_svr4_fetch_link_map_offsets
88 (gdbarch, svr4_ilp32_fetch_link_map_offsets);
aa88762a 89 set_gdbarch_skip_solib_resolver (gdbarch, obsd_skip_solib_resolver);
a58dc200
MK
90
91 tdep->jb_pc = 24;
92 tdep->jb_elt_size = 4;
7c00367c 93
ed09174e
AA
94 set_gdbarch_iterate_over_regset_sections
95 (gdbarch, armbsd_iterate_over_regset_sections);
47ccd048 96
7c00367c
MK
97 /* OpenBSD/arm uses -fpcc-struct-return by default. */
98 tdep->struct_return = pcc_struct_return;
190dce09
UW
99
100 /* Single stepping. */
101 set_gdbarch_software_single_step (gdbarch, arm_software_single_step);
102
103 /* Breakpoints. */
104 switch (info.byte_order)
105 {
106 case BFD_ENDIAN_BIG:
107 tdep->thumb_breakpoint = arm_obsd_thumb_be_breakpoint;
108 tdep->thumb_breakpoint_size = sizeof (arm_obsd_thumb_be_breakpoint);
109 break;
110
111 case BFD_ENDIAN_LITTLE:
112 tdep->thumb_breakpoint = arm_obsd_thumb_le_breakpoint;
113 tdep->thumb_breakpoint_size = sizeof (arm_obsd_thumb_le_breakpoint);
114 break;
115 }
a58dc200 116}
63807e1d 117
6c265988 118void _initialize_armobsd_tdep ();
a58dc200 119void
6c265988 120_initialize_armobsd_tdep ()
a58dc200 121{
1736a7bd 122 gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_OPENBSD,
a58dc200
MK
123 armobsd_init_abi);
124}
This page took 0.870055 seconds and 4 git commands to generate.