* configure.srv [s390x-*-linux*]: Set srv_regobj to include both
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-s390-low.c
CommitLineData
265f716b
DJ
1/* GNU/Linux S/390 specific low level interface, for the remote server
2 for GDB.
9b254dd1
DJ
3 Copyright (C) 2001, 2002, 2005, 2006, 2007, 2008
4 Free Software Foundation, Inc.
265f716b
DJ
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
265f716b
DJ
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
265f716b
DJ
20
21/* This file is used for both 31-bit and 64-bit S/390 systems. */
22
23#include "server.h"
24#include "linux-low.h"
25
26#include <asm/ptrace.h>
27
d05b4ac3
UW
28/* Defined in auto-generated file reg-s390.c. */
29void init_registers_s390 (void);
30/* Defined in auto-generated file reg-s390x.c. */
31void init_registers_s390x (void);
32
33
d0f54f9d 34#define s390_num_regs 51
265f716b 35
2ec06d2e 36static int s390_regmap[] = {
265f716b
DJ
37 PT_PSWMASK, PT_PSWADDR,
38
39 PT_GPR0, PT_GPR1, PT_GPR2, PT_GPR3,
40 PT_GPR4, PT_GPR5, PT_GPR6, PT_GPR7,
41 PT_GPR8, PT_GPR9, PT_GPR10, PT_GPR11,
42 PT_GPR12, PT_GPR13, PT_GPR14, PT_GPR15,
43
44 PT_ACR0, PT_ACR1, PT_ACR2, PT_ACR3,
45 PT_ACR4, PT_ACR5, PT_ACR6, PT_ACR7,
46 PT_ACR8, PT_ACR9, PT_ACR10, PT_ACR11,
47 PT_ACR12, PT_ACR13, PT_ACR14, PT_ACR15,
48
265f716b
DJ
49 PT_FPC,
50
d0f54f9d 51#ifndef __s390x__
265f716b
DJ
52 PT_FPR0_HI, PT_FPR1_HI, PT_FPR2_HI, PT_FPR3_HI,
53 PT_FPR4_HI, PT_FPR5_HI, PT_FPR6_HI, PT_FPR7_HI,
54 PT_FPR8_HI, PT_FPR9_HI, PT_FPR10_HI, PT_FPR11_HI,
55 PT_FPR12_HI, PT_FPR13_HI, PT_FPR14_HI, PT_FPR15_HI,
56#else
57 PT_FPR0, PT_FPR1, PT_FPR2, PT_FPR3,
58 PT_FPR4, PT_FPR5, PT_FPR6, PT_FPR7,
59 PT_FPR8, PT_FPR9, PT_FPR10, PT_FPR11,
60 PT_FPR12, PT_FPR13, PT_FPR14, PT_FPR15,
61#endif
62};
63
2ec06d2e
DJ
64static int
65s390_cannot_fetch_register (int regno)
265f716b 66{
2ec06d2e 67 if (s390_regmap[regno] == -1)
265f716b
DJ
68 return 1;
69
70 return 0;
71}
72
2ec06d2e
DJ
73static int
74s390_cannot_store_register (int regno)
265f716b 75{
2ec06d2e 76 if (s390_regmap[regno] == -1)
265f716b
DJ
77 return 1;
78
79 return 0;
80}
2ec06d2e 81
b7149293
UW
82/* Provide only a fill function for the general register set. ps_lgetregs
83 will use this for NPTL support. */
84
85static void s390_fill_gregset (void *buf)
86{
87 int i;
88
89 for (i = 0; i < 34; i++)
90 collect_register (i, (char *) buf + s390_regmap[i]);
91}
92
93struct regset_info target_regsets[] = {
94 { 0, 0, 0, GENERAL_REGS, s390_fill_gregset, NULL },
95 { 0, 0, -1, -1, NULL, NULL }
96};
97
b0ded00b 98
f450004a 99static const unsigned char s390_breakpoint[] = { 0, 1 };
b0ded00b
UW
100#define s390_breakpoint_len 2
101
102static CORE_ADDR
103s390_get_pc ()
104{
d61ddec4
UW
105 if (register_size (0) == 4)
106 {
107 unsigned int pc;
108 collect_register_by_name ("pswa", &pc);
b0ded00b 109#ifndef __s390x__
d61ddec4 110 pc &= 0x7fffffff;
b0ded00b 111#endif
d61ddec4
UW
112 return pc;
113 }
114 else
115 {
116 unsigned long pc;
117 collect_register_by_name ("pswa", &pc);
118 return pc;
119 }
b0ded00b
UW
120}
121
122static void
123s390_set_pc (CORE_ADDR newpc)
124{
d61ddec4
UW
125 if (register_size (0) == 4)
126 {
127 unsigned int pc = newpc;
b0ded00b 128#ifndef __s390x__
d61ddec4 129 pc |= 0x80000000;
b0ded00b 130#endif
d61ddec4
UW
131 supply_register_by_name ("pswa", &pc);
132 }
133 else
134 {
135 unsigned long pc = newpc;
136 supply_register_by_name ("pswa", &pc);
137 }
b0ded00b
UW
138}
139
d61ddec4
UW
140
141static void
142s390_arch_setup (void)
143{
144 /* Assume 31-bit inferior process. */
145 init_registers_s390 ();
146
147 /* On a 64-bit host, check the low bit of the (31-bit) PSWM
148 -- if this is one, we actually have a 64-bit inferior. */
149#ifdef __s390x__
150 {
151 unsigned int pswm;
152 collect_register_by_name ("pswm", &pswm);
153 if (pswm & 1)
154 init_registers_s390x ();
155 }
156#endif
157}
158
159
b0ded00b
UW
160static int
161s390_breakpoint_at (CORE_ADDR pc)
162{
163 unsigned char c[s390_breakpoint_len];
164 read_inferior_memory (pc, c, s390_breakpoint_len);
165 return memcmp (c, s390_breakpoint, s390_breakpoint_len) == 0;
166}
167
168
2ec06d2e 169struct linux_target_ops the_low_target = {
d61ddec4 170 s390_arch_setup,
2ec06d2e
DJ
171 s390_num_regs,
172 s390_regmap,
173 s390_cannot_fetch_register,
174 s390_cannot_store_register,
b0ded00b
UW
175 s390_get_pc,
176 s390_set_pc,
177 s390_breakpoint,
178 s390_breakpoint_len,
179 NULL,
180 s390_breakpoint_len,
181 s390_breakpoint_at,
2ec06d2e 182};
b0ded00b 183
This page took 0.441158 seconds and 4 git commands to generate.