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