2004-04-21 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / d10v-tdep.c
CommitLineData
85a453d5 1/* Target-dependent code for Renesas D10V, for GDB.
349c5d5f 2
51603483 3 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
349c5d5f 4 Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
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
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
c906108c 12
c5aa993b
JM
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.
c906108c 17
c5aa993b
JM
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
c906108c
SS
22
23/* Contributed by Martin Hunt, hunt@cygnus.com */
24
25#include "defs.h"
26#include "frame.h"
7f6104a9 27#include "frame-unwind.h"
270cb5d6 28#include "frame-base.h"
c906108c
SS
29#include "symtab.h"
30#include "gdbtypes.h"
31#include "gdbcmd.h"
32#include "gdbcore.h"
33#include "gdb_string.h"
34#include "value.h"
35#include "inferior.h"
c5aa993b 36#include "dis-asm.h"
c906108c
SS
37#include "symfile.h"
38#include "objfiles.h"
104c1213 39#include "language.h"
28d069e6 40#include "arch-utils.h"
4e052eda 41#include "regcache.h"
e8933a55 42#include "remote.h"
f0d4cc9e 43#include "floatformat.h"
b91b96f4 44#include "gdb/sim-d10v.h"
8238d0bf 45#include "sim-regno.h"
92bf2b80 46#include "disasm.h"
a0f267c7 47#include "trad-frame.h"
4ce44c66 48
fa1fd571
AC
49#include "gdb_assert.h"
50
4ce44c66
JM
51struct gdbarch_tdep
52 {
53 int a0_regnum;
54 int nr_dmap_regs;
f6684c31
AC
55 unsigned long (*dmap_register) (void *regcache, int nr);
56 unsigned long (*imap_register) (void *regcache, int nr);
4ce44c66
JM
57 };
58
59/* These are the addresses the D10V-EVA board maps data and
db72fa6b 60 instruction memory to. */
cce74817 61
78eac43e
MS
62enum memspace {
63 DMEM_START = 0x2000000,
64 IMEM_START = 0x1000000,
65 STACK_START = 0x200bffe
66};
cce74817 67
db72fa6b 68/* d10v register names. */
4ce44c66
JM
69
70enum
71 {
72 R0_REGNUM = 0,
78eac43e 73 R3_REGNUM = 3,
6c2b5168 74 D10V_FP_REGNUM = 11,
4ce44c66 75 LR_REGNUM = 13,
f75493ed 76 D10V_SP_REGNUM = 15,
4ce44c66 77 PSW_REGNUM = 16,
27d94c49 78 D10V_PC_REGNUM = 18,
4ce44c66 79 NR_IMAP_REGS = 2,
78eac43e
MS
80 NR_A_REGS = 2,
81 TS2_NUM_REGS = 37,
82 TS3_NUM_REGS = 42,
db72fa6b 83 /* d10v calling convention. */
78eac43e 84 ARG1_REGNUM = R0_REGNUM,
181555e9 85 ARGN_REGNUM = R3_REGNUM
4ce44c66 86 };
78eac43e 87
b9362cc7 88static int
f75493ed
AC
89nr_dmap_regs (struct gdbarch *gdbarch)
90{
91 return gdbarch_tdep (gdbarch)->nr_dmap_regs;
92}
93
b9362cc7 94static int
f75493ed
AC
95a0_regnum (struct gdbarch *gdbarch)
96{
97 return gdbarch_tdep (gdbarch)->a0_regnum;
98}
4ce44c66 99
392a587b
JM
100/* Local functions */
101
a14ed312 102extern void _initialize_d10v_tdep (void);
392a587b 103
a14ed312 104static void d10v_eva_prepare_to_trace (void);
392a587b 105
a14ed312 106static void d10v_eva_get_trace_data (void);
c906108c 107
23964bcd 108static CORE_ADDR
6ae2f580 109d10v_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
489137c0 110{
6ae2f580
AC
111 /* Align to the size of an instruction (so that they can safely be
112 pushed onto the stack. */
113 return sp & ~3;
489137c0 114}
c906108c 115
f4f9705a 116static const unsigned char *
fba45db2 117d10v_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
392a587b 118{
c5aa993b
JM
119 static unsigned char breakpoint[] =
120 {0x2f, 0x90, 0x5e, 0x00};
392a587b
JM
121 *lenptr = sizeof (breakpoint);
122 return breakpoint;
123}
124
4ce44c66 125/* Map the REG_NR onto an ascii name. Return NULL or an empty string
db72fa6b 126 when the reg_nr isn't valid. */
4ce44c66
JM
127
128enum ts2_regnums
129 {
130 TS2_IMAP0_REGNUM = 32,
131 TS2_DMAP_REGNUM = 34,
132 TS2_NR_DMAP_REGS = 1,
133 TS2_A0_REGNUM = 35
134 };
135
fa88f677 136static const char *
4ce44c66 137d10v_ts2_register_name (int reg_nr)
392a587b 138{
c5aa993b
JM
139 static char *register_names[] =
140 {
141 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
142 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
143 "psw", "bpsw", "pc", "bpc", "cr4", "cr5", "cr6", "rpt_c",
144 "rpt_s", "rpt_e", "mod_s", "mod_e", "cr12", "cr13", "iba", "cr15",
145 "imap0", "imap1", "dmap", "a0", "a1"
392a587b
JM
146 };
147 if (reg_nr < 0)
148 return NULL;
149 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
150 return NULL;
c5aa993b 151 return register_names[reg_nr];
392a587b
JM
152}
153
4ce44c66
JM
154enum ts3_regnums
155 {
156 TS3_IMAP0_REGNUM = 36,
157 TS3_DMAP0_REGNUM = 38,
158 TS3_NR_DMAP_REGS = 4,
159 TS3_A0_REGNUM = 32
160 };
161
fa88f677 162static const char *
4ce44c66
JM
163d10v_ts3_register_name (int reg_nr)
164{
165 static char *register_names[] =
166 {
167 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
168 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
169 "psw", "bpsw", "pc", "bpc", "cr4", "cr5", "cr6", "rpt_c",
170 "rpt_s", "rpt_e", "mod_s", "mod_e", "cr12", "cr13", "iba", "cr15",
171 "a0", "a1",
172 "spi", "spu",
173 "imap0", "imap1",
174 "dmap0", "dmap1", "dmap2", "dmap3"
175 };
176 if (reg_nr < 0)
177 return NULL;
178 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
179 return NULL;
180 return register_names[reg_nr];
181}
182
bf93dfed
JB
183/* Access the DMAP/IMAP registers in a target independent way.
184
185 Divide the D10V's 64k data space into four 16k segments:
186 0x0000 -- 0x3fff, 0x4000 -- 0x7fff, 0x8000 -- 0xbfff, and
187 0xc000 -- 0xffff.
188
189 On the TS2, the first two segments (0x0000 -- 0x3fff, 0x4000 --
190 0x7fff) always map to the on-chip data RAM, and the fourth always
191 maps to I/O space. The third (0x8000 - 0xbfff) can be mapped into
192 unified memory or instruction memory, under the control of the
193 single DMAP register.
194
195 On the TS3, there are four DMAP registers, each of which controls
196 one of the segments. */
4ce44c66
JM
197
198static unsigned long
f6684c31 199d10v_ts2_dmap_register (void *regcache, int reg_nr)
4ce44c66
JM
200{
201 switch (reg_nr)
202 {
203 case 0:
204 case 1:
205 return 0x2000;
206 case 2:
f6684c31
AC
207 {
208 ULONGEST reg;
209 regcache_cooked_read_unsigned (regcache, TS2_DMAP_REGNUM, &reg);
210 return reg;
211 }
4ce44c66
JM
212 default:
213 return 0;
214 }
215}
216
217static unsigned long
f6684c31 218d10v_ts3_dmap_register (void *regcache, int reg_nr)
4ce44c66 219{
f6684c31
AC
220 ULONGEST reg;
221 regcache_cooked_read_unsigned (regcache, TS3_DMAP0_REGNUM + reg_nr, &reg);
222 return reg;
4ce44c66
JM
223}
224
225static unsigned long
f6684c31 226d10v_ts2_imap_register (void *regcache, int reg_nr)
4ce44c66 227{
f6684c31
AC
228 ULONGEST reg;
229 regcache_cooked_read_unsigned (regcache, TS2_IMAP0_REGNUM + reg_nr, &reg);
230 return reg;
4ce44c66
JM
231}
232
233static unsigned long
f6684c31 234d10v_ts3_imap_register (void *regcache, int reg_nr)
4ce44c66 235{
f6684c31
AC
236 ULONGEST reg;
237 regcache_cooked_read_unsigned (regcache, TS3_IMAP0_REGNUM + reg_nr, &reg);
238 return reg;
4ce44c66
JM
239}
240
62700349
AC
241/* MAP GDB's internal register numbering (determined by the layout
242 from the DEPRECATED_REGISTER_BYTE array) onto the simulator's
db72fa6b 243 register numbering. */
4ce44c66
JM
244
245static int
246d10v_ts2_register_sim_regno (int nr)
247{
e8933a55
AC
248 /* Only makes sense to supply raw registers. */
249 gdb_assert (nr >= 0 && nr < NUM_REGS);
4ce44c66
JM
250 if (nr >= TS2_IMAP0_REGNUM
251 && nr < TS2_IMAP0_REGNUM + NR_IMAP_REGS)
252 return nr - TS2_IMAP0_REGNUM + SIM_D10V_IMAP0_REGNUM;
253 if (nr == TS2_DMAP_REGNUM)
254 return nr - TS2_DMAP_REGNUM + SIM_D10V_TS2_DMAP_REGNUM;
255 if (nr >= TS2_A0_REGNUM
256 && nr < TS2_A0_REGNUM + NR_A_REGS)
257 return nr - TS2_A0_REGNUM + SIM_D10V_A0_REGNUM;
258 return nr;
259}
260
261static int
262d10v_ts3_register_sim_regno (int nr)
263{
e8933a55
AC
264 /* Only makes sense to supply raw registers. */
265 gdb_assert (nr >= 0 && nr < NUM_REGS);
4ce44c66
JM
266 if (nr >= TS3_IMAP0_REGNUM
267 && nr < TS3_IMAP0_REGNUM + NR_IMAP_REGS)
268 return nr - TS3_IMAP0_REGNUM + SIM_D10V_IMAP0_REGNUM;
269 if (nr >= TS3_DMAP0_REGNUM
270 && nr < TS3_DMAP0_REGNUM + TS3_NR_DMAP_REGS)
271 return nr - TS3_DMAP0_REGNUM + SIM_D10V_DMAP0_REGNUM;
272 if (nr >= TS3_A0_REGNUM
273 && nr < TS3_A0_REGNUM + NR_A_REGS)
274 return nr - TS3_A0_REGNUM + SIM_D10V_A0_REGNUM;
275 return nr;
276}
277
392a587b
JM
278/* Return the GDB type object for the "standard" data type
279 of data in register N. */
280
f5e1cf12 281static struct type *
35cac7cf 282d10v_register_type (struct gdbarch *gdbarch, int reg_nr)
392a587b 283{
27d94c49 284 if (reg_nr == D10V_PC_REGNUM)
75af7f68 285 return builtin_type_void_func_ptr;
f75493ed 286 if (reg_nr == D10V_SP_REGNUM || reg_nr == D10V_FP_REGNUM)
095a4c96 287 return builtin_type_void_data_ptr;
f75493ed
AC
288 else if (reg_nr >= a0_regnum (gdbarch)
289 && reg_nr < (a0_regnum (gdbarch) + NR_A_REGS))
4ce44c66 290 return builtin_type_int64;
392a587b 291 else
4ce44c66 292 return builtin_type_int16;
392a587b
JM
293}
294
f5e1cf12 295static int
fba45db2 296d10v_iaddr_p (CORE_ADDR x)
392a587b
JM
297{
298 return (((x) & 0x3000000) == IMEM_START);
299}
300
169a7369
MS
301static CORE_ADDR
302d10v_make_daddr (CORE_ADDR x)
303{
304 return ((x) | DMEM_START);
305}
306
307static CORE_ADDR
308d10v_make_iaddr (CORE_ADDR x)
309{
310 if (d10v_iaddr_p (x))
db72fa6b 311 return x; /* Idempotency -- x is already in the IMEM space. */
169a7369
MS
312 else
313 return (((x) << 2) | IMEM_START);
314}
392a587b 315
f5e1cf12 316static CORE_ADDR
fba45db2 317d10v_convert_iaddr_to_raw (CORE_ADDR x)
392a587b
JM
318{
319 return (((x) >> 2) & 0xffff);
320}
321
f5e1cf12 322static CORE_ADDR
fba45db2 323d10v_convert_daddr_to_raw (CORE_ADDR x)
392a587b
JM
324{
325 return ((x) & 0xffff);
326}
327
75af7f68
JB
328static void
329d10v_address_to_pointer (struct type *type, void *buf, CORE_ADDR addr)
330{
331 /* Is it a code address? */
332 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC
333 || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD)
334 {
75af7f68
JB
335 store_unsigned_integer (buf, TYPE_LENGTH (type),
336 d10v_convert_iaddr_to_raw (addr));
337 }
338 else
339 {
340 /* Strip off any upper segment bits. */
341 store_unsigned_integer (buf, TYPE_LENGTH (type),
342 d10v_convert_daddr_to_raw (addr));
343 }
344}
345
346static CORE_ADDR
66140c26 347d10v_pointer_to_address (struct type *type, const void *buf)
75af7f68 348{
f75493ed 349 CORE_ADDR addr = extract_unsigned_integer (buf, TYPE_LENGTH (type));
75af7f68
JB
350 /* Is it a code address? */
351 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC
74a9bb82
FF
352 || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD
353 || TYPE_CODE_SPACE (TYPE_TARGET_TYPE (type)))
75af7f68
JB
354 return d10v_make_iaddr (addr);
355 else
356 return d10v_make_daddr (addr);
357}
358
095a4c96
EZ
359/* Don't do anything if we have an integer, this way users can type 'x
360 <addr>' w/o having gdb outsmart them. The internal gdb conversions
361 to the correct space are taken care of in the pointer_to_address
362 function. If we don't do this, 'x $fp' wouldn't work. */
fc0c74b1
AC
363static CORE_ADDR
364d10v_integer_to_address (struct type *type, void *buf)
365{
366 LONGEST val;
367 val = unpack_long (type, buf);
095a4c96 368 return val;
fc0c74b1 369}
75af7f68 370
181555e9 371/* Handle the d10v's return_value convention. */
392a587b 372
181555e9
AC
373static enum return_value_convention
374d10v_return_value (struct gdbarch *gdbarch, struct type *valtype,
963e2bb7
AC
375 struct regcache *regcache, void *readbuf,
376 const void *writebuf)
392a587b 377{
181555e9
AC
378 if (TYPE_LENGTH (valtype) > 8)
379 /* Anything larger than 8 bytes (4 registers) goes on the stack. */
380 return RETURN_VALUE_STRUCT_CONVENTION;
381 if (TYPE_LENGTH (valtype) == 5
382 || TYPE_LENGTH (valtype) == 6)
383 /* Anything 5 or 6 bytes in size goes in memory. Contents don't
384 appear to matter. Note that 7 and 8 byte objects do end up in
385 registers! */
386 return RETURN_VALUE_STRUCT_CONVENTION;
387 if (TYPE_LENGTH (valtype) == 1)
3d79a47c 388 {
181555e9
AC
389 /* All single byte values go in a register stored right-aligned.
390 Note: 2 byte integer values are handled further down. */
391 if (readbuf)
392 {
393 /* Since TYPE is smaller than the register, there isn't a
394 sign extension problem. Let the extraction truncate the
395 register value. */
396 ULONGEST regval;
397 regcache_cooked_read_unsigned (regcache, R0_REGNUM,
398 &regval);
399 store_unsigned_integer (readbuf, TYPE_LENGTH (valtype), regval);
400
401 }
402 if (writebuf)
403 {
404 ULONGEST regval;
405 if (TYPE_CODE (valtype) == TYPE_CODE_INT)
406 /* Some sort of integer value stored in R0. Use
407 unpack_long since that should handle any required sign
408 extension. */
409 regval = unpack_long (valtype, writebuf);
410 else
411 /* Some other type. Don't sign-extend the value when
412 storing it in the register. */
413 regval = extract_unsigned_integer (writebuf, 1);
414 regcache_cooked_write_unsigned (regcache, R0_REGNUM, regval);
415 }
416 return RETURN_VALUE_REGISTER_CONVENTION;
3d79a47c 417 }
181555e9
AC
418 if ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT
419 || TYPE_CODE (valtype) == TYPE_CODE_UNION)
420 && TYPE_NFIELDS (valtype) > 1
421 && TYPE_FIELD_BITPOS (valtype, 1) == 8)
422 /* If a composite is 8 bit aligned (determined by looking at the
423 start address of the second field), put it in memory. */
424 return RETURN_VALUE_STRUCT_CONVENTION;
425 /* Assume it is in registers. */
426 if (writebuf || readbuf)
fa1fd571
AC
427 {
428 int reg;
181555e9
AC
429 /* Per above, the value is never more than 8 bytes long. */
430 gdb_assert (TYPE_LENGTH (valtype) <= 8);
431 /* Xfer 2 bytes at a time. */
432 for (reg = 0; (reg * 2) + 1 < TYPE_LENGTH (valtype); reg++)
433 {
434 if (readbuf)
435 regcache_cooked_read (regcache, R0_REGNUM + reg,
436 (bfd_byte *) readbuf + reg * 2);
437 if (writebuf)
438 regcache_cooked_write (regcache, R0_REGNUM + reg,
439 (bfd_byte *) writebuf + reg * 2);
440 }
441 /* Any trailing byte ends up _left_ aligned. */
442 if ((reg * 2) < TYPE_LENGTH (valtype))
fa1fd571 443 {
181555e9
AC
444 if (readbuf)
445 regcache_cooked_read_part (regcache, R0_REGNUM + reg,
446 0, 1, (bfd_byte *) readbuf + reg * 2);
447 if (writebuf)
448 regcache_cooked_write_part (regcache, R0_REGNUM + reg,
449 0, 1, (bfd_byte *) writebuf + reg * 2);
fa1fd571 450 }
fa1fd571 451 }
181555e9 452 return RETURN_VALUE_REGISTER_CONVENTION;
392a587b
JM
453}
454
c5aa993b 455static int
fba45db2 456check_prologue (unsigned short op)
c906108c
SS
457{
458 /* st rn, @-sp */
459 if ((op & 0x7E1F) == 0x6C1F)
460 return 1;
461
462 /* st2w rn, @-sp */
463 if ((op & 0x7E3F) == 0x6E1F)
464 return 1;
465
466 /* subi sp, n */
467 if ((op & 0x7FE1) == 0x01E1)
468 return 1;
469
470 /* mv r11, sp */
471 if (op == 0x417E)
472 return 1;
473
474 /* nop */
475 if (op == 0x5E00)
476 return 1;
477
478 /* st rn, @sp */
479 if ((op & 0x7E1F) == 0x681E)
480 return 1;
481
482 /* st2w rn, @sp */
c5aa993b
JM
483 if ((op & 0x7E3F) == 0x3A1E)
484 return 1;
c906108c
SS
485
486 return 0;
487}
488
f5e1cf12 489static CORE_ADDR
fba45db2 490d10v_skip_prologue (CORE_ADDR pc)
c906108c
SS
491{
492 unsigned long op;
493 unsigned short op1, op2;
494 CORE_ADDR func_addr, func_end;
495 struct symtab_and_line sal;
496
db72fa6b 497 /* If we have line debugging information, then the end of the prologue
74276724 498 should be the first assembly instruction of the first source line. */
c906108c
SS
499 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
500 {
501 sal = find_pc_line (func_addr, 0);
c5aa993b 502 if (sal.end && sal.end < func_end)
c906108c
SS
503 return sal.end;
504 }
c5aa993b
JM
505
506 if (target_read_memory (pc, (char *) &op, 4))
db72fa6b 507 return pc; /* Can't access it -- assume no prologue. */
c906108c
SS
508
509 while (1)
510 {
c5aa993b 511 op = (unsigned long) read_memory_integer (pc, 4);
c906108c
SS
512 if ((op & 0xC0000000) == 0xC0000000)
513 {
514 /* long instruction */
c5aa993b
JM
515 if (((op & 0x3FFF0000) != 0x01FF0000) && /* add3 sp,sp,n */
516 ((op & 0x3F0F0000) != 0x340F0000) && /* st rn, @(offset,sp) */
517 ((op & 0x3F1F0000) != 0x350F0000)) /* st2w rn, @(offset,sp) */
c906108c
SS
518 break;
519 }
520 else
521 {
522 /* short instructions */
523 if ((op & 0xC0000000) == 0x80000000)
524 {
525 op2 = (op & 0x3FFF8000) >> 15;
526 op1 = op & 0x7FFF;
c5aa993b
JM
527 }
528 else
c906108c
SS
529 {
530 op1 = (op & 0x3FFF8000) >> 15;
531 op2 = op & 0x7FFF;
532 }
c5aa993b 533 if (check_prologue (op1))
c906108c 534 {
c5aa993b 535 if (!check_prologue (op2))
c906108c 536 {
db72fa6b
MS
537 /* If the previous opcode was really part of the
538 prologue and not just a NOP, then we want to
539 break after both instructions. */
c906108c
SS
540 if (op1 != 0x5E00)
541 pc += 4;
542 break;
543 }
544 }
545 else
546 break;
547 }
548 pc += 4;
549 }
550 return pc;
551}
552
7f6104a9 553struct d10v_unwind_cache
c906108c 554{
270cb5d6
AC
555 /* The previous frame's inner most stack address. Used as this
556 frame ID's stack_addr. */
557 CORE_ADDR prev_sp;
558 /* The frame's base, optionally used by the high-level debug info. */
ceea5145 559 CORE_ADDR base;
7f6104a9 560 int size;
0d843116
AC
561 /* How far the SP and r11 (FP) have been offset from the start of
562 the stack frame (as defined by the previous frame's stack
563 pointer). */
564 LONGEST sp_offset;
565 LONGEST r11_offset;
7f6104a9 566 int uses_frame;
a0f267c7 567 /* Table indicating the location of each and every register. */
8983bd83 568 struct trad_frame_saved_reg *saved_regs;
7f6104a9 569};
c906108c 570
c5aa993b 571static int
7f6104a9
AC
572prologue_find_regs (struct d10v_unwind_cache *info, unsigned short op,
573 CORE_ADDR addr)
c906108c
SS
574{
575 int n;
576
577 /* st rn, @-sp */
578 if ((op & 0x7E1F) == 0x6C1F)
579 {
580 n = (op & 0x1E0) >> 5;
0d843116 581 info->sp_offset -= 2;
a0f267c7 582 info->saved_regs[n].addr = info->sp_offset;
c906108c
SS
583 return 1;
584 }
585
586 /* st2w rn, @-sp */
587 else if ((op & 0x7E3F) == 0x6E1F)
588 {
589 n = (op & 0x1E0) >> 5;
0d843116 590 info->sp_offset -= 4;
a0f267c7
AC
591 info->saved_regs[n + 0].addr = info->sp_offset + 0;
592 info->saved_regs[n + 1].addr = info->sp_offset + 2;
c906108c
SS
593 return 1;
594 }
595
596 /* subi sp, n */
597 if ((op & 0x7FE1) == 0x01E1)
598 {
599 n = (op & 0x1E) >> 1;
600 if (n == 0)
601 n = 16;
0d843116 602 info->sp_offset -= n;
c906108c
SS
603 return 1;
604 }
605
606 /* mv r11, sp */
607 if (op == 0x417E)
608 {
7f6104a9 609 info->uses_frame = 1;
0d843116
AC
610 info->r11_offset = info->sp_offset;
611 return 1;
612 }
613
614 /* st rn, @r11 */
615 if ((op & 0x7E1F) == 0x6816)
616 {
617 n = (op & 0x1E0) >> 5;
a0f267c7 618 info->saved_regs[n].addr = info->r11_offset;
c906108c
SS
619 return 1;
620 }
621
622 /* nop */
623 if (op == 0x5E00)
624 return 1;
625
626 /* st rn, @sp */
627 if ((op & 0x7E1F) == 0x681E)
628 {
629 n = (op & 0x1E0) >> 5;
a0f267c7 630 info->saved_regs[n].addr = info->sp_offset;
c906108c
SS
631 return 1;
632 }
633
634 /* st2w rn, @sp */
635 if ((op & 0x7E3F) == 0x3A1E)
636 {
637 n = (op & 0x1E0) >> 5;
a0f267c7
AC
638 info->saved_regs[n + 0].addr = info->sp_offset + 0;
639 info->saved_regs[n + 1].addr = info->sp_offset + 2;
c906108c
SS
640 return 1;
641 }
642
643 return 0;
644}
645
cce74817
JM
646/* Put here the code to store, into fi->saved_regs, the addresses of
647 the saved registers of frame described by FRAME_INFO. This
648 includes special registers such as pc and fp saved in special ways
649 in the stack frame. sp is even more special: the address we return
db72fa6b 650 for it IS the sp for the next frame. */
cce74817 651
b9362cc7 652static struct d10v_unwind_cache *
6dc42492
AC
653d10v_frame_unwind_cache (struct frame_info *next_frame,
654 void **this_prologue_cache)
c906108c 655{
ae1e7417 656 struct gdbarch *gdbarch = get_frame_arch (next_frame);
ceea5145
AC
657 CORE_ADDR pc;
658 ULONGEST prev_sp;
659 ULONGEST this_base;
c906108c
SS
660 unsigned long op;
661 unsigned short op1, op2;
662 int i;
7f6104a9
AC
663 struct d10v_unwind_cache *info;
664
6dc42492
AC
665 if ((*this_prologue_cache))
666 return (*this_prologue_cache);
7f6104a9
AC
667
668 info = FRAME_OBSTACK_ZALLOC (struct d10v_unwind_cache);
6dc42492 669 (*this_prologue_cache) = info;
a0f267c7 670 info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
7f6104a9 671
7f6104a9 672 info->size = 0;
0d843116 673 info->sp_offset = 0;
c906108c 674
7f6104a9 675 info->uses_frame = 0;
be41e9f4 676 for (pc = frame_func_unwind (next_frame);
81f8a206 677 pc > 0 && pc < frame_pc_unwind (next_frame);
270cb5d6 678 pc += 4)
c906108c 679 {
ae1e7417 680 op = get_frame_memory_unsigned (next_frame, pc, 4);
c906108c
SS
681 if ((op & 0xC0000000) == 0xC0000000)
682 {
683 /* long instruction */
684 if ((op & 0x3FFF0000) == 0x01FF0000)
685 {
686 /* add3 sp,sp,n */
687 short n = op & 0xFFFF;
0d843116 688 info->sp_offset += n;
c906108c
SS
689 }
690 else if ((op & 0x3F0F0000) == 0x340F0000)
691 {
692 /* st rn, @(offset,sp) */
693 short offset = op & 0xFFFF;
694 short n = (op >> 20) & 0xF;
a0f267c7 695 info->saved_regs[n].addr = info->sp_offset + offset;
c906108c
SS
696 }
697 else if ((op & 0x3F1F0000) == 0x350F0000)
698 {
699 /* st2w rn, @(offset,sp) */
700 short offset = op & 0xFFFF;
701 short n = (op >> 20) & 0xF;
a0f267c7
AC
702 info->saved_regs[n + 0].addr = info->sp_offset + offset + 0;
703 info->saved_regs[n + 1].addr = info->sp_offset + offset + 2;
c906108c
SS
704 }
705 else
706 break;
707 }
708 else
709 {
710 /* short instructions */
711 if ((op & 0xC0000000) == 0x80000000)
712 {
713 op2 = (op & 0x3FFF8000) >> 15;
714 op1 = op & 0x7FFF;
c5aa993b
JM
715 }
716 else
c906108c
SS
717 {
718 op1 = (op & 0x3FFF8000) >> 15;
719 op2 = op & 0x7FFF;
720 }
7f6104a9
AC
721 if (!prologue_find_regs (info, op1, pc)
722 || !prologue_find_regs (info, op2, pc))
c906108c
SS
723 break;
724 }
c906108c 725 }
c5aa993b 726
0d843116 727 info->size = -info->sp_offset;
c906108c 728
a0f267c7
AC
729 /* Compute the previous frame's stack pointer (which is also the
730 frame's ID's stack address), and this frame's base pointer. */
ceea5145
AC
731 if (info->uses_frame)
732 {
733 /* The SP was moved to the FP. This indicates that a new frame
734 was created. Get THIS frame's FP value by unwinding it from
735 the next frame. */
6c2b5168 736 frame_unwind_unsigned_register (next_frame, D10V_FP_REGNUM, &this_base);
ceea5145
AC
737 /* The FP points at the last saved register. Adjust the FP back
738 to before the first saved register giving the SP. */
739 prev_sp = this_base + info->size;
740 }
ceea5145
AC
741 else
742 {
743 /* Assume that the FP is this frame's SP but with that pushed
744 stack space added back. */
f75493ed 745 frame_unwind_unsigned_register (next_frame, D10V_SP_REGNUM, &this_base);
ceea5145
AC
746 prev_sp = this_base + info->size;
747 }
748
a0f267c7
AC
749 /* Convert that SP/BASE into real addresses. */
750 info->prev_sp = d10v_make_daddr (prev_sp);
ceea5145 751 info->base = d10v_make_daddr (this_base);
c906108c 752
ceea5145
AC
753 /* Adjust all the saved registers so that they contain addresses and
754 not offsets. */
c5aa993b 755 for (i = 0; i < NUM_REGS - 1; i++)
3b3850e8 756 if (trad_frame_addr_p (info->saved_regs, i))
c906108c 757 {
a0f267c7 758 info->saved_regs[i].addr = (info->prev_sp + info->saved_regs[i].addr);
c906108c
SS
759 }
760
a0f267c7
AC
761 /* The call instruction moves the caller's PC in the callee's LR.
762 Since this is an unwind, do the reverse. Copy the location of LR
763 into PC (the address / regnum) so that a request for PC will be
764 converted into a request for the LR. */
765 info->saved_regs[D10V_PC_REGNUM] = info->saved_regs[LR_REGNUM];
766
767 /* The previous frame's SP needed to be computed. Save the computed
768 value. */
3b3850e8
AC
769 trad_frame_set_value (info->saved_regs, D10V_SP_REGNUM,
770 d10v_make_daddr (prev_sp));
c906108c 771
7f6104a9 772 return info;
c906108c
SS
773}
774
775static void
5f601589
AC
776d10v_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
777 struct frame_info *frame, int regnum, int all)
c906108c 778{
f6684c31 779 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
5f601589 780 if (regnum >= 0)
4ce44c66 781 {
5f601589
AC
782 default_print_registers_info (gdbarch, file, frame, regnum, all);
783 return;
4ce44c66 784 }
5f601589
AC
785
786 {
787 ULONGEST pc, psw, rpt_s, rpt_e, rpt_c;
7f5f525d
AC
788 pc = get_frame_register_unsigned (frame, D10V_PC_REGNUM);
789 psw = get_frame_register_unsigned (frame, PSW_REGNUM);
790 rpt_s = get_frame_register_unsigned (frame, frame_map_name_to_regnum (frame, "rpt_s", -1));
791 rpt_e = get_frame_register_unsigned (frame, frame_map_name_to_regnum (frame, "rpt_e", -1));
792 rpt_c = get_frame_register_unsigned (frame, frame_map_name_to_regnum (frame, "rpt_c", -1));
5f601589
AC
793 fprintf_filtered (file, "PC=%04lx (0x%lx) PSW=%04lx RPT_S=%04lx RPT_E=%04lx RPT_C=%04lx\n",
794 (long) pc, (long) d10v_make_iaddr (pc), (long) psw,
795 (long) rpt_s, (long) rpt_e, (long) rpt_c);
796 }
797
798 {
799 int group;
800 for (group = 0; group < 16; group += 8)
801 {
802 int r;
803 fprintf_filtered (file, "R%d-R%-2d", group, group + 7);
804 for (r = group; r < group + 8; r++)
805 {
806 ULONGEST tmp;
7f5f525d 807 tmp = get_frame_register_unsigned (frame, r);
5f601589
AC
808 fprintf_filtered (file, " %04lx", (long) tmp);
809 }
810 fprintf_filtered (file, "\n");
811 }
812 }
813
814 /* Note: The IMAP/DMAP registers don't participate in function
815 calls. Don't bother trying to unwind them. */
816
6789195b 817 {
5f601589
AC
818 int a;
819 for (a = 0; a < NR_IMAP_REGS; a++)
820 {
821 if (a > 0)
822 fprintf_filtered (file, " ");
f6684c31
AC
823 fprintf_filtered (file, "IMAP%d %04lx", a,
824 tdep->imap_register (current_regcache, a));
5f601589 825 }
f75493ed 826 if (nr_dmap_regs (gdbarch) == 1)
5f601589 827 /* Registers DMAP0 and DMAP1 are constant. Just return dmap2. */
f6684c31
AC
828 fprintf_filtered (file, " DMAP %04lx\n",
829 tdep->dmap_register (current_regcache, 2));
5f601589
AC
830 else
831 {
f75493ed 832 for (a = 0; a < nr_dmap_regs (gdbarch); a++)
5f601589 833 {
f6684c31
AC
834 fprintf_filtered (file, " DMAP%d %04lx", a,
835 tdep->dmap_register (current_regcache, a));
5f601589
AC
836 }
837 fprintf_filtered (file, "\n");
838 }
839 }
840
841 {
0c92afe8 842 char num[MAX_REGISTER_SIZE];
5f601589
AC
843 int a;
844 fprintf_filtered (file, "A0-A%d", NR_A_REGS - 1);
f75493ed 845 for (a = a0_regnum (gdbarch); a < a0_regnum (gdbarch) + NR_A_REGS; a++)
6789195b
AC
846 {
847 int i;
5f601589 848 fprintf_filtered (file, " ");
7f5f525d 849 get_frame_register (frame, a, num);
ae1e7417 850 for (i = 0; i < register_size (gdbarch, a); i++)
6789195b 851 {
5f601589 852 fprintf_filtered (file, "%02x", (num[i] & 0xff));
6789195b
AC
853 }
854 }
855 }
5f601589
AC
856 fprintf_filtered (file, "\n");
857}
858
859static void
860show_regs (char *args, int from_tty)
861{
862 d10v_print_registers_info (current_gdbarch, gdb_stdout,
863 get_current_frame (), -1, 1);
c906108c
SS
864}
865
f5e1cf12 866static CORE_ADDR
39f77062 867d10v_read_pc (ptid_t ptid)
c906108c 868{
39f77062 869 ptid_t save_ptid;
c906108c
SS
870 CORE_ADDR pc;
871 CORE_ADDR retval;
872
39f77062
KB
873 save_ptid = inferior_ptid;
874 inferior_ptid = ptid;
27d94c49 875 pc = (int) read_register (D10V_PC_REGNUM);
39f77062 876 inferior_ptid = save_ptid;
7b570125 877 retval = d10v_make_iaddr (pc);
c906108c
SS
878 return retval;
879}
880
f5e1cf12 881static void
39f77062 882d10v_write_pc (CORE_ADDR val, ptid_t ptid)
c906108c 883{
39f77062 884 ptid_t save_ptid;
c906108c 885
39f77062
KB
886 save_ptid = inferior_ptid;
887 inferior_ptid = ptid;
27d94c49 888 write_register (D10V_PC_REGNUM, d10v_convert_iaddr_to_raw (val));
39f77062 889 inferior_ptid = save_ptid;
c906108c
SS
890}
891
f5e1cf12 892static CORE_ADDR
a9e5fdc2 893d10v_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
c906108c 894{
a9e5fdc2
AC
895 ULONGEST sp;
896 frame_unwind_unsigned_register (next_frame, D10V_SP_REGNUM, &sp);
897 return d10v_make_daddr (sp);
c906108c
SS
898}
899
7a292a7a 900/* When arguments must be pushed onto the stack, they go on in reverse
db72fa6b 901 order. The below implements a FILO (stack) to do this. */
7a292a7a
SS
902
903struct stack_item
904{
905 int len;
906 struct stack_item *prev;
907 void *data;
908};
909
a14ed312
KB
910static struct stack_item *push_stack_item (struct stack_item *prev,
911 void *contents, int len);
7a292a7a 912static struct stack_item *
fba45db2 913push_stack_item (struct stack_item *prev, void *contents, int len)
7a292a7a
SS
914{
915 struct stack_item *si;
916 si = xmalloc (sizeof (struct stack_item));
917 si->data = xmalloc (len);
918 si->len = len;
919 si->prev = prev;
920 memcpy (si->data, contents, len);
921 return si;
922}
923
a14ed312 924static struct stack_item *pop_stack_item (struct stack_item *si);
7a292a7a 925static struct stack_item *
fba45db2 926pop_stack_item (struct stack_item *si)
7a292a7a
SS
927{
928 struct stack_item *dead = si;
929 si = si->prev;
b8c9b27d
KB
930 xfree (dead->data);
931 xfree (dead);
7a292a7a
SS
932 return si;
933}
934
935
7043d8dc
AC
936static CORE_ADDR
937d10v_push_dummy_code (struct gdbarch *gdbarch,
938 CORE_ADDR sp, CORE_ADDR funaddr, int using_gcc,
939 struct value **args, int nargs,
940 struct type *value_type,
941 CORE_ADDR *real_pc, CORE_ADDR *bp_addr)
942{
943 /* Allocate space sufficient for a breakpoint. */
944 sp = (sp - 4) & ~3;
945 /* Store the address of that breakpoint taking care to first convert
946 it into a code (IADDR) address from a stack (DADDR) address.
947 This of course assumes that the two virtual addresses map onto
948 the same real address. */
949 (*bp_addr) = d10v_make_iaddr (d10v_convert_iaddr_to_raw (sp));
950 /* d10v always starts the call at the callee's entry point. */
951 (*real_pc) = funaddr;
952 return sp;
953}
954
f5e1cf12 955static CORE_ADDR
6a65450a
AC
956d10v_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
957 struct regcache *regcache, CORE_ADDR bp_addr,
db72fa6b
MS
958 int nargs, struct value **args, CORE_ADDR sp,
959 int struct_return, CORE_ADDR struct_addr)
c906108c
SS
960{
961 int i;
962 int regnum = ARG1_REGNUM;
7a292a7a 963 struct stack_item *si = NULL;
7bd91a28
MS
964 long val;
965
5873a88d 966 /* Set the return address. For the d10v, the return breakpoint is
6a65450a 967 always at BP_ADDR. */
5873a88d 968 regcache_cooked_write_unsigned (regcache, LR_REGNUM,
6a65450a 969 d10v_convert_iaddr_to_raw (bp_addr));
5873a88d 970
4183d812
AC
971 /* If STRUCT_RETURN is true, then the struct return address (in
972 STRUCT_ADDR) will consume the first argument-passing register.
973 Both adjust the register count and store that value. */
7bd91a28 974 if (struct_return)
4183d812 975 {
5873a88d 976 regcache_cooked_write_unsigned (regcache, regnum, struct_addr);
4183d812
AC
977 regnum++;
978 }
c5aa993b 979
c906108c
SS
980 /* Fill in registers and arg lists */
981 for (i = 0; i < nargs; i++)
982 {
ea7c478f 983 struct value *arg = args[i];
c906108c
SS
984 struct type *type = check_typedef (VALUE_TYPE (arg));
985 char *contents = VALUE_CONTENTS (arg);
986 int len = TYPE_LENGTH (type);
7bd91a28
MS
987 int aligned_regnum = (regnum + 1) & ~1;
988
8b279e7a 989 /* printf ("push: type=%d len=%d\n", TYPE_CODE (type), len); */
7bd91a28
MS
990 if (len <= 2 && regnum <= ARGN_REGNUM)
991 /* fits in a single register, do not align */
992 {
993 val = extract_unsigned_integer (contents, len);
5873a88d 994 regcache_cooked_write_unsigned (regcache, regnum++, val);
7bd91a28
MS
995 }
996 else if (len <= (ARGN_REGNUM - aligned_regnum + 1) * 2)
997 /* value fits in remaining registers, store keeping left
998 aligned */
c906108c 999 {
7bd91a28
MS
1000 int b;
1001 regnum = aligned_regnum;
1002 for (b = 0; b < (len & ~1); b += 2)
c906108c 1003 {
7bd91a28 1004 val = extract_unsigned_integer (&contents[b], 2);
5873a88d 1005 regcache_cooked_write_unsigned (regcache, regnum++, val);
c906108c 1006 }
7bd91a28 1007 if (b < len)
c906108c 1008 {
7bd91a28 1009 val = extract_unsigned_integer (&contents[b], 1);
5873a88d 1010 regcache_cooked_write_unsigned (regcache, regnum++, (val << 8));
c906108c
SS
1011 }
1012 }
7bd91a28
MS
1013 else
1014 {
1015 /* arg will go onto stack */
1016 regnum = ARGN_REGNUM + 1;
1017 si = push_stack_item (si, contents, len);
1018 }
c906108c 1019 }
7a292a7a
SS
1020
1021 while (si)
1022 {
1023 sp = (sp - si->len) & ~1;
1024 write_memory (sp, si->data, si->len);
1025 si = pop_stack_item (si);
1026 }
c5aa993b 1027
5873a88d 1028 /* Finally, update the SP register. */
f75493ed 1029 regcache_cooked_write_unsigned (regcache, D10V_SP_REGNUM,
5873a88d
AC
1030 d10v_convert_daddr_to_raw (sp));
1031
c906108c
SS
1032 return sp;
1033}
1034
c2c6d25f
JM
1035/* Translate a GDB virtual ADDR/LEN into a format the remote target
1036 understands. Returns number of bytes that can be transfered
4ce44c66
JM
1037 starting at TARG_ADDR. Return ZERO if no bytes can be transfered
1038 (segmentation fault). Since the simulator knows all about how the
db72fa6b 1039 VM system works, we just call that to do the translation. */
c2c6d25f 1040
4ce44c66 1041static void
f6684c31
AC
1042remote_d10v_translate_xfer_address (struct gdbarch *gdbarch,
1043 struct regcache *regcache,
1044 CORE_ADDR memaddr, int nr_bytes,
c2c6d25f
JM
1045 CORE_ADDR *targ_addr, int *targ_len)
1046{
f6684c31 1047 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4ce44c66
JM
1048 long out_addr;
1049 long out_len;
f6684c31
AC
1050 out_len = sim_d10v_translate_addr (memaddr, nr_bytes, &out_addr, regcache,
1051 tdep->dmap_register, tdep->imap_register);
4ce44c66
JM
1052 *targ_addr = out_addr;
1053 *targ_len = out_len;
c2c6d25f
JM
1054}
1055
4ce44c66 1056
c906108c
SS
1057/* The following code implements access to, and display of, the D10V's
1058 instruction trace buffer. The buffer consists of 64K or more
1059 4-byte words of data, of which each words includes an 8-bit count,
1060 an 8-bit segment number, and a 16-bit instruction address.
1061
1062 In theory, the trace buffer is continuously capturing instruction
1063 data that the CPU presents on its "debug bus", but in practice, the
1064 ROMified GDB stub only enables tracing when it continues or steps
1065 the program, and stops tracing when the program stops; so it
1066 actually works for GDB to read the buffer counter out of memory and
1067 then read each trace word. The counter records where the tracing
1068 stops, but there is no record of where it started, so we remember
1069 the PC when we resumed and then search backwards in the trace
1070 buffer for a word that includes that address. This is not perfect,
1071 because you will miss trace data if the resumption PC is the target
1072 of a branch. (The value of the buffer counter is semi-random, any
1073 trace data from a previous program stop is gone.) */
1074
1075/* The address of the last word recorded in the trace buffer. */
1076
1077#define DBBC_ADDR (0xd80000)
1078
1079/* The base of the trace buffer, at least for the "Board_0". */
1080
1081#define TRACE_BUFFER_BASE (0xf40000)
1082
a14ed312 1083static void trace_command (char *, int);
c906108c 1084
a14ed312 1085static void untrace_command (char *, int);
c906108c 1086
a14ed312 1087static void trace_info (char *, int);
c906108c 1088
a14ed312 1089static void tdisassemble_command (char *, int);
c906108c 1090
a14ed312 1091static void display_trace (int, int);
c906108c
SS
1092
1093/* True when instruction traces are being collected. */
1094
1095static int tracing;
1096
1097/* Remembered PC. */
1098
1099static CORE_ADDR last_pc;
1100
1101/* True when trace output should be displayed whenever program stops. */
1102
1103static int trace_display;
1104
1105/* True when trace listing should include source lines. */
1106
1107static int default_trace_show_source = 1;
1108
c5aa993b
JM
1109struct trace_buffer
1110 {
1111 int size;
1112 short *counts;
1113 CORE_ADDR *addrs;
1114 }
1115trace_data;
c906108c
SS
1116
1117static void
fba45db2 1118trace_command (char *args, int from_tty)
c906108c
SS
1119{
1120 /* Clear the host-side trace buffer, allocating space if needed. */
1121 trace_data.size = 0;
1122 if (trace_data.counts == NULL)
f75493ed 1123 trace_data.counts = XCALLOC (65536, short);
c906108c 1124 if (trace_data.addrs == NULL)
f75493ed 1125 trace_data.addrs = XCALLOC (65536, CORE_ADDR);
c906108c
SS
1126
1127 tracing = 1;
1128
1129 printf_filtered ("Tracing is now on.\n");
1130}
1131
1132static void
fba45db2 1133untrace_command (char *args, int from_tty)
c906108c
SS
1134{
1135 tracing = 0;
1136
1137 printf_filtered ("Tracing is now off.\n");
1138}
1139
1140static void
fba45db2 1141trace_info (char *args, int from_tty)
c906108c
SS
1142{
1143 int i;
1144
1145 if (trace_data.size)
1146 {
1147 printf_filtered ("%d entries in trace buffer:\n", trace_data.size);
1148
1149 for (i = 0; i < trace_data.size; ++i)
1150 {
d4f3574e
SS
1151 printf_filtered ("%d: %d instruction%s at 0x%s\n",
1152 i,
1153 trace_data.counts[i],
c906108c 1154 (trace_data.counts[i] == 1 ? "" : "s"),
d4f3574e 1155 paddr_nz (trace_data.addrs[i]));
c906108c
SS
1156 }
1157 }
1158 else
1159 printf_filtered ("No entries in trace buffer.\n");
1160
1161 printf_filtered ("Tracing is currently %s.\n", (tracing ? "on" : "off"));
1162}
1163
392a587b 1164static void
fba45db2 1165d10v_eva_prepare_to_trace (void)
c906108c
SS
1166{
1167 if (!tracing)
1168 return;
1169
27d94c49 1170 last_pc = read_register (D10V_PC_REGNUM);
c906108c
SS
1171}
1172
1173/* Collect trace data from the target board and format it into a form
1174 more useful for display. */
1175
392a587b 1176static void
fba45db2 1177d10v_eva_get_trace_data (void)
c906108c
SS
1178{
1179 int count, i, j, oldsize;
1180 int trace_addr, trace_seg, trace_cnt, next_cnt;
1181 unsigned int last_trace, trace_word, next_word;
1182 unsigned int *tmpspace;
1183
1184 if (!tracing)
1185 return;
1186
c5aa993b 1187 tmpspace = xmalloc (65536 * sizeof (unsigned int));
c906108c
SS
1188
1189 last_trace = read_memory_unsigned_integer (DBBC_ADDR, 2) << 2;
1190
1191 /* Collect buffer contents from the target, stopping when we reach
1192 the word recorded when execution resumed. */
1193
1194 count = 0;
1195 while (last_trace > 0)
1196 {
1197 QUIT;
1198 trace_word =
1199 read_memory_unsigned_integer (TRACE_BUFFER_BASE + last_trace, 4);
1200 trace_addr = trace_word & 0xffff;
1201 last_trace -= 4;
1202 /* Ignore an apparently nonsensical entry. */
1203 if (trace_addr == 0xffd5)
1204 continue;
1205 tmpspace[count++] = trace_word;
1206 if (trace_addr == last_pc)
1207 break;
1208 if (count > 65535)
1209 break;
1210 }
1211
1212 /* Move the data to the host-side trace buffer, adjusting counts to
1213 include the last instruction executed and transforming the address
1214 into something that GDB likes. */
1215
1216 for (i = 0; i < count; ++i)
1217 {
1218 trace_word = tmpspace[i];
1219 next_word = ((i == 0) ? 0 : tmpspace[i - 1]);
1220 trace_addr = trace_word & 0xffff;
1221 next_cnt = (next_word >> 24) & 0xff;
1222 j = trace_data.size + count - i - 1;
1223 trace_data.addrs[j] = (trace_addr << 2) + 0x1000000;
1224 trace_data.counts[j] = next_cnt + 1;
1225 }
1226
1227 oldsize = trace_data.size;
1228 trace_data.size += count;
1229
b8c9b27d 1230 xfree (tmpspace);
c906108c
SS
1231
1232 if (trace_display)
1233 display_trace (oldsize, trace_data.size);
1234}
1235
1236static void
fba45db2 1237tdisassemble_command (char *arg, int from_tty)
c906108c
SS
1238{
1239 int i, count;
1240 CORE_ADDR low, high;
c906108c
SS
1241
1242 if (!arg)
1243 {
1244 low = 0;
1245 high = trace_data.size;
1246 }
c906108c 1247 else
e8933a55
AC
1248 {
1249 char *space_index = strchr (arg, ' ');
1250 if (space_index == NULL)
1251 {
1252 low = parse_and_eval_address (arg);
1253 high = low + 5;
1254 }
1255 else
1256 {
1257 /* Two arguments. */
1258 *space_index = '\0';
1259 low = parse_and_eval_address (arg);
1260 high = parse_and_eval_address (space_index + 1);
1261 if (high < low)
1262 high = low;
1263 }
c906108c
SS
1264 }
1265
db72fa6b
MS
1266 printf_filtered ("Dump of trace from %s to %s:\n",
1267 paddr_u (low), paddr_u (high));
c906108c
SS
1268
1269 display_trace (low, high);
1270
1271 printf_filtered ("End of trace dump.\n");
1272 gdb_flush (gdb_stdout);
1273}
1274
1275static void
fba45db2 1276display_trace (int low, int high)
c906108c
SS
1277{
1278 int i, count, trace_show_source, first, suppress;
1279 CORE_ADDR next_address;
1280
1281 trace_show_source = default_trace_show_source;
c5aa993b 1282 if (!have_full_symbols () && !have_partial_symbols ())
c906108c
SS
1283 {
1284 trace_show_source = 0;
1285 printf_filtered ("No symbol table is loaded. Use the \"file\" command.\n");
1286 printf_filtered ("Trace will not display any source.\n");
1287 }
1288
1289 first = 1;
1290 suppress = 0;
1291 for (i = low; i < high; ++i)
1292 {
1293 next_address = trace_data.addrs[i];
c5aa993b 1294 count = trace_data.counts[i];
c906108c
SS
1295 while (count-- > 0)
1296 {
1297 QUIT;
1298 if (trace_show_source)
1299 {
1300 struct symtab_and_line sal, sal_prev;
1301
1302 sal_prev = find_pc_line (next_address - 4, 0);
1303 sal = find_pc_line (next_address, 0);
1304
1305 if (sal.symtab)
1306 {
1307 if (first || sal.line != sal_prev.line)
1308 print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
1309 suppress = 0;
1310 }
1311 else
1312 {
1313 if (!suppress)
1314 /* FIXME-32x64--assumes sal.pc fits in long. */
1315 printf_filtered ("No source file for address %s.\n",
c5aa993b 1316 local_hex_string ((unsigned long) sal.pc));
c906108c
SS
1317 suppress = 1;
1318 }
1319 }
1320 first = 0;
1321 print_address (next_address, gdb_stdout);
1322 printf_filtered (":");
1323 printf_filtered ("\t");
1324 wrap_here (" ");
92bf2b80 1325 next_address += gdb_print_insn (next_address, gdb_stdout);
c906108c
SS
1326 printf_filtered ("\n");
1327 gdb_flush (gdb_stdout);
1328 }
1329 }
1330}
1331
7f6104a9 1332static CORE_ADDR
12cc2063 1333d10v_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
7f6104a9 1334{
12cc2063 1335 ULONGEST pc;
27d94c49 1336 frame_unwind_unsigned_register (next_frame, D10V_PC_REGNUM, &pc);
12cc2063 1337 return d10v_make_iaddr (pc);
7f6104a9
AC
1338}
1339
1340/* Given a GDB frame, determine the address of the calling function's
1341 frame. This will be used to create a new GDB frame struct. */
1342
1343static void
6dc42492
AC
1344d10v_frame_this_id (struct frame_info *next_frame,
1345 void **this_prologue_cache,
1346 struct frame_id *this_id)
7f6104a9 1347{
6dc42492
AC
1348 struct d10v_unwind_cache *info
1349 = d10v_frame_unwind_cache (next_frame, this_prologue_cache);
1350 CORE_ADDR base;
81f8a206
AC
1351 CORE_ADDR func;
1352 struct frame_id id;
7f6104a9 1353
81f8a206
AC
1354 /* The FUNC is easy. */
1355 func = frame_func_unwind (next_frame);
7f6104a9 1356
6dc42492
AC
1357 /* Hopefully the prologue analysis either correctly determined the
1358 frame's base (which is the SP from the previous frame), or set
1359 that base to "NULL". */
270cb5d6 1360 base = info->prev_sp;
6dc42492
AC
1361 if (base == STACK_START || base == 0)
1362 return;
7f6104a9 1363
81f8a206
AC
1364 id = frame_id_build (base, func);
1365
81f8a206 1366 (*this_id) = id;
7f6104a9
AC
1367}
1368
7f6104a9 1369static void
6dc42492
AC
1370d10v_frame_prev_register (struct frame_info *next_frame,
1371 void **this_prologue_cache,
1372 int regnum, int *optimizedp,
1373 enum lval_type *lvalp, CORE_ADDR *addrp,
1374 int *realnump, void *bufferp)
7f6104a9 1375{
6dc42492
AC
1376 struct d10v_unwind_cache *info
1377 = d10v_frame_unwind_cache (next_frame, this_prologue_cache);
a0f267c7
AC
1378 trad_frame_prev_register (next_frame, info->saved_regs, regnum,
1379 optimizedp, lvalp, addrp, realnump, bufferp);
7f6104a9
AC
1380}
1381
270cb5d6 1382static const struct frame_unwind d10v_frame_unwind = {
7df05f2b 1383 NORMAL_FRAME,
6dc42492
AC
1384 d10v_frame_this_id,
1385 d10v_frame_prev_register
7f6104a9
AC
1386};
1387
b9362cc7 1388static const struct frame_unwind *
336d1bba 1389d10v_frame_sniffer (struct frame_info *next_frame)
7f6104a9
AC
1390{
1391 return &d10v_frame_unwind;
1392}
1393
270cb5d6
AC
1394static CORE_ADDR
1395d10v_frame_base_address (struct frame_info *next_frame, void **this_cache)
1396{
1397 struct d10v_unwind_cache *info
1398 = d10v_frame_unwind_cache (next_frame, this_cache);
1399 return info->base;
1400}
1401
1402static const struct frame_base d10v_frame_base = {
1403 &d10v_frame_unwind,
1404 d10v_frame_base_address,
1405 d10v_frame_base_address,
1406 d10v_frame_base_address
1407};
1408
6314f104
AC
1409/* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
1410 dummy frame. The frame ID's base needs to match the TOS value
1411 saved by save_dummy_frame_tos(), and the PC match the dummy frame's
1412 breakpoint. */
1413
1414static struct frame_id
1415d10v_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
1416{
3e210248
AC
1417 return frame_id_build (d10v_unwind_sp (gdbarch, next_frame),
1418 frame_pc_unwind (next_frame));
6314f104
AC
1419}
1420
0f71a2f6 1421static gdbarch_init_ftype d10v_gdbarch_init;
4ce44c66 1422
0f71a2f6 1423static struct gdbarch *
fba45db2 1424d10v_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
0f71a2f6 1425{
0f71a2f6 1426 struct gdbarch *gdbarch;
4ce44c66
JM
1427 int d10v_num_regs;
1428 struct gdbarch_tdep *tdep;
1429 gdbarch_register_name_ftype *d10v_register_name;
7c7651b2 1430 gdbarch_register_sim_regno_ftype *d10v_register_sim_regno;
0f71a2f6 1431
db72fa6b 1432 /* Find a candidate among the list of pre-declared architectures. */
4ce44c66 1433 arches = gdbarch_list_lookup_by_info (arches, &info);
0f71a2f6
JM
1434 if (arches != NULL)
1435 return arches->gdbarch;
4ce44c66
JM
1436
1437 /* None found, create a new architecture from the information
db72fa6b 1438 provided. */
4ce44c66
JM
1439 tdep = XMALLOC (struct gdbarch_tdep);
1440 gdbarch = gdbarch_alloc (&info, tdep);
1441
1442 switch (info.bfd_arch_info->mach)
1443 {
1444 case bfd_mach_d10v_ts2:
1445 d10v_num_regs = 37;
1446 d10v_register_name = d10v_ts2_register_name;
7c7651b2 1447 d10v_register_sim_regno = d10v_ts2_register_sim_regno;
4ce44c66
JM
1448 tdep->a0_regnum = TS2_A0_REGNUM;
1449 tdep->nr_dmap_regs = TS2_NR_DMAP_REGS;
4ce44c66
JM
1450 tdep->dmap_register = d10v_ts2_dmap_register;
1451 tdep->imap_register = d10v_ts2_imap_register;
1452 break;
1453 default:
1454 case bfd_mach_d10v_ts3:
1455 d10v_num_regs = 42;
1456 d10v_register_name = d10v_ts3_register_name;
7c7651b2 1457 d10v_register_sim_regno = d10v_ts3_register_sim_regno;
4ce44c66
JM
1458 tdep->a0_regnum = TS3_A0_REGNUM;
1459 tdep->nr_dmap_regs = TS3_NR_DMAP_REGS;
4ce44c66
JM
1460 tdep->dmap_register = d10v_ts3_dmap_register;
1461 tdep->imap_register = d10v_ts3_imap_register;
1462 break;
1463 }
0f71a2f6
JM
1464
1465 set_gdbarch_read_pc (gdbarch, d10v_read_pc);
1466 set_gdbarch_write_pc (gdbarch, d10v_write_pc);
a9e5fdc2 1467 set_gdbarch_unwind_sp (gdbarch, d10v_unwind_sp);
0f71a2f6
JM
1468
1469 set_gdbarch_num_regs (gdbarch, d10v_num_regs);
f75493ed 1470 set_gdbarch_sp_regnum (gdbarch, D10V_SP_REGNUM);
0f71a2f6 1471 set_gdbarch_register_name (gdbarch, d10v_register_name);
35cac7cf 1472 set_gdbarch_register_type (gdbarch, d10v_register_type);
0f71a2f6 1473
75af7f68
JB
1474 set_gdbarch_ptr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
1475 set_gdbarch_addr_bit (gdbarch, 32);
1476 set_gdbarch_address_to_pointer (gdbarch, d10v_address_to_pointer);
1477 set_gdbarch_pointer_to_address (gdbarch, d10v_pointer_to_address);
fc0c74b1 1478 set_gdbarch_integer_to_address (gdbarch, d10v_integer_to_address);
0f71a2f6
JM
1479 set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
1480 set_gdbarch_int_bit (gdbarch, 2 * TARGET_CHAR_BIT);
1481 set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
02da6206 1482 set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
f0d4cc9e 1483 /* NOTE: The d10v as a 32 bit ``float'' and ``double''. ``long
db72fa6b 1484 double'' is 64 bits. */
0f71a2f6
JM
1485 set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1486 set_gdbarch_double_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1487 set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
f0d4cc9e
AC
1488 switch (info.byte_order)
1489 {
d7449b42 1490 case BFD_ENDIAN_BIG:
f0d4cc9e
AC
1491 set_gdbarch_float_format (gdbarch, &floatformat_ieee_single_big);
1492 set_gdbarch_double_format (gdbarch, &floatformat_ieee_single_big);
1493 set_gdbarch_long_double_format (gdbarch, &floatformat_ieee_double_big);
1494 break;
778eb05e 1495 case BFD_ENDIAN_LITTLE:
f0d4cc9e
AC
1496 set_gdbarch_float_format (gdbarch, &floatformat_ieee_single_little);
1497 set_gdbarch_double_format (gdbarch, &floatformat_ieee_single_little);
db72fa6b
MS
1498 set_gdbarch_long_double_format (gdbarch,
1499 &floatformat_ieee_double_little);
f0d4cc9e
AC
1500 break;
1501 default:
8e65ff28
AC
1502 internal_error (__FILE__, __LINE__,
1503 "d10v_gdbarch_init: bad byte order for float format");
f0d4cc9e 1504 }
0f71a2f6 1505
181555e9 1506 set_gdbarch_return_value (gdbarch, d10v_return_value);
7043d8dc 1507 set_gdbarch_push_dummy_code (gdbarch, d10v_push_dummy_code);
5873a88d 1508 set_gdbarch_push_dummy_call (gdbarch, d10v_push_dummy_call);
0f71a2f6 1509
0f71a2f6
JM
1510 set_gdbarch_skip_prologue (gdbarch, d10v_skip_prologue);
1511 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1512 set_gdbarch_decr_pc_after_break (gdbarch, 4);
0f71a2f6
JM
1513 set_gdbarch_breakpoint_from_pc (gdbarch, d10v_breakpoint_from_pc);
1514
db72fa6b
MS
1515 set_gdbarch_remote_translate_xfer_address (gdbarch,
1516 remote_d10v_translate_xfer_address);
0f71a2f6 1517
6ae2f580 1518 set_gdbarch_frame_align (gdbarch, d10v_frame_align);
0f71a2f6 1519
7c7651b2
AC
1520 set_gdbarch_register_sim_regno (gdbarch, d10v_register_sim_regno);
1521
5f601589
AC
1522 set_gdbarch_print_registers_info (gdbarch, d10v_print_registers_info);
1523
336d1bba 1524 frame_unwind_append_sniffer (gdbarch, d10v_frame_sniffer);
270cb5d6 1525 frame_base_set_default (gdbarch, &d10v_frame_base);
7f6104a9 1526
3e210248
AC
1527 /* Methods for saving / extracting a dummy frame's ID. The ID's
1528 stack address must match the SP value returned by
1529 PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos. */
6314f104 1530 set_gdbarch_unwind_dummy_id (gdbarch, d10v_unwind_dummy_id);
6314f104 1531
12cc2063
AC
1532 /* Return the unwound PC value. */
1533 set_gdbarch_unwind_pc (gdbarch, d10v_unwind_pc);
1534
0ef21242
AC
1535 set_gdbarch_print_insn (gdbarch, print_insn_d10v);
1536
0f71a2f6
JM
1537 return gdbarch;
1538}
1539
c906108c 1540void
fba45db2 1541_initialize_d10v_tdep (void)
c906108c 1542{
0f71a2f6
JM
1543 register_gdbarch_init (bfd_arch_d10v, d10v_gdbarch_init);
1544
9a4105ab
AC
1545 deprecated_target_resume_hook = d10v_eva_prepare_to_trace;
1546 deprecated_target_wait_loop_hook = d10v_eva_get_trace_data;
c906108c 1547
db72fa6b
MS
1548 deprecate_cmd (add_com ("regs", class_vars, show_regs,
1549 "Print all registers"),
5f601589 1550 "info registers");
c906108c 1551
cff3e48b 1552 add_com ("itrace", class_support, trace_command,
c906108c
SS
1553 "Enable tracing of instruction execution.");
1554
cff3e48b 1555 add_com ("iuntrace", class_support, untrace_command,
c906108c
SS
1556 "Disable tracing of instruction execution.");
1557
cff3e48b 1558 add_com ("itdisassemble", class_vars, tdisassemble_command,
c906108c
SS
1559 "Disassemble the trace buffer.\n\
1560Two optional arguments specify a range of trace buffer entries\n\
1561as reported by info trace (NOT addresses!).");
1562
cff3e48b 1563 add_info ("itrace", trace_info,
c906108c
SS
1564 "Display info about the trace data buffer.");
1565
f75493ed
AC
1566 add_setshow_boolean_cmd ("itracedisplay", no_class, &trace_display,
1567 "Set automatic display of trace.\n",
1568 "Show automatic display of trace.\n",
1569 NULL, NULL, &setlist, &showlist);
1570 add_setshow_boolean_cmd ("itracesource", no_class,
1571 &default_trace_show_source,
1572 "Set display of source code with trace.\n",
1573 "Show display of source code with trace.\n",
1574 NULL, NULL, &setlist, &showlist);
c5aa993b 1575}
This page took 0.422667 seconds and 4 git commands to generate.