s390-linux-nat.c revision 1.12 1 1.1 christos /* S390 native-dependent code for GDB, the GNU debugger.
2 1.11 christos Copyright (C) 2001-2024 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos Contributed by D.J. Barrow (djbarrow (at) de.ibm.com,barrow_dj (at) yahoo.com)
5 1.1 christos for IBM Deutschland Entwicklung GmbH, IBM Corporation.
6 1.1 christos
7 1.1 christos This file is part of GDB.
8 1.1 christos
9 1.1 christos This program is free software; you can redistribute it and/or modify
10 1.1 christos it under the terms of the GNU General Public License as published by
11 1.1 christos the Free Software Foundation; either version 3 of the License, or
12 1.1 christos (at your option) any later version.
13 1.1 christos
14 1.1 christos This program is distributed in the hope that it will be useful,
15 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
16 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 1.1 christos GNU General Public License for more details.
18 1.1 christos
19 1.1 christos You should have received a copy of the GNU General Public License
20 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 1.1 christos
22 1.12 christos #include "gdbsupport/gdb_vecs.h"
23 1.11 christos #include "extract-store-integer.h"
24 1.1 christos #include "regcache.h"
25 1.1 christos #include "inferior.h"
26 1.1 christos #include "target.h"
27 1.1 christos #include "linux-nat.h"
28 1.1 christos #include "auxv.h"
29 1.1 christos #include "gregset.h"
30 1.3 christos #include "regset.h"
31 1.5 christos #include "nat/linux-ptrace.h"
32 1.11 christos #include "cli/cli-cmds.h"
33 1.10 christos #include "gdbarch.h"
34 1.1 christos
35 1.8 christos #include "s390-tdep.h"
36 1.1 christos #include "s390-linux-tdep.h"
37 1.1 christos #include "elf/common.h"
38 1.1 christos
39 1.1 christos #include <asm/ptrace.h>
40 1.6 christos #include "nat/gdb_ptrace.h"
41 1.1 christos #include <asm/types.h>
42 1.1 christos #include <sys/procfs.h>
43 1.1 christos #include <sys/ucontext.h>
44 1.1 christos #include <elf.h>
45 1.7 christos #include <algorithm>
46 1.7 christos #include "inf-ptrace.h"
47 1.9 christos #include "linux-tdep.h"
48 1.1 christos
49 1.5 christos /* Per-thread arch-specific data. */
50 1.1 christos
51 1.5 christos struct arch_lwp_info
52 1.5 christos {
53 1.5 christos /* Non-zero if the thread's PER info must be re-written. */
54 1.5 christos int per_info_changed;
55 1.5 christos };
56 1.1 christos
57 1.1 christos static int have_regset_last_break = 0;
58 1.1 christos static int have_regset_system_call = 0;
59 1.1 christos static int have_regset_tdb = 0;
60 1.5 christos static int have_regset_vxrs = 0;
61 1.8 christos static int have_regset_gs = 0;
62 1.1 christos
63 1.3 christos /* Register map for 32-bit executables running under a 64-bit
64 1.3 christos kernel. */
65 1.1 christos
66 1.1 christos #ifdef __s390x__
67 1.3 christos static const struct regcache_map_entry s390_64_regmap_gregset[] =
68 1.3 christos {
69 1.3 christos /* Skip PSWM and PSWA, since they must be handled specially. */
70 1.3 christos { 2, REGCACHE_MAP_SKIP, 8 },
71 1.3 christos { 1, S390_R0_UPPER_REGNUM, 4 }, { 1, S390_R0_REGNUM, 4 },
72 1.3 christos { 1, S390_R1_UPPER_REGNUM, 4 }, { 1, S390_R1_REGNUM, 4 },
73 1.3 christos { 1, S390_R2_UPPER_REGNUM, 4 }, { 1, S390_R2_REGNUM, 4 },
74 1.3 christos { 1, S390_R3_UPPER_REGNUM, 4 }, { 1, S390_R3_REGNUM, 4 },
75 1.3 christos { 1, S390_R4_UPPER_REGNUM, 4 }, { 1, S390_R4_REGNUM, 4 },
76 1.3 christos { 1, S390_R5_UPPER_REGNUM, 4 }, { 1, S390_R5_REGNUM, 4 },
77 1.3 christos { 1, S390_R6_UPPER_REGNUM, 4 }, { 1, S390_R6_REGNUM, 4 },
78 1.3 christos { 1, S390_R7_UPPER_REGNUM, 4 }, { 1, S390_R7_REGNUM, 4 },
79 1.3 christos { 1, S390_R8_UPPER_REGNUM, 4 }, { 1, S390_R8_REGNUM, 4 },
80 1.3 christos { 1, S390_R9_UPPER_REGNUM, 4 }, { 1, S390_R9_REGNUM, 4 },
81 1.3 christos { 1, S390_R10_UPPER_REGNUM, 4 }, { 1, S390_R10_REGNUM, 4 },
82 1.3 christos { 1, S390_R11_UPPER_REGNUM, 4 }, { 1, S390_R11_REGNUM, 4 },
83 1.3 christos { 1, S390_R12_UPPER_REGNUM, 4 }, { 1, S390_R12_REGNUM, 4 },
84 1.3 christos { 1, S390_R13_UPPER_REGNUM, 4 }, { 1, S390_R13_REGNUM, 4 },
85 1.3 christos { 1, S390_R14_UPPER_REGNUM, 4 }, { 1, S390_R14_REGNUM, 4 },
86 1.3 christos { 1, S390_R15_UPPER_REGNUM, 4 }, { 1, S390_R15_REGNUM, 4 },
87 1.3 christos { 16, S390_A0_REGNUM, 4 },
88 1.3 christos { 1, REGCACHE_MAP_SKIP, 4 }, { 1, S390_ORIG_R2_REGNUM, 4 },
89 1.3 christos { 0 }
90 1.3 christos };
91 1.3 christos
92 1.3 christos static const struct regset s390_64_gregset =
93 1.3 christos {
94 1.3 christos s390_64_regmap_gregset,
95 1.3 christos regcache_supply_regset,
96 1.3 christos regcache_collect_regset
97 1.3 christos };
98 1.3 christos
99 1.3 christos #define S390_PSWM_OFFSET 0
100 1.3 christos #define S390_PSWA_OFFSET 8
101 1.1 christos #endif
102 1.1 christos
103 1.7 christos /* PER-event mask bits and PER control bits (CR9). */
104 1.7 christos
105 1.7 christos #define PER_BIT(n) (1UL << (63 - (n)))
106 1.7 christos #define PER_EVENT_BRANCH PER_BIT (32)
107 1.7 christos #define PER_EVENT_IFETCH PER_BIT (33)
108 1.7 christos #define PER_EVENT_STORE PER_BIT (34)
109 1.7 christos #define PER_EVENT_NULLIFICATION PER_BIT (39)
110 1.7 christos #define PER_CONTROL_BRANCH_ADDRESS PER_BIT (40)
111 1.7 christos #define PER_CONTROL_SUSPENSION PER_BIT (41)
112 1.7 christos #define PER_CONTROL_ALTERATION PER_BIT (42)
113 1.7 christos
114 1.8 christos class s390_linux_nat_target final : public linux_nat_target
115 1.8 christos {
116 1.8 christos public:
117 1.8 christos /* Add our register access methods. */
118 1.8 christos void fetch_registers (struct regcache *, int) override;
119 1.8 christos void store_registers (struct regcache *, int) override;
120 1.8 christos
121 1.8 christos /* Add our watchpoint methods. */
122 1.8 christos int can_use_hw_breakpoint (enum bptype, int, int) override;
123 1.8 christos int insert_hw_breakpoint (struct gdbarch *, struct bp_target_info *)
124 1.8 christos override;
125 1.8 christos int remove_hw_breakpoint (struct gdbarch *, struct bp_target_info *)
126 1.8 christos override;
127 1.8 christos int region_ok_for_hw_watchpoint (CORE_ADDR, int) override;
128 1.8 christos bool stopped_by_watchpoint () override;
129 1.8 christos int insert_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
130 1.8 christos struct expression *) override;
131 1.8 christos int remove_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
132 1.8 christos struct expression *) override;
133 1.8 christos
134 1.8 christos /* Detect target architecture. */
135 1.8 christos const struct target_desc *read_description () override;
136 1.10 christos int auxv_parse (const gdb_byte **readptr,
137 1.10 christos const gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
138 1.8 christos override;
139 1.8 christos
140 1.8 christos /* Override linux_nat_target low methods. */
141 1.8 christos void low_new_thread (struct lwp_info *lp) override;
142 1.8 christos void low_delete_thread (struct arch_lwp_info *lp) override;
143 1.8 christos void low_prepare_to_resume (struct lwp_info *lp) override;
144 1.8 christos void low_new_fork (struct lwp_info *parent, pid_t child_pid) override;
145 1.8 christos void low_forget_process (pid_t pid) override;
146 1.8 christos };
147 1.8 christos
148 1.8 christos static s390_linux_nat_target the_s390_linux_nat_target;
149 1.7 christos
150 1.1 christos /* Fill GDB's register array with the general-purpose register values
151 1.1 christos in *REGP.
152 1.1 christos
153 1.1 christos When debugging a 32-bit executable running under a 64-bit kernel,
154 1.1 christos we have to fix up the 64-bit registers we get from the kernel to
155 1.1 christos make them look like 32-bit registers. */
156 1.1 christos
157 1.1 christos void
158 1.1 christos supply_gregset (struct regcache *regcache, const gregset_t *regp)
159 1.1 christos {
160 1.1 christos #ifdef __s390x__
161 1.8 christos struct gdbarch *gdbarch = regcache->arch ();
162 1.1 christos if (gdbarch_ptr_bit (gdbarch) == 32)
163 1.1 christos {
164 1.1 christos enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
165 1.3 christos ULONGEST pswm, pswa;
166 1.1 christos gdb_byte buf[4];
167 1.1 christos
168 1.3 christos regcache_supply_regset (&s390_64_gregset, regcache, -1,
169 1.3 christos regp, sizeof (gregset_t));
170 1.3 christos pswm = extract_unsigned_integer ((const gdb_byte *) regp
171 1.3 christos + S390_PSWM_OFFSET, 8, byte_order);
172 1.3 christos pswa = extract_unsigned_integer ((const gdb_byte *) regp
173 1.3 christos + S390_PSWA_OFFSET, 8, byte_order);
174 1.1 christos store_unsigned_integer (buf, 4, byte_order, (pswm >> 32) | 0x80000);
175 1.8 christos regcache->raw_supply (S390_PSWM_REGNUM, buf);
176 1.1 christos store_unsigned_integer (buf, 4, byte_order,
177 1.1 christos (pswa & 0x7fffffff) | (pswm & 0x80000000));
178 1.8 christos regcache->raw_supply (S390_PSWA_REGNUM, buf);
179 1.1 christos return;
180 1.1 christos }
181 1.1 christos #endif
182 1.1 christos
183 1.3 christos regcache_supply_regset (&s390_gregset, regcache, -1, regp,
184 1.3 christos sizeof (gregset_t));
185 1.1 christos }
186 1.1 christos
187 1.1 christos /* Fill register REGNO (if it is a general-purpose register) in
188 1.1 christos *REGP with the value in GDB's register array. If REGNO is -1,
189 1.1 christos do this for all registers. */
190 1.1 christos
191 1.1 christos void
192 1.1 christos fill_gregset (const struct regcache *regcache, gregset_t *regp, int regno)
193 1.1 christos {
194 1.1 christos #ifdef __s390x__
195 1.8 christos struct gdbarch *gdbarch = regcache->arch ();
196 1.1 christos if (gdbarch_ptr_bit (gdbarch) == 32)
197 1.1 christos {
198 1.3 christos regcache_collect_regset (&s390_64_gregset, regcache, regno,
199 1.3 christos regp, sizeof (gregset_t));
200 1.1 christos
201 1.1 christos if (regno == -1
202 1.1 christos || regno == S390_PSWM_REGNUM || regno == S390_PSWA_REGNUM)
203 1.1 christos {
204 1.1 christos enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
205 1.1 christos ULONGEST pswa, pswm;
206 1.1 christos gdb_byte buf[4];
207 1.5 christos gdb_byte *pswm_p = (gdb_byte *) regp + S390_PSWM_OFFSET;
208 1.5 christos gdb_byte *pswa_p = (gdb_byte *) regp + S390_PSWA_OFFSET;
209 1.1 christos
210 1.5 christos pswm = extract_unsigned_integer (pswm_p, 8, byte_order);
211 1.1 christos
212 1.1 christos if (regno == -1 || regno == S390_PSWM_REGNUM)
213 1.5 christos {
214 1.5 christos pswm &= 0x80000000;
215 1.8 christos regcache->raw_collect (S390_PSWM_REGNUM, buf);
216 1.5 christos pswm |= (extract_unsigned_integer (buf, 4, byte_order)
217 1.5 christos & 0xfff7ffff) << 32;
218 1.5 christos }
219 1.5 christos
220 1.1 christos if (regno == -1 || regno == S390_PSWA_REGNUM)
221 1.5 christos {
222 1.8 christos regcache->raw_collect (S390_PSWA_REGNUM, buf);
223 1.5 christos pswa = extract_unsigned_integer (buf, 4, byte_order);
224 1.5 christos pswm ^= (pswm ^ pswa) & 0x80000000;
225 1.5 christos pswa &= 0x7fffffff;
226 1.5 christos store_unsigned_integer (pswa_p, 8, byte_order, pswa);
227 1.5 christos }
228 1.5 christos
229 1.5 christos store_unsigned_integer (pswm_p, 8, byte_order, pswm);
230 1.1 christos }
231 1.1 christos return;
232 1.1 christos }
233 1.1 christos #endif
234 1.1 christos
235 1.3 christos regcache_collect_regset (&s390_gregset, regcache, regno, regp,
236 1.3 christos sizeof (gregset_t));
237 1.1 christos }
238 1.1 christos
239 1.1 christos /* Fill GDB's register array with the floating-point register values
240 1.1 christos in *REGP. */
241 1.1 christos void
242 1.1 christos supply_fpregset (struct regcache *regcache, const fpregset_t *regp)
243 1.1 christos {
244 1.3 christos regcache_supply_regset (&s390_fpregset, regcache, -1, regp,
245 1.3 christos sizeof (fpregset_t));
246 1.1 christos }
247 1.1 christos
248 1.1 christos /* Fill register REGNO (if it is a general-purpose register) in
249 1.1 christos *REGP with the value in GDB's register array. If REGNO is -1,
250 1.1 christos do this for all registers. */
251 1.1 christos void
252 1.1 christos fill_fpregset (const struct regcache *regcache, fpregset_t *regp, int regno)
253 1.1 christos {
254 1.3 christos regcache_collect_regset (&s390_fpregset, regcache, regno, regp,
255 1.3 christos sizeof (fpregset_t));
256 1.1 christos }
257 1.1 christos
258 1.1 christos /* Find the TID for the current inferior thread to use with ptrace. */
259 1.1 christos static int
260 1.1 christos s390_inferior_tid (void)
261 1.1 christos {
262 1.1 christos /* GNU/Linux LWP ID's are process ID's. */
263 1.8 christos int tid = inferior_ptid.lwp ();
264 1.1 christos if (tid == 0)
265 1.8 christos tid = inferior_ptid.pid (); /* Not a threaded program. */
266 1.1 christos
267 1.1 christos return tid;
268 1.1 christos }
269 1.1 christos
270 1.1 christos /* Fetch all general-purpose registers from process/thread TID and
271 1.1 christos store their values in GDB's register cache. */
272 1.1 christos static void
273 1.1 christos fetch_regs (struct regcache *regcache, int tid)
274 1.1 christos {
275 1.1 christos gregset_t regs;
276 1.1 christos ptrace_area parea;
277 1.1 christos
278 1.1 christos parea.len = sizeof (regs);
279 1.1 christos parea.process_addr = (addr_t) ®s;
280 1.1 christos parea.kernel_addr = offsetof (struct user_regs_struct, psw);
281 1.6 christos if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea, 0) < 0)
282 1.1 christos perror_with_name (_("Couldn't get registers"));
283 1.1 christos
284 1.1 christos supply_gregset (regcache, (const gregset_t *) ®s);
285 1.1 christos }
286 1.1 christos
287 1.1 christos /* Store all valid general-purpose registers in GDB's register cache
288 1.1 christos into the process/thread specified by TID. */
289 1.1 christos static void
290 1.1 christos store_regs (const struct regcache *regcache, int tid, int regnum)
291 1.1 christos {
292 1.1 christos gregset_t regs;
293 1.1 christos ptrace_area parea;
294 1.1 christos
295 1.1 christos parea.len = sizeof (regs);
296 1.1 christos parea.process_addr = (addr_t) ®s;
297 1.1 christos parea.kernel_addr = offsetof (struct user_regs_struct, psw);
298 1.6 christos if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea, 0) < 0)
299 1.1 christos perror_with_name (_("Couldn't get registers"));
300 1.1 christos
301 1.1 christos fill_gregset (regcache, ®s, regnum);
302 1.1 christos
303 1.6 christos if (ptrace (PTRACE_POKEUSR_AREA, tid, (long) &parea, 0) < 0)
304 1.1 christos perror_with_name (_("Couldn't write registers"));
305 1.1 christos }
306 1.1 christos
307 1.1 christos /* Fetch all floating-point registers from process/thread TID and store
308 1.1 christos their values in GDB's register cache. */
309 1.1 christos static void
310 1.1 christos fetch_fpregs (struct regcache *regcache, int tid)
311 1.1 christos {
312 1.1 christos fpregset_t fpregs;
313 1.1 christos ptrace_area parea;
314 1.1 christos
315 1.1 christos parea.len = sizeof (fpregs);
316 1.1 christos parea.process_addr = (addr_t) &fpregs;
317 1.1 christos parea.kernel_addr = offsetof (struct user_regs_struct, fp_regs);
318 1.6 christos if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea, 0) < 0)
319 1.1 christos perror_with_name (_("Couldn't get floating point status"));
320 1.1 christos
321 1.1 christos supply_fpregset (regcache, (const fpregset_t *) &fpregs);
322 1.1 christos }
323 1.1 christos
324 1.1 christos /* Store all valid floating-point registers in GDB's register cache
325 1.1 christos into the process/thread specified by TID. */
326 1.1 christos static void
327 1.1 christos store_fpregs (const struct regcache *regcache, int tid, int regnum)
328 1.1 christos {
329 1.1 christos fpregset_t fpregs;
330 1.1 christos ptrace_area parea;
331 1.1 christos
332 1.1 christos parea.len = sizeof (fpregs);
333 1.1 christos parea.process_addr = (addr_t) &fpregs;
334 1.1 christos parea.kernel_addr = offsetof (struct user_regs_struct, fp_regs);
335 1.6 christos if (ptrace (PTRACE_PEEKUSR_AREA, tid, (long) &parea, 0) < 0)
336 1.1 christos perror_with_name (_("Couldn't get floating point status"));
337 1.1 christos
338 1.1 christos fill_fpregset (regcache, &fpregs, regnum);
339 1.1 christos
340 1.6 christos if (ptrace (PTRACE_POKEUSR_AREA, tid, (long) &parea, 0) < 0)
341 1.1 christos perror_with_name (_("Couldn't write floating point status"));
342 1.1 christos }
343 1.1 christos
344 1.3 christos /* Fetch all registers in the kernel's register set whose number is
345 1.3 christos REGSET_ID, whose size is REGSIZE, and whose layout is described by
346 1.3 christos REGSET, from process/thread TID and store their values in GDB's
347 1.3 christos register cache. */
348 1.1 christos static void
349 1.1 christos fetch_regset (struct regcache *regcache, int tid,
350 1.3 christos int regset_id, int regsize, const struct regset *regset)
351 1.1 christos {
352 1.6 christos void *buf = alloca (regsize);
353 1.1 christos struct iovec iov;
354 1.1 christos
355 1.1 christos iov.iov_base = buf;
356 1.1 christos iov.iov_len = regsize;
357 1.1 christos
358 1.3 christos if (ptrace (PTRACE_GETREGSET, tid, (long) regset_id, (long) &iov) < 0)
359 1.1 christos {
360 1.1 christos if (errno == ENODATA)
361 1.3 christos regcache_supply_regset (regset, regcache, -1, NULL, regsize);
362 1.1 christos else
363 1.1 christos perror_with_name (_("Couldn't get register set"));
364 1.1 christos }
365 1.1 christos else
366 1.3 christos regcache_supply_regset (regset, regcache, -1, buf, regsize);
367 1.1 christos }
368 1.1 christos
369 1.3 christos /* Store all registers in the kernel's register set whose number is
370 1.3 christos REGSET_ID, whose size is REGSIZE, and whose layout is described by
371 1.3 christos REGSET, from GDB's register cache back to process/thread TID. */
372 1.1 christos static void
373 1.1 christos store_regset (struct regcache *regcache, int tid,
374 1.3 christos int regset_id, int regsize, const struct regset *regset)
375 1.1 christos {
376 1.6 christos void *buf = alloca (regsize);
377 1.1 christos struct iovec iov;
378 1.1 christos
379 1.1 christos iov.iov_base = buf;
380 1.1 christos iov.iov_len = regsize;
381 1.1 christos
382 1.3 christos if (ptrace (PTRACE_GETREGSET, tid, (long) regset_id, (long) &iov) < 0)
383 1.1 christos perror_with_name (_("Couldn't get register set"));
384 1.1 christos
385 1.3 christos regcache_collect_regset (regset, regcache, -1, buf, regsize);
386 1.1 christos
387 1.3 christos if (ptrace (PTRACE_SETREGSET, tid, (long) regset_id, (long) &iov) < 0)
388 1.1 christos perror_with_name (_("Couldn't set register set"));
389 1.1 christos }
390 1.1 christos
391 1.1 christos /* Check whether the kernel provides a register set with number REGSET
392 1.1 christos of size REGSIZE for process/thread TID. */
393 1.1 christos static int
394 1.1 christos check_regset (int tid, int regset, int regsize)
395 1.1 christos {
396 1.6 christos void *buf = alloca (regsize);
397 1.1 christos struct iovec iov;
398 1.1 christos
399 1.1 christos iov.iov_base = buf;
400 1.1 christos iov.iov_len = regsize;
401 1.1 christos
402 1.1 christos if (ptrace (PTRACE_GETREGSET, tid, (long) regset, (long) &iov) >= 0
403 1.1 christos || errno == ENODATA)
404 1.1 christos return 1;
405 1.1 christos return 0;
406 1.1 christos }
407 1.1 christos
408 1.1 christos /* Fetch register REGNUM from the child process. If REGNUM is -1, do
409 1.1 christos this for all registers. */
410 1.8 christos void
411 1.8 christos s390_linux_nat_target::fetch_registers (struct regcache *regcache, int regnum)
412 1.1 christos {
413 1.8 christos pid_t tid = get_ptrace_pid (regcache->ptid ());
414 1.1 christos
415 1.1 christos if (regnum == -1 || S390_IS_GREGSET_REGNUM (regnum))
416 1.1 christos fetch_regs (regcache, tid);
417 1.1 christos
418 1.1 christos if (regnum == -1 || S390_IS_FPREGSET_REGNUM (regnum))
419 1.1 christos fetch_fpregs (regcache, tid);
420 1.1 christos
421 1.1 christos if (have_regset_last_break)
422 1.1 christos if (regnum == -1 || regnum == S390_LAST_BREAK_REGNUM)
423 1.1 christos fetch_regset (regcache, tid, NT_S390_LAST_BREAK, 8,
424 1.8 christos (gdbarch_ptr_bit (regcache->arch ()) == 32
425 1.3 christos ? &s390_last_break_regset : &s390x_last_break_regset));
426 1.1 christos
427 1.1 christos if (have_regset_system_call)
428 1.1 christos if (regnum == -1 || regnum == S390_SYSTEM_CALL_REGNUM)
429 1.1 christos fetch_regset (regcache, tid, NT_S390_SYSTEM_CALL, 4,
430 1.3 christos &s390_system_call_regset);
431 1.1 christos
432 1.1 christos if (have_regset_tdb)
433 1.1 christos if (regnum == -1 || S390_IS_TDBREGSET_REGNUM (regnum))
434 1.1 christos fetch_regset (regcache, tid, NT_S390_TDB, s390_sizeof_tdbregset,
435 1.3 christos &s390_tdb_regset);
436 1.5 christos
437 1.5 christos if (have_regset_vxrs)
438 1.5 christos {
439 1.5 christos if (regnum == -1 || (regnum >= S390_V0_LOWER_REGNUM
440 1.5 christos && regnum <= S390_V15_LOWER_REGNUM))
441 1.5 christos fetch_regset (regcache, tid, NT_S390_VXRS_LOW, 16 * 8,
442 1.5 christos &s390_vxrs_low_regset);
443 1.5 christos if (regnum == -1 || (regnum >= S390_V16_REGNUM
444 1.5 christos && regnum <= S390_V31_REGNUM))
445 1.5 christos fetch_regset (regcache, tid, NT_S390_VXRS_HIGH, 16 * 16,
446 1.5 christos &s390_vxrs_high_regset);
447 1.5 christos }
448 1.8 christos
449 1.8 christos if (have_regset_gs)
450 1.8 christos {
451 1.8 christos if (regnum == -1 || (regnum >= S390_GSD_REGNUM
452 1.8 christos && regnum <= S390_GSEPLA_REGNUM))
453 1.8 christos fetch_regset (regcache, tid, NT_S390_GS_CB, 4 * 8,
454 1.8 christos &s390_gs_regset);
455 1.8 christos if (regnum == -1 || (regnum >= S390_BC_GSD_REGNUM
456 1.8 christos && regnum <= S390_BC_GSEPLA_REGNUM))
457 1.8 christos fetch_regset (regcache, tid, NT_S390_GS_BC, 4 * 8,
458 1.8 christos &s390_gsbc_regset);
459 1.8 christos }
460 1.1 christos }
461 1.1 christos
462 1.1 christos /* Store register REGNUM back into the child process. If REGNUM is
463 1.1 christos -1, do this for all registers. */
464 1.8 christos void
465 1.8 christos s390_linux_nat_target::store_registers (struct regcache *regcache, int regnum)
466 1.1 christos {
467 1.8 christos pid_t tid = get_ptrace_pid (regcache->ptid ());
468 1.1 christos
469 1.1 christos if (regnum == -1 || S390_IS_GREGSET_REGNUM (regnum))
470 1.1 christos store_regs (regcache, tid, regnum);
471 1.1 christos
472 1.1 christos if (regnum == -1 || S390_IS_FPREGSET_REGNUM (regnum))
473 1.1 christos store_fpregs (regcache, tid, regnum);
474 1.1 christos
475 1.1 christos /* S390_LAST_BREAK_REGNUM is read-only. */
476 1.1 christos
477 1.1 christos if (have_regset_system_call)
478 1.1 christos if (regnum == -1 || regnum == S390_SYSTEM_CALL_REGNUM)
479 1.1 christos store_regset (regcache, tid, NT_S390_SYSTEM_CALL, 4,
480 1.3 christos &s390_system_call_regset);
481 1.5 christos
482 1.5 christos if (have_regset_vxrs)
483 1.5 christos {
484 1.5 christos if (regnum == -1 || (regnum >= S390_V0_LOWER_REGNUM
485 1.5 christos && regnum <= S390_V15_LOWER_REGNUM))
486 1.5 christos store_regset (regcache, tid, NT_S390_VXRS_LOW, 16 * 8,
487 1.5 christos &s390_vxrs_low_regset);
488 1.5 christos if (regnum == -1 || (regnum >= S390_V16_REGNUM
489 1.5 christos && regnum <= S390_V31_REGNUM))
490 1.5 christos store_regset (regcache, tid, NT_S390_VXRS_HIGH, 16 * 16,
491 1.5 christos &s390_vxrs_high_regset);
492 1.5 christos }
493 1.1 christos }
494 1.1 christos
495 1.1 christos
496 1.1 christos /* Hardware-assisted watchpoint handling. */
497 1.1 christos
498 1.7 christos /* For each process we maintain a list of all currently active
499 1.7 christos watchpoints, in order to properly handle watchpoint removal.
500 1.1 christos
501 1.1 christos The only thing we actually need is the total address space area
502 1.1 christos spanned by the watchpoints. */
503 1.1 christos
504 1.9 christos struct watch_area
505 1.1 christos {
506 1.1 christos CORE_ADDR lo_addr;
507 1.1 christos CORE_ADDR hi_addr;
508 1.9 christos };
509 1.7 christos
510 1.7 christos /* Hardware debug state. */
511 1.7 christos
512 1.7 christos struct s390_debug_reg_state
513 1.7 christos {
514 1.9 christos std::vector<watch_area> watch_areas;
515 1.9 christos std::vector<watch_area> break_areas;
516 1.1 christos };
517 1.1 christos
518 1.7 christos /* Per-process data. */
519 1.7 christos
520 1.7 christos struct s390_process_info
521 1.7 christos {
522 1.9 christos struct s390_process_info *next = nullptr;
523 1.9 christos pid_t pid = 0;
524 1.7 christos struct s390_debug_reg_state state;
525 1.7 christos };
526 1.7 christos
527 1.7 christos static struct s390_process_info *s390_process_list = NULL;
528 1.7 christos
529 1.7 christos /* Find process data for process PID. */
530 1.7 christos
531 1.7 christos static struct s390_process_info *
532 1.7 christos s390_find_process_pid (pid_t pid)
533 1.7 christos {
534 1.7 christos struct s390_process_info *proc;
535 1.7 christos
536 1.7 christos for (proc = s390_process_list; proc; proc = proc->next)
537 1.7 christos if (proc->pid == pid)
538 1.7 christos return proc;
539 1.7 christos
540 1.7 christos return NULL;
541 1.7 christos }
542 1.7 christos
543 1.7 christos /* Add process data for process PID. Returns newly allocated info
544 1.7 christos object. */
545 1.7 christos
546 1.7 christos static struct s390_process_info *
547 1.7 christos s390_add_process (pid_t pid)
548 1.7 christos {
549 1.9 christos struct s390_process_info *proc = new struct s390_process_info;
550 1.7 christos
551 1.7 christos proc->pid = pid;
552 1.7 christos proc->next = s390_process_list;
553 1.7 christos s390_process_list = proc;
554 1.7 christos
555 1.7 christos return proc;
556 1.7 christos }
557 1.7 christos
558 1.7 christos /* Get data specific info for process PID, creating it if necessary.
559 1.7 christos Never returns NULL. */
560 1.7 christos
561 1.7 christos static struct s390_process_info *
562 1.7 christos s390_process_info_get (pid_t pid)
563 1.7 christos {
564 1.7 christos struct s390_process_info *proc;
565 1.7 christos
566 1.7 christos proc = s390_find_process_pid (pid);
567 1.7 christos if (proc == NULL)
568 1.7 christos proc = s390_add_process (pid);
569 1.7 christos
570 1.7 christos return proc;
571 1.7 christos }
572 1.7 christos
573 1.7 christos /* Get hardware debug state for process PID. */
574 1.7 christos
575 1.7 christos static struct s390_debug_reg_state *
576 1.7 christos s390_get_debug_reg_state (pid_t pid)
577 1.7 christos {
578 1.7 christos return &s390_process_info_get (pid)->state;
579 1.7 christos }
580 1.7 christos
581 1.7 christos /* Called whenever GDB is no longer debugging process PID. It deletes
582 1.7 christos data structures that keep track of hardware debug state. */
583 1.7 christos
584 1.8 christos void
585 1.8 christos s390_linux_nat_target::low_forget_process (pid_t pid)
586 1.7 christos {
587 1.7 christos struct s390_process_info *proc, **proc_link;
588 1.7 christos
589 1.7 christos proc = s390_process_list;
590 1.7 christos proc_link = &s390_process_list;
591 1.7 christos
592 1.7 christos while (proc != NULL)
593 1.7 christos {
594 1.7 christos if (proc->pid == pid)
595 1.7 christos {
596 1.7 christos *proc_link = proc->next;
597 1.9 christos delete proc;
598 1.7 christos return;
599 1.7 christos }
600 1.7 christos
601 1.7 christos proc_link = &proc->next;
602 1.7 christos proc = *proc_link;
603 1.7 christos }
604 1.7 christos }
605 1.7 christos
606 1.7 christos /* linux_nat_new_fork hook. */
607 1.7 christos
608 1.8 christos void
609 1.8 christos s390_linux_nat_target::low_new_fork (struct lwp_info *parent, pid_t child_pid)
610 1.7 christos {
611 1.7 christos pid_t parent_pid;
612 1.7 christos struct s390_debug_reg_state *parent_state;
613 1.7 christos struct s390_debug_reg_state *child_state;
614 1.7 christos
615 1.7 christos /* NULL means no watchpoint has ever been set in the parent. In
616 1.7 christos that case, there's nothing to do. */
617 1.7 christos if (lwp_arch_private_info (parent) == NULL)
618 1.7 christos return;
619 1.7 christos
620 1.7 christos /* GDB core assumes the child inherits the watchpoints/hw breakpoints of
621 1.7 christos the parent. So copy the debug state from parent to child. */
622 1.7 christos
623 1.8 christos parent_pid = parent->ptid.pid ();
624 1.7 christos parent_state = s390_get_debug_reg_state (parent_pid);
625 1.7 christos child_state = s390_get_debug_reg_state (child_pid);
626 1.7 christos
627 1.9 christos child_state->watch_areas = parent_state->watch_areas;
628 1.9 christos child_state->break_areas = parent_state->break_areas;
629 1.7 christos }
630 1.7 christos
631 1.7 christos /* Dump PER state. */
632 1.7 christos
633 1.7 christos static void
634 1.7 christos s390_show_debug_regs (int tid, const char *where)
635 1.7 christos {
636 1.7 christos per_struct per_info;
637 1.7 christos ptrace_area parea;
638 1.7 christos
639 1.7 christos parea.len = sizeof (per_info);
640 1.7 christos parea.process_addr = (addr_t) &per_info;
641 1.7 christos parea.kernel_addr = offsetof (struct user_regs_struct, per_info);
642 1.7 christos
643 1.7 christos if (ptrace (PTRACE_PEEKUSR_AREA, tid, &parea, 0) < 0)
644 1.7 christos perror_with_name (_("Couldn't retrieve debug regs"));
645 1.7 christos
646 1.7 christos debug_printf ("PER (debug) state for %d -- %s\n"
647 1.7 christos " cr9-11: %lx %lx %lx\n"
648 1.7 christos " start, end: %lx %lx\n"
649 1.7 christos " code/ATMID: %x address: %lx PAID: %x\n",
650 1.7 christos tid,
651 1.7 christos where,
652 1.7 christos per_info.control_regs.words.cr[0],
653 1.7 christos per_info.control_regs.words.cr[1],
654 1.7 christos per_info.control_regs.words.cr[2],
655 1.7 christos per_info.starting_addr,
656 1.7 christos per_info.ending_addr,
657 1.7 christos per_info.lowcore.words.perc_atmid,
658 1.7 christos per_info.lowcore.words.address,
659 1.7 christos per_info.lowcore.words.access_id);
660 1.7 christos }
661 1.1 christos
662 1.8 christos bool
663 1.8 christos s390_linux_nat_target::stopped_by_watchpoint ()
664 1.1 christos {
665 1.7 christos struct s390_debug_reg_state *state
666 1.8 christos = s390_get_debug_reg_state (inferior_ptid.pid ());
667 1.1 christos per_lowcore_bits per_lowcore;
668 1.1 christos ptrace_area parea;
669 1.1 christos
670 1.7 christos if (show_debug_regs)
671 1.7 christos s390_show_debug_regs (s390_inferior_tid (), "stop");
672 1.7 christos
673 1.1 christos /* Speed up common case. */
674 1.9 christos if (state->watch_areas.empty ())
675 1.8 christos return false;
676 1.1 christos
677 1.10 christos siginfo_t siginfo;
678 1.10 christos if (!linux_nat_get_siginfo (inferior_ptid, &siginfo))
679 1.10 christos return false;
680 1.10 christos if (siginfo.si_signo != SIGTRAP
681 1.10 christos || (siginfo.si_code & 0xffff) != TRAP_HWBKPT)
682 1.10 christos return false;
683 1.10 christos
684 1.1 christos parea.len = sizeof (per_lowcore);
685 1.1 christos parea.process_addr = (addr_t) & per_lowcore;
686 1.1 christos parea.kernel_addr = offsetof (struct user_regs_struct, per_info.lowcore);
687 1.6 christos if (ptrace (PTRACE_PEEKUSR_AREA, s390_inferior_tid (), &parea, 0) < 0)
688 1.1 christos perror_with_name (_("Couldn't retrieve watchpoint status"));
689 1.1 christos
690 1.8 christos bool result = (per_lowcore.perc_storage_alteration == 1
691 1.8 christos && per_lowcore.perc_store_real_address == 0);
692 1.1 christos
693 1.1 christos return result;
694 1.1 christos }
695 1.1 christos
696 1.5 christos /* Each time before resuming a thread, update its PER info. */
697 1.5 christos
698 1.8 christos void
699 1.8 christos s390_linux_nat_target::low_prepare_to_resume (struct lwp_info *lp)
700 1.1 christos {
701 1.1 christos int tid;
702 1.8 christos pid_t pid = ptid_of_lwp (lp).pid ();
703 1.1 christos
704 1.1 christos per_struct per_info;
705 1.1 christos ptrace_area parea;
706 1.1 christos
707 1.1 christos CORE_ADDR watch_lo_addr = (CORE_ADDR)-1, watch_hi_addr = 0;
708 1.7 christos struct arch_lwp_info *lp_priv = lwp_arch_private_info (lp);
709 1.7 christos struct s390_debug_reg_state *state = s390_get_debug_reg_state (pid);
710 1.7 christos int step = lwp_is_stepping (lp);
711 1.1 christos
712 1.7 christos /* Nothing to do if there was never any PER info for this thread. */
713 1.7 christos if (lp_priv == NULL)
714 1.5 christos return;
715 1.5 christos
716 1.7 christos /* If PER info has changed, update it. When single-stepping, disable
717 1.7 christos hardware breakpoints (if any). Otherwise we're done. */
718 1.7 christos if (!lp_priv->per_info_changed)
719 1.7 christos {
720 1.9 christos if (!step || state->break_areas.empty ())
721 1.7 christos return;
722 1.7 christos }
723 1.7 christos
724 1.7 christos lp_priv->per_info_changed = 0;
725 1.5 christos
726 1.8 christos tid = ptid_of_lwp (lp).lwp ();
727 1.1 christos if (tid == 0)
728 1.7 christos tid = pid;
729 1.1 christos
730 1.1 christos parea.len = sizeof (per_info);
731 1.1 christos parea.process_addr = (addr_t) & per_info;
732 1.1 christos parea.kernel_addr = offsetof (struct user_regs_struct, per_info);
733 1.1 christos
734 1.7 christos /* Clear PER info, but adjust the single_step field (used by older
735 1.7 christos kernels only). */
736 1.7 christos memset (&per_info, 0, sizeof (per_info));
737 1.7 christos per_info.single_step = (step != 0);
738 1.7 christos
739 1.9 christos if (!state->watch_areas.empty ())
740 1.1 christos {
741 1.9 christos for (const auto &area : state->watch_areas)
742 1.7 christos {
743 1.9 christos watch_lo_addr = std::min (watch_lo_addr, area.lo_addr);
744 1.9 christos watch_hi_addr = std::max (watch_hi_addr, area.hi_addr);
745 1.7 christos }
746 1.7 christos
747 1.7 christos /* Enable storage-alteration events. */
748 1.7 christos per_info.control_regs.words.cr[0] |= (PER_EVENT_STORE
749 1.7 christos | PER_CONTROL_ALTERATION);
750 1.1 christos }
751 1.7 christos
752 1.9 christos if (!state->break_areas.empty ())
753 1.1 christos {
754 1.7 christos /* Don't install hardware breakpoints while single-stepping, since
755 1.7 christos our PER settings (e.g. the nullification bit) might then conflict
756 1.7 christos with the kernel's. But re-install them afterwards. */
757 1.7 christos if (step)
758 1.7 christos lp_priv->per_info_changed = 1;
759 1.7 christos else
760 1.7 christos {
761 1.9 christos for (const auto &area : state->break_areas)
762 1.7 christos {
763 1.9 christos watch_lo_addr = std::min (watch_lo_addr, area.lo_addr);
764 1.9 christos watch_hi_addr = std::max (watch_hi_addr, area.hi_addr);
765 1.7 christos }
766 1.7 christos
767 1.7 christos /* If there's just one breakpoint, enable instruction-fetching
768 1.7 christos nullification events for the breakpoint address (fast).
769 1.7 christos Otherwise stop after any instruction within the PER area and
770 1.7 christos after any branch into it (slow). */
771 1.7 christos if (watch_hi_addr == watch_lo_addr)
772 1.7 christos per_info.control_regs.words.cr[0] |= (PER_EVENT_NULLIFICATION
773 1.7 christos | PER_EVENT_IFETCH);
774 1.7 christos else
775 1.7 christos {
776 1.7 christos /* The PER area must include the instruction before the
777 1.7 christos first breakpoint address. */
778 1.7 christos watch_lo_addr = watch_lo_addr > 6 ? watch_lo_addr - 6 : 0;
779 1.7 christos per_info.control_regs.words.cr[0]
780 1.7 christos |= (PER_EVENT_BRANCH
781 1.7 christos | PER_EVENT_IFETCH
782 1.7 christos | PER_CONTROL_BRANCH_ADDRESS);
783 1.7 christos }
784 1.7 christos }
785 1.1 christos }
786 1.1 christos per_info.starting_addr = watch_lo_addr;
787 1.1 christos per_info.ending_addr = watch_hi_addr;
788 1.1 christos
789 1.6 christos if (ptrace (PTRACE_POKEUSR_AREA, tid, &parea, 0) < 0)
790 1.1 christos perror_with_name (_("Couldn't modify watchpoint status"));
791 1.7 christos
792 1.7 christos if (show_debug_regs)
793 1.7 christos s390_show_debug_regs (tid, "resume");
794 1.1 christos }
795 1.1 christos
796 1.7 christos /* Mark the PER info as changed, so the next resume will update it. */
797 1.5 christos
798 1.5 christos static void
799 1.7 christos s390_mark_per_info_changed (struct lwp_info *lp)
800 1.5 christos {
801 1.7 christos if (lwp_arch_private_info (lp) == NULL)
802 1.7 christos lwp_set_arch_private_info (lp, XCNEW (struct arch_lwp_info));
803 1.5 christos
804 1.7 christos lwp_arch_private_info (lp)->per_info_changed = 1;
805 1.5 christos }
806 1.5 christos
807 1.5 christos /* When attaching to a new thread, mark its PER info as changed. */
808 1.5 christos
809 1.8 christos void
810 1.8 christos s390_linux_nat_target::low_new_thread (struct lwp_info *lp)
811 1.5 christos {
812 1.7 christos s390_mark_per_info_changed (lp);
813 1.5 christos }
814 1.5 christos
815 1.8 christos /* Function to call when a thread is being deleted. */
816 1.8 christos
817 1.8 christos void
818 1.8 christos s390_linux_nat_target::low_delete_thread (struct arch_lwp_info *arch_lwp)
819 1.8 christos {
820 1.8 christos xfree (arch_lwp);
821 1.8 christos }
822 1.8 christos
823 1.7 christos /* Iterator callback for s390_refresh_per_info. */
824 1.7 christos
825 1.1 christos static int
826 1.9 christos s390_refresh_per_info_cb (struct lwp_info *lp)
827 1.1 christos {
828 1.7 christos s390_mark_per_info_changed (lp);
829 1.1 christos
830 1.7 christos if (!lwp_is_stopped (lp))
831 1.7 christos linux_stop_lwp (lp);
832 1.7 christos return 0;
833 1.7 christos }
834 1.1 christos
835 1.7 christos /* Make sure that threads are stopped and mark PER info as changed. */
836 1.1 christos
837 1.7 christos static int
838 1.7 christos s390_refresh_per_info (void)
839 1.7 christos {
840 1.8 christos ptid_t pid_ptid = ptid_t (current_lwp_ptid ().pid ());
841 1.1 christos
842 1.9 christos iterate_over_lwps (pid_ptid, s390_refresh_per_info_cb);
843 1.1 christos return 0;
844 1.1 christos }
845 1.1 christos
846 1.8 christos int
847 1.8 christos s390_linux_nat_target::insert_watchpoint (CORE_ADDR addr, int len,
848 1.8 christos enum target_hw_bp_type type,
849 1.8 christos struct expression *cond)
850 1.1 christos {
851 1.9 christos watch_area area;
852 1.7 christos struct s390_debug_reg_state *state
853 1.8 christos = s390_get_debug_reg_state (inferior_ptid.pid ());
854 1.7 christos
855 1.7 christos area.lo_addr = addr;
856 1.7 christos area.hi_addr = addr + len - 1;
857 1.9 christos state->watch_areas.push_back (area);
858 1.1 christos
859 1.7 christos return s390_refresh_per_info ();
860 1.7 christos }
861 1.1 christos
862 1.8 christos int
863 1.8 christos s390_linux_nat_target::remove_watchpoint (CORE_ADDR addr, int len,
864 1.8 christos enum target_hw_bp_type type,
865 1.8 christos struct expression *cond)
866 1.7 christos {
867 1.7 christos unsigned ix;
868 1.7 christos struct s390_debug_reg_state *state
869 1.8 christos = s390_get_debug_reg_state (inferior_ptid.pid ());
870 1.7 christos
871 1.9 christos for (ix = 0; ix < state->watch_areas.size (); ix++)
872 1.1 christos {
873 1.9 christos watch_area &area = state->watch_areas[ix];
874 1.9 christos if (area.lo_addr == addr && area.hi_addr == addr + len - 1)
875 1.7 christos {
876 1.9 christos unordered_remove (state->watch_areas, ix);
877 1.7 christos return s390_refresh_per_info ();
878 1.7 christos }
879 1.1 christos }
880 1.1 christos
881 1.10 christos gdb_printf (gdb_stderr,
882 1.10 christos "Attempt to remove nonexistent watchpoint.\n");
883 1.7 christos return -1;
884 1.7 christos }
885 1.7 christos
886 1.7 christos /* Implement the "can_use_hw_breakpoint" target_ops method. */
887 1.1 christos
888 1.8 christos int
889 1.8 christos s390_linux_nat_target::can_use_hw_breakpoint (enum bptype type,
890 1.8 christos int cnt, int othertype)
891 1.7 christos {
892 1.7 christos if (type == bp_hardware_watchpoint || type == bp_hardware_breakpoint)
893 1.7 christos return 1;
894 1.1 christos return 0;
895 1.1 christos }
896 1.1 christos
897 1.7 christos /* Implement the "insert_hw_breakpoint" target_ops method. */
898 1.7 christos
899 1.8 christos int
900 1.8 christos s390_linux_nat_target::insert_hw_breakpoint (struct gdbarch *gdbarch,
901 1.8 christos struct bp_target_info *bp_tgt)
902 1.1 christos {
903 1.9 christos watch_area area;
904 1.7 christos struct s390_debug_reg_state *state;
905 1.7 christos
906 1.7 christos area.lo_addr = bp_tgt->placed_address = bp_tgt->reqstd_address;
907 1.7 christos area.hi_addr = area.lo_addr;
908 1.8 christos state = s390_get_debug_reg_state (inferior_ptid.pid ());
909 1.9 christos state->break_areas.push_back (area);
910 1.7 christos
911 1.7 christos return s390_refresh_per_info ();
912 1.7 christos }
913 1.7 christos
914 1.7 christos /* Implement the "remove_hw_breakpoint" target_ops method. */
915 1.7 christos
916 1.8 christos int
917 1.8 christos s390_linux_nat_target::remove_hw_breakpoint (struct gdbarch *gdbarch,
918 1.8 christos struct bp_target_info *bp_tgt)
919 1.7 christos {
920 1.7 christos unsigned ix;
921 1.7 christos struct s390_debug_reg_state *state;
922 1.7 christos
923 1.8 christos state = s390_get_debug_reg_state (inferior_ptid.pid ());
924 1.9 christos for (ix = 0; state->break_areas.size (); ix++)
925 1.7 christos {
926 1.9 christos watch_area &area = state->break_areas[ix];
927 1.9 christos if (area.lo_addr == bp_tgt->placed_address)
928 1.7 christos {
929 1.9 christos unordered_remove (state->break_areas, ix);
930 1.7 christos return s390_refresh_per_info ();
931 1.7 christos }
932 1.7 christos }
933 1.7 christos
934 1.10 christos gdb_printf (gdb_stderr,
935 1.10 christos "Attempt to remove nonexistent breakpoint.\n");
936 1.7 christos return -1;
937 1.1 christos }
938 1.1 christos
939 1.8 christos int
940 1.8 christos s390_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int cnt)
941 1.1 christos {
942 1.1 christos return 1;
943 1.1 christos }
944 1.1 christos
945 1.1 christos static int
946 1.1 christos s390_target_wordsize (void)
947 1.1 christos {
948 1.1 christos int wordsize = 4;
949 1.1 christos
950 1.1 christos /* Check for 64-bit inferior process. This is the case when the host is
951 1.1 christos 64-bit, and in addition bit 32 of the PSW mask is set. */
952 1.1 christos #ifdef __s390x__
953 1.11 christos int tid = s390_inferior_tid ();
954 1.11 christos gdb_assert (tid != 0);
955 1.1 christos long pswm;
956 1.1 christos
957 1.1 christos errno = 0;
958 1.11 christos pswm = (long) ptrace (PTRACE_PEEKUSER, tid, PT_PSWMASK, 0);
959 1.1 christos if (errno == 0 && (pswm & 0x100000000ul) != 0)
960 1.1 christos wordsize = 8;
961 1.1 christos #endif
962 1.1 christos
963 1.1 christos return wordsize;
964 1.1 christos }
965 1.1 christos
966 1.8 christos int
967 1.10 christos s390_linux_nat_target::auxv_parse (const gdb_byte **readptr,
968 1.10 christos const gdb_byte *endptr, CORE_ADDR *typep,
969 1.8 christos CORE_ADDR *valp)
970 1.1 christos {
971 1.11 christos gdb_assert (inferior_ptid != null_ptid);
972 1.1 christos int sizeof_auxv_field = s390_target_wordsize ();
973 1.11 christos bfd_endian byte_order = gdbarch_byte_order (current_inferior ()->arch ());
974 1.10 christos const gdb_byte *ptr = *readptr;
975 1.1 christos
976 1.1 christos if (endptr == ptr)
977 1.1 christos return 0;
978 1.1 christos
979 1.1 christos if (endptr - ptr < sizeof_auxv_field * 2)
980 1.1 christos return -1;
981 1.1 christos
982 1.1 christos *typep = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
983 1.1 christos ptr += sizeof_auxv_field;
984 1.1 christos *valp = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
985 1.1 christos ptr += sizeof_auxv_field;
986 1.1 christos
987 1.1 christos *readptr = ptr;
988 1.1 christos return 1;
989 1.1 christos }
990 1.1 christos
991 1.8 christos const struct target_desc *
992 1.8 christos s390_linux_nat_target::read_description ()
993 1.1 christos {
994 1.11 christos if (inferior_ptid == null_ptid)
995 1.11 christos return this->beneath ()->read_description ();
996 1.11 christos
997 1.10 christos int tid = inferior_ptid.pid ();
998 1.1 christos
999 1.1 christos have_regset_last_break
1000 1.1 christos = check_regset (tid, NT_S390_LAST_BREAK, 8);
1001 1.1 christos have_regset_system_call
1002 1.1 christos = check_regset (tid, NT_S390_SYSTEM_CALL, 4);
1003 1.1 christos
1004 1.1 christos /* If GDB itself is compiled as 64-bit, we are running on a machine in
1005 1.1 christos z/Architecture mode. If the target is running in 64-bit addressing
1006 1.1 christos mode, report s390x architecture. If the target is running in 31-bit
1007 1.1 christos addressing mode, but the kernel supports using 64-bit registers in
1008 1.1 christos that mode, report s390 architecture with 64-bit GPRs. */
1009 1.5 christos #ifdef __s390x__
1010 1.5 christos {
1011 1.10 christos CORE_ADDR hwcap = linux_get_hwcap ();
1012 1.1 christos
1013 1.5 christos have_regset_tdb = (hwcap & HWCAP_S390_TE)
1014 1.5 christos && check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset);
1015 1.5 christos
1016 1.5 christos have_regset_vxrs = (hwcap & HWCAP_S390_VX)
1017 1.5 christos && check_regset (tid, NT_S390_VXRS_LOW, 16 * 8)
1018 1.5 christos && check_regset (tid, NT_S390_VXRS_HIGH, 16 * 16);
1019 1.5 christos
1020 1.8 christos have_regset_gs = (hwcap & HWCAP_S390_GS)
1021 1.8 christos && check_regset (tid, NT_S390_GS_CB, 4 * 8)
1022 1.8 christos && check_regset (tid, NT_S390_GS_BC, 4 * 8);
1023 1.8 christos
1024 1.5 christos if (s390_target_wordsize () == 8)
1025 1.8 christos return (have_regset_gs ? tdesc_s390x_gs_linux64 :
1026 1.8 christos have_regset_vxrs ?
1027 1.5 christos (have_regset_tdb ? tdesc_s390x_tevx_linux64 :
1028 1.5 christos tdesc_s390x_vx_linux64) :
1029 1.5 christos have_regset_tdb ? tdesc_s390x_te_linux64 :
1030 1.5 christos have_regset_system_call ? tdesc_s390x_linux64v2 :
1031 1.5 christos have_regset_last_break ? tdesc_s390x_linux64v1 :
1032 1.5 christos tdesc_s390x_linux64);
1033 1.5 christos
1034 1.5 christos if (hwcap & HWCAP_S390_HIGH_GPRS)
1035 1.8 christos return (have_regset_gs ? tdesc_s390_gs_linux64 :
1036 1.8 christos have_regset_vxrs ?
1037 1.5 christos (have_regset_tdb ? tdesc_s390_tevx_linux64 :
1038 1.5 christos tdesc_s390_vx_linux64) :
1039 1.5 christos have_regset_tdb ? tdesc_s390_te_linux64 :
1040 1.5 christos have_regset_system_call ? tdesc_s390_linux64v2 :
1041 1.5 christos have_regset_last_break ? tdesc_s390_linux64v1 :
1042 1.5 christos tdesc_s390_linux64);
1043 1.5 christos }
1044 1.1 christos #endif
1045 1.1 christos
1046 1.1 christos /* If GDB itself is compiled as 31-bit, or if we're running a 31-bit inferior
1047 1.1 christos on a 64-bit kernel that does not support using 64-bit registers in 31-bit
1048 1.1 christos mode, report s390 architecture with 32-bit GPRs. */
1049 1.1 christos return (have_regset_system_call? tdesc_s390_linux32v2 :
1050 1.1 christos have_regset_last_break? tdesc_s390_linux32v1 :
1051 1.1 christos tdesc_s390_linux32);
1052 1.1 christos }
1053 1.1 christos
1054 1.9 christos void _initialize_s390_nat ();
1055 1.1 christos void
1056 1.9 christos _initialize_s390_nat ()
1057 1.1 christos {
1058 1.1 christos /* Register the target. */
1059 1.8 christos linux_target = &the_s390_linux_nat_target;
1060 1.8 christos add_inf_child_target (&the_s390_linux_nat_target);
1061 1.7 christos
1062 1.7 christos /* A maintenance command to enable showing the PER state. */
1063 1.7 christos add_setshow_boolean_cmd ("show-debug-regs", class_maintenance,
1064 1.7 christos &show_debug_regs, _("\
1065 1.7 christos Set whether to show the PER (debug) hardware state."), _("\
1066 1.7 christos Show whether to show the PER (debug) hardware state."), _("\
1067 1.7 christos Use \"on\" to enable, \"off\" to disable.\n\
1068 1.7 christos If enabled, the PER state is shown after it is changed by GDB,\n\
1069 1.7 christos and when the inferior triggers a breakpoint or watchpoint."),
1070 1.7 christos NULL,
1071 1.7 christos NULL,
1072 1.7 christos &maintenance_set_cmdlist,
1073 1.7 christos &maintenance_show_cmdlist);
1074 1.1 christos }
1075