1
1
/* GNU/Linux/MIPS specific low level interface, for the remote server for GDB.
2
2
Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2005, 2006, 2007,
3
2008, 2009 Free Software Foundation, Inc.
3
2008, 2009, 2010 Free Software Foundation, Inc.
5
5
This file is part of GDB.
118
mips_get_pc (struct regcache *regcache)
120
120
union mips_register pc;
121
collect_register_by_name ("pc", pc.buf);
121
collect_register_by_name (regcache, "pc", pc.buf);
122
122
return register_size (0) == 4 ? pc.reg32 : pc.reg64;
126
mips_set_pc (CORE_ADDR pc)
126
mips_set_pc (struct regcache *regcache, CORE_ADDR pc)
128
128
union mips_register newpc;
129
129
if (register_size (0) == 4)
142
142
is outside of the function. So rather than importing software single-step,
143
143
we can just run until exit. */
145
mips_reinsert_addr ()
145
mips_reinsert_addr (void)
147
struct regcache *regcache = get_thread_regcache (current_inferior, 1);
147
148
union mips_register ra;
148
collect_register_by_name ("r31", ra.buf);
149
collect_register_by_name (regcache, "r31", ra.buf);
149
150
return register_size (0) == 4 ? ra.reg32 : ra.reg64;
183
184
#ifdef HAVE_PTRACE_GETREGS
186
mips_collect_register (int use_64bit, int regno, union mips_register *reg)
187
mips_collect_register (struct regcache *regcache,
188
int use_64bit, int regno, union mips_register *reg)
188
190
union mips_register tmp_reg;
192
collect_register (regno, &tmp_reg.reg64);
194
collect_register (regcache, regno, &tmp_reg.reg64);
197
collect_register (regno, &tmp_reg.reg32);
199
collect_register (regcache, regno, &tmp_reg.reg32);
198
200
reg->reg64 = tmp_reg.reg32;
203
mips_supply_register (int use_64bit, int regno, const union mips_register *reg)
205
mips_supply_register (struct regcache *regcache,
206
int use_64bit, int regno, const union mips_register *reg)
209
212
if (__BYTE_ORDER == __BIG_ENDIAN && !use_64bit)
212
supply_register (regno, reg->buf + offset);
215
supply_register (regcache, regno, reg->buf + offset);
216
mips_collect_register_32bit (int use_64bit, int regno, unsigned char *buf)
219
mips_collect_register_32bit (struct regcache *regcache,
220
int use_64bit, int regno, unsigned char *buf)
218
222
union mips_register tmp_reg;
221
mips_collect_register (use_64bit, regno, &tmp_reg);
225
mips_collect_register (regcache, use_64bit, regno, &tmp_reg);
222
226
reg32 = tmp_reg.reg64;
223
227
memcpy (buf, ®32, 4);
227
mips_supply_register_32bit (int use_64bit, int regno, const unsigned char *buf)
231
mips_supply_register_32bit (struct regcache *regcache,
232
int use_64bit, int regno, const unsigned char *buf)
229
234
union mips_register tmp_reg;
232
237
memcpy (®32, buf, 4);
233
238
tmp_reg.reg64 = reg32;
234
mips_supply_register (use_64bit, regno, &tmp_reg);
239
mips_supply_register (regcache, use_64bit, regno, &tmp_reg);
238
mips_fill_gregset (void *buf)
243
mips_fill_gregset (struct regcache *regcache, void *buf)
240
245
union mips_register *regset = buf;
241
246
int i, use_64bit;
243
248
use_64bit = (register_size (0) == 8);
245
250
for (i = 1; i < 32; i++)
246
mips_collect_register (use_64bit, i, regset + i);
248
mips_collect_register (use_64bit, find_regno ("lo"), regset + 32);
249
mips_collect_register (use_64bit, find_regno ("hi"), regset + 33);
250
mips_collect_register (use_64bit, find_regno ("pc"), regset + 34);
251
mips_collect_register (use_64bit, find_regno ("badvaddr"), regset + 35);
252
mips_collect_register (use_64bit, find_regno ("status"), regset + 36);
253
mips_collect_register (use_64bit, find_regno ("cause"), regset + 37);
255
mips_collect_register (use_64bit, find_regno ("restart"), regset + 0);
251
mips_collect_register (regcache, use_64bit, i, regset + i);
253
mips_collect_register (regcache, use_64bit,
254
find_regno ("lo"), regset + 32);
255
mips_collect_register (regcache, use_64bit,
256
find_regno ("hi"), regset + 33);
257
mips_collect_register (regcache, use_64bit,
258
find_regno ("pc"), regset + 34);
259
mips_collect_register (regcache, use_64bit,
260
find_regno ("badvaddr"), regset + 35);
261
mips_collect_register (regcache, use_64bit,
262
find_regno ("status"), regset + 36);
263
mips_collect_register (regcache, use_64bit,
264
find_regno ("cause"), regset + 37);
266
mips_collect_register (regcache, use_64bit,
267
find_regno ("restart"), regset + 0);
259
mips_store_gregset (const void *buf)
271
mips_store_gregset (struct regcache *regcache, const void *buf)
261
273
const union mips_register *regset = buf;
262
274
int i, use_64bit;
264
276
use_64bit = (register_size (0) == 8);
266
278
for (i = 0; i < 32; i++)
267
mips_supply_register (use_64bit, i, regset + i);
269
mips_supply_register (use_64bit, find_regno ("lo"), regset + 32);
270
mips_supply_register (use_64bit, find_regno ("hi"), regset + 33);
271
mips_supply_register (use_64bit, find_regno ("pc"), regset + 34);
272
mips_supply_register (use_64bit, find_regno ("badvaddr"), regset + 35);
273
mips_supply_register (use_64bit, find_regno ("status"), regset + 36);
274
mips_supply_register (use_64bit, find_regno ("cause"), regset + 37);
276
mips_supply_register (use_64bit, find_regno ("restart"), regset + 0);
279
mips_supply_register (regcache, use_64bit, i, regset + i);
281
mips_supply_register (regcache, use_64bit, find_regno ("lo"), regset + 32);
282
mips_supply_register (regcache, use_64bit, find_regno ("hi"), regset + 33);
283
mips_supply_register (regcache, use_64bit, find_regno ("pc"), regset + 34);
284
mips_supply_register (regcache, use_64bit,
285
find_regno ("badvaddr"), regset + 35);
286
mips_supply_register (regcache, use_64bit,
287
find_regno ("status"), regset + 36);
288
mips_supply_register (regcache, use_64bit,
289
find_regno ("cause"), regset + 37);
291
mips_supply_register (regcache, use_64bit,
292
find_regno ("restart"), regset + 0);
280
mips_fill_fpregset (void *buf)
296
mips_fill_fpregset (struct regcache *regcache, void *buf)
282
298
union mips_register *regset = buf;
283
299
int i, use_64bit, first_fp, big_endian;
289
305
/* See GDB for a discussion of this peculiar layout. */
290
306
for (i = 0; i < 32; i++)
292
collect_register (first_fp + i, regset[i].buf);
308
collect_register (regcache, first_fp + i, regset[i].buf);
294
collect_register (first_fp + i,
310
collect_register (regcache, first_fp + i,
295
311
regset[i & ~1].buf + 4 * (big_endian != (i & 1)));
297
mips_collect_register_32bit (use_64bit, find_regno ("fcsr"), regset[32].buf);
298
mips_collect_register_32bit (use_64bit, find_regno ("fir"),
313
mips_collect_register_32bit (regcache, use_64bit,
314
find_regno ("fcsr"), regset[32].buf);
315
mips_collect_register_32bit (regcache, use_64bit, find_regno ("fir"),
299
316
regset[32].buf + 4);
303
mips_store_fpregset (const void *buf)
320
mips_store_fpregset (struct regcache *regcache, const void *buf)
305
322
const union mips_register *regset = buf;
306
323
int i, use_64bit, first_fp, big_endian;
312
329
/* See GDB for a discussion of this peculiar layout. */
313
330
for (i = 0; i < 32; i++)
315
supply_register (first_fp + i, regset[i].buf);
332
supply_register (regcache, first_fp + i, regset[i].buf);
317
supply_register (first_fp + i,
334
supply_register (regcache, first_fp + i,
318
335
regset[i & ~1].buf + 4 * (big_endian != (i & 1)));
320
mips_supply_register_32bit (use_64bit, find_regno ("fcsr"), regset[32].buf);
321
mips_supply_register_32bit (use_64bit, find_regno ("fir"),
337
mips_supply_register_32bit (regcache, use_64bit,
338
find_regno ("fcsr"), regset[32].buf);
339
mips_supply_register_32bit (regcache, use_64bit, find_regno ("fir"),
322
340
regset[32].buf + 4);
324
342
#endif /* HAVE_PTRACE_GETREGS */