gdb/ChangeLog:
[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{
105 unsigned long pc;
106 collect_register_by_name ("pswa", &pc);
107#ifndef __s390x__
108 pc &= 0x7fffffff;
109#endif
110 return pc;
111}
112
113static void
114s390_set_pc (CORE_ADDR newpc)
115{
116 unsigned long pc = newpc;
117#ifndef __s390x__
118 pc |= 0x80000000;
119#endif
120 supply_register_by_name ("pswa", &pc);
121}
122
123static int
124s390_breakpoint_at (CORE_ADDR pc)
125{
126 unsigned char c[s390_breakpoint_len];
127 read_inferior_memory (pc, c, s390_breakpoint_len);
128 return memcmp (c, s390_breakpoint, s390_breakpoint_len) == 0;
129}
130
131
2ec06d2e 132struct linux_target_ops the_low_target = {
d05b4ac3
UW
133#ifndef __s390x__
134 init_registers_s390,
135#else
136 init_registers_s390x,
137#endif
2ec06d2e
DJ
138 s390_num_regs,
139 s390_regmap,
140 s390_cannot_fetch_register,
141 s390_cannot_store_register,
b0ded00b
UW
142 s390_get_pc,
143 s390_set_pc,
144 s390_breakpoint,
145 s390_breakpoint_len,
146 NULL,
147 s390_breakpoint_len,
148 s390_breakpoint_at,
2ec06d2e 149};
b0ded00b 150
This page took 0.416824 seconds and 4 git commands to generate.