Commit | Line | Data |
---|---|---|
af5ca30d NH |
1 | /* Target-dependent code for NetBSD/hppa |
2 | ||
b811d2c2 | 3 | Copyright (C) 2008-2020 Free Software Foundation, Inc. |
af5ca30d NH |
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 | |
5b1ba0e5 | 9 | the Free Software Foundation; either version 3 of the License, or |
af5ca30d NH |
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 | |
5b1ba0e5 | 18 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
af5ca30d NH |
19 | |
20 | #include "defs.h" | |
21 | #include "osabi.h" | |
22 | #include "regcache.h" | |
23 | #include "regset.h" | |
24 | ||
25 | #include "trad-frame.h" | |
26 | #include "tramp-frame.h" | |
27 | ||
af5ca30d | 28 | #include "hppa-tdep.h" |
03b62bbb | 29 | #include "hppa-bsd-tdep.h" |
0d12e84c | 30 | #include "gdbarch.h" |
af5ca30d NH |
31 | |
32 | /* From <machine/mcontext.h>. */ | |
33 | static int hppanbsd_mc_reg_offset[] = | |
34 | { | |
35 | /* r0 ... r31 */ | |
36 | -1, 1 * 4, 2 * 4, 3 * 4, | |
37 | 4 * 4, 5 * 4, 6 * 4, 7 * 4, | |
38 | 8 * 4, 9 * 4, 10 * 4, 11 * 4, | |
39 | 12 * 4, 13 * 4, 14 * 4, 15 * 4, | |
40 | 16 * 4, 17 * 4, 18 * 4, 19 * 4, | |
41 | 20 * 4, 21 * 4, 22 * 4, 23 * 4, | |
42 | 24 * 4, 25 * 4, 26 * 4, 27 * 4, | |
43 | 28 * 4, 29 * 4, 30 * 4, 31 * 4, | |
44 | ||
45 | 32 * 4, /* HPPA_SAR_REGNUM */ | |
46 | 35 * 4, /* HPPA_PCOQ_HEAD_REGNUM */ | |
47 | 33 * 4, /* HPPA_PCSQ_HEAD_REGNUM */ | |
48 | 36 * 4, /* HPPA_PCOQ_TAIL_REGNUM */ | |
49 | 34 * 4, /* HPPA_PCSQ_TAIL_REGNUM */ | |
50 | -1, /* HPPA_EIEM_REGNUM */ | |
51 | -1, /* HPPA_IIR_REGNUM */ | |
52 | -1, /* HPPA_ISR_REGNUM */ | |
53 | -1, /* HPPA_IOR_REGNUM */ | |
54 | 0 * 4, /* HPPA_IPSW_REGNUM */ | |
55 | -1, /* spare? */ | |
56 | 41 * 4, /* HPPA_SR4_REGNUM */ | |
57 | 37 * 4, /* sr0 */ | |
58 | 38 * 4, /* sr1 */ | |
59 | 39 * 4, /* sr2 */ | |
60 | 40 * 4, /* sr3 */ | |
61 | ||
62 | /* more tbd */ | |
63 | }; | |
64 | ||
65 | static void hppanbsd_sigtramp_cache_init (const struct tramp_frame *, | |
66 | struct frame_info *, | |
67 | struct trad_frame_cache *, | |
68 | CORE_ADDR); | |
69 | ||
70 | static const struct tramp_frame hppanbsd_sigtramp_si4 = | |
71 | { | |
72 | SIGTRAMP_FRAME, | |
73 | 4, | |
74 | { | |
7bc02706 TT |
75 | { 0xc7d7c012, ULONGEST_MAX }, /* bb,>=,n %arg3, 30, 1f */ |
76 | { 0xd6e01c1e, ULONGEST_MAX }, /* depwi 0,31,2,%arg3 */ | |
77 | { 0x0ee81093, ULONGEST_MAX }, /* ldw 4(%arg3), %r19 */ | |
78 | { 0x0ee01097, ULONGEST_MAX }, /* ldw 0(%arg3), %arg3 */ | |
af5ca30d | 79 | /* 1: */ |
7bc02706 TT |
80 | { 0xe8404000, ULONGEST_MAX }, /* blr %r0, %rp */ |
81 | { 0xeae0c002, ULONGEST_MAX }, /* bv,n %r0(%arg3) */ | |
82 | { 0x08000240, ULONGEST_MAX }, /* nop */ | |
83 | ||
84 | { 0x0803025a, ULONGEST_MAX }, /* copy %r3, %arg0 */ | |
85 | { 0x20200801, ULONGEST_MAX }, /* ldil -40000000, %r1 */ | |
86 | { 0xe420e008, ULONGEST_MAX }, /* be,l 4(%sr7, %r1), %sr0, %r31 */ | |
87 | { 0x34160268, ULONGEST_MAX }, /* ldi 134, %t1 ; SYS_setcontext */ | |
88 | ||
89 | { 0x081c025a, ULONGEST_MAX }, /* copy ret0, %arg0 */ | |
90 | { 0x20200801, ULONGEST_MAX }, /* ldil -40000000, %r1 */ | |
91 | { 0xe420e008, ULONGEST_MAX }, /* be,l 4(%sr7, %r1), %sr0, %r31 */ | |
92 | { 0x34160002, ULONGEST_MAX }, /* ldi 1, %t1 ; SYS_exit */ | |
93 | { TRAMP_SENTINEL_INSN, ULONGEST_MAX } | |
af5ca30d NH |
94 | }, |
95 | hppanbsd_sigtramp_cache_init | |
96 | }; | |
97 | ||
98 | ||
99 | static void | |
100 | hppanbsd_sigtramp_cache_init (const struct tramp_frame *self, | |
5366653e | 101 | struct frame_info *this_frame, |
af5ca30d NH |
102 | struct trad_frame_cache *this_cache, |
103 | CORE_ADDR func) | |
104 | { | |
5366653e | 105 | CORE_ADDR sp = get_frame_register_unsigned (this_frame, HPPA_SP_REGNUM); |
af5ca30d NH |
106 | CORE_ADDR base; |
107 | int *reg_offset; | |
108 | int num_regs; | |
109 | int i; | |
110 | ||
111 | reg_offset = hppanbsd_mc_reg_offset; | |
112 | num_regs = ARRAY_SIZE (hppanbsd_mc_reg_offset); | |
113 | ||
114 | /* frame pointer */ | |
115 | base = sp - 0x280; | |
116 | /* offsetof(struct sigframe_siginfo, sf_uc) = 128 */ | |
117 | base += 128; | |
118 | /* offsetof(ucontext_t, uc_mcontext) == 40 */ | |
119 | base += 40; | |
120 | ||
121 | for (i = 0; i < num_regs; i++) | |
122 | if (reg_offset[i] != -1) | |
123 | trad_frame_set_reg_addr (this_cache, i, base + reg_offset[i]); | |
124 | ||
125 | /* Construct the frame ID using the function start. */ | |
126 | trad_frame_set_id (this_cache, frame_id_build (sp, func)); | |
127 | } | |
128 | ||
129 | /* Core file support. */ | |
130 | ||
131 | /* Sizeof `struct reg' in <machine/reg.h>. */ | |
132 | #define HPPANBSD_SIZEOF_GREGS (44 * 4) | |
133 | ||
134 | static int hppanbsd_reg_offset[] = | |
135 | { | |
136 | /* r0 ... r31 */ | |
137 | -1, 1 * 4, 2 * 4, 3 * 4, | |
138 | 4 * 4, 5 * 4, 6 * 4, 7 * 4, | |
139 | 8 * 4, 9 * 4, 10 * 4, 11 * 4, | |
140 | 12 * 4, 13 * 4, 14 * 4, 15 * 4, | |
141 | 16 * 4, 17 * 4, 18 * 4, 19 * 4, | |
142 | 20 * 4, 21 * 4, 22 * 4, 23 * 4, | |
143 | 24 * 4, 25 * 4, 26 * 4, 27 * 4, | |
144 | 28 * 4, 29 * 4, 30 * 4, 31 * 4, | |
145 | ||
146 | 32 * 4, /* HPPA_SAR_REGNUM */ | |
147 | 35 * 4, /* HPPA_PCOQ_HEAD_REGNUM */ | |
148 | 33 * 4, /* HPPA_PCSQ_HEAD_REGNUM */ | |
149 | 36 * 4, /* HPPA_PCOQ_TAIL_REGNUM */ | |
150 | 34 * 4, /* HPPA_PCSQ_TAIL_REGNUM */ | |
151 | -1, /* HPPA_EIEM_REGNUM */ | |
152 | -1, /* HPPA_IIR_REGNUM */ | |
153 | -1, /* HPPA_ISR_REGNUM */ | |
154 | -1, /* HPPA_IOR_REGNUM */ | |
155 | 0 * 4, /* HPPA_IPSW_REGNUM */ | |
156 | }; | |
157 | ||
158 | /* Supply register REGNUM from the buffer specified by GREGS and LEN | |
159 | in the general-purpose register set REGSET to register cache | |
160 | REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */ | |
161 | ||
162 | static void | |
1777feb0 MS |
163 | hppanbsd_supply_gregset (const struct regset *regset, |
164 | struct regcache *regcache, | |
165 | int regnum, const void *gregs, size_t len) | |
af5ca30d | 166 | { |
9a3c8263 | 167 | const gdb_byte *regs = (const gdb_byte *) gregs; |
af5ca30d NH |
168 | int i; |
169 | ||
170 | gdb_assert (len >= HPPANBSD_SIZEOF_GREGS); | |
171 | ||
172 | for (i = 0; i < ARRAY_SIZE (hppanbsd_reg_offset); i++) | |
173 | if (hppanbsd_reg_offset[i] != -1) | |
174 | if (regnum == -1 || regnum == i) | |
73e1c03f | 175 | regcache->raw_supply (i, regs + hppanbsd_reg_offset[i]); |
af5ca30d NH |
176 | } |
177 | ||
178 | /* NetBSD/hppa register set. */ | |
179 | ||
3ca7dae4 | 180 | static const struct regset hppanbsd_gregset = |
af5ca30d NH |
181 | { |
182 | NULL, | |
183 | hppanbsd_supply_gregset | |
184 | }; | |
185 | ||
50c5eb53 | 186 | /* Iterate over supported core file register note sections. */ |
af5ca30d | 187 | |
50c5eb53 AA |
188 | static void |
189 | hppanbsd_iterate_over_regset_sections (struct gdbarch *gdbarch, | |
190 | iterate_over_regset_sections_cb *cb, | |
191 | void *cb_data, | |
192 | const struct regcache *regcache) | |
af5ca30d | 193 | { |
a616bb94 AH |
194 | cb (".reg", HPPANBSD_SIZEOF_GREGS, HPPANBSD_SIZEOF_GREGS, &hppanbsd_gregset, |
195 | NULL, cb_data); | |
af5ca30d NH |
196 | } |
197 | \f | |
af5ca30d NH |
198 | static void |
199 | hppanbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) | |
200 | { | |
201 | /* Obviously NetBSD is BSD-based. */ | |
202 | hppabsd_init_abi (info, gdbarch); | |
203 | ||
204 | /* Core file support. */ | |
50c5eb53 AA |
205 | set_gdbarch_iterate_over_regset_sections |
206 | (gdbarch, hppanbsd_iterate_over_regset_sections); | |
af5ca30d NH |
207 | |
208 | tramp_frame_prepend_unwinder (gdbarch, &hppanbsd_sigtramp_si4); | |
209 | } | |
af5ca30d NH |
210 | |
211 | void | |
212 | _initialize_hppanbsd_tdep (void) | |
213 | { | |
1736a7bd | 214 | gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_NETBSD, |
af5ca30d NH |
215 | hppanbsd_init_abi); |
216 | } |