Tidy up formatting.
[deliverable/binutils-gdb.git] / gdb / d10v-tdep.c
CommitLineData
c906108c 1/* Target-dependent code for Mitsubishi D10V, for GDB.
d9fcf2fb 2 Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
c906108c 3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
c906108c 10
c5aa993b
JM
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
c906108c 15
c5aa993b
JM
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
c906108c
SS
20
21/* Contributed by Martin Hunt, hunt@cygnus.com */
22
23#include "defs.h"
24#include "frame.h"
25#include "obstack.h"
26#include "symtab.h"
27#include "gdbtypes.h"
28#include "gdbcmd.h"
29#include "gdbcore.h"
30#include "gdb_string.h"
31#include "value.h"
32#include "inferior.h"
c5aa993b 33#include "dis-asm.h"
c906108c
SS
34#include "symfile.h"
35#include "objfiles.h"
104c1213 36#include "language.h"
28d069e6 37#include "arch-utils.h"
c906108c 38
f0d4cc9e 39#include "floatformat.h"
4ce44c66
JM
40#include "sim-d10v.h"
41
42#undef XMALLOC
43#define XMALLOC(TYPE) ((TYPE*) xmalloc (sizeof (TYPE)))
44
cce74817 45struct frame_extra_info
c5aa993b
JM
46 {
47 CORE_ADDR return_pc;
48 int frameless;
49 int size;
50 };
cce74817 51
4ce44c66
JM
52struct gdbarch_tdep
53 {
54 int a0_regnum;
55 int nr_dmap_regs;
56 unsigned long (*dmap_register) (int nr);
57 unsigned long (*imap_register) (int nr);
58 int (*register_sim_regno) (int nr);
59 };
60
61/* These are the addresses the D10V-EVA board maps data and
62 instruction memory to. */
cce74817 63
cff3e48b 64#define DMEM_START 0x2000000
cce74817
JM
65#define IMEM_START 0x1000000
66#define STACK_START 0x0007ffe
67
4ce44c66
JM
68/* d10v register names. */
69
70enum
71 {
72 R0_REGNUM = 0,
73 LR_REGNUM = 13,
74 PSW_REGNUM = 16,
75 NR_IMAP_REGS = 2,
76 NR_A_REGS = 2
77 };
78#define NR_DMAP_REGS (gdbarch_tdep (current_gdbarch)->nr_dmap_regs)
79#define A0_REGNUM (gdbarch_tdep (current_gdbarch)->a0_regnum)
80
81/* d10v calling convention. */
cce74817
JM
82
83#define ARG1_REGNUM R0_REGNUM
84#define ARGN_REGNUM 3
85#define RET1_REGNUM R0_REGNUM
86
392a587b
JM
87/* Local functions */
88
a14ed312 89extern void _initialize_d10v_tdep (void);
392a587b 90
a14ed312 91static void d10v_eva_prepare_to_trace (void);
392a587b 92
a14ed312 93static void d10v_eva_get_trace_data (void);
c906108c 94
a14ed312
KB
95static int prologue_find_regs (unsigned short op, struct frame_info *fi,
96 CORE_ADDR addr);
cce74817 97
a14ed312 98extern void d10v_frame_init_saved_regs (struct frame_info *);
cce74817 99
a14ed312 100static void do_d10v_pop_frame (struct frame_info *fi);
cce74817 101
c906108c
SS
102int
103d10v_frame_chain_valid (chain, frame)
104 CORE_ADDR chain;
c5aa993b 105 struct frame_info *frame; /* not used here */
c906108c
SS
106{
107 return ((chain) != 0 && (frame) != 0 && (frame)->pc > IMEM_START);
108}
109
23964bcd 110static CORE_ADDR
489137c0
AC
111d10v_stack_align (CORE_ADDR len)
112{
113 return (len + 1) & ~1;
114}
c906108c
SS
115
116/* Should we use EXTRACT_STRUCT_VALUE_ADDRESS instead of
117 EXTRACT_RETURN_VALUE? GCC_P is true if compiled with gcc
118 and TYPE is the type (which is known to be struct, union or array).
119
120 The d10v returns anything less than 8 bytes in size in
121 registers. */
122
123int
124d10v_use_struct_convention (gcc_p, type)
125 int gcc_p;
126 struct type *type;
127{
128 return (TYPE_LENGTH (type) > 8);
129}
130
131
392a587b
JM
132unsigned char *
133d10v_breakpoint_from_pc (pcptr, lenptr)
134 CORE_ADDR *pcptr;
135 int *lenptr;
136{
c5aa993b
JM
137 static unsigned char breakpoint[] =
138 {0x2f, 0x90, 0x5e, 0x00};
392a587b
JM
139 *lenptr = sizeof (breakpoint);
140 return breakpoint;
141}
142
4ce44c66
JM
143/* Map the REG_NR onto an ascii name. Return NULL or an empty string
144 when the reg_nr isn't valid. */
145
146enum ts2_regnums
147 {
148 TS2_IMAP0_REGNUM = 32,
149 TS2_DMAP_REGNUM = 34,
150 TS2_NR_DMAP_REGS = 1,
151 TS2_A0_REGNUM = 35
152 };
153
154static char *
155d10v_ts2_register_name (int reg_nr)
392a587b 156{
c5aa993b
JM
157 static char *register_names[] =
158 {
159 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
160 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
161 "psw", "bpsw", "pc", "bpc", "cr4", "cr5", "cr6", "rpt_c",
162 "rpt_s", "rpt_e", "mod_s", "mod_e", "cr12", "cr13", "iba", "cr15",
163 "imap0", "imap1", "dmap", "a0", "a1"
392a587b
JM
164 };
165 if (reg_nr < 0)
166 return NULL;
167 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
168 return NULL;
c5aa993b 169 return register_names[reg_nr];
392a587b
JM
170}
171
4ce44c66
JM
172enum ts3_regnums
173 {
174 TS3_IMAP0_REGNUM = 36,
175 TS3_DMAP0_REGNUM = 38,
176 TS3_NR_DMAP_REGS = 4,
177 TS3_A0_REGNUM = 32
178 };
179
180static char *
181d10v_ts3_register_name (int reg_nr)
182{
183 static char *register_names[] =
184 {
185 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
186 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
187 "psw", "bpsw", "pc", "bpc", "cr4", "cr5", "cr6", "rpt_c",
188 "rpt_s", "rpt_e", "mod_s", "mod_e", "cr12", "cr13", "iba", "cr15",
189 "a0", "a1",
190 "spi", "spu",
191 "imap0", "imap1",
192 "dmap0", "dmap1", "dmap2", "dmap3"
193 };
194 if (reg_nr < 0)
195 return NULL;
196 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
197 return NULL;
198 return register_names[reg_nr];
199}
200
201/* Access the DMAP/IMAP registers in a target independant way. */
202
203static unsigned long
204d10v_ts2_dmap_register (int reg_nr)
205{
206 switch (reg_nr)
207 {
208 case 0:
209 case 1:
210 return 0x2000;
211 case 2:
212 return read_register (TS2_DMAP_REGNUM);
213 default:
214 return 0;
215 }
216}
217
218static unsigned long
219d10v_ts3_dmap_register (int reg_nr)
220{
221 return read_register (TS3_DMAP0_REGNUM + reg_nr);
222}
223
224static unsigned long
225d10v_dmap_register (int reg_nr)
226{
227 return gdbarch_tdep (current_gdbarch)->dmap_register (reg_nr);
228}
229
230static unsigned long
231d10v_ts2_imap_register (int reg_nr)
232{
233 return read_register (TS2_IMAP0_REGNUM + reg_nr);
234}
235
236static unsigned long
237d10v_ts3_imap_register (int reg_nr)
238{
239 return read_register (TS3_IMAP0_REGNUM + reg_nr);
240}
241
242static unsigned long
243d10v_imap_register (int reg_nr)
244{
245 return gdbarch_tdep (current_gdbarch)->imap_register (reg_nr);
246}
247
248/* MAP GDB's internal register numbering (determined by the layout fo
249 the REGISTER_BYTE array) onto the simulator's register
250 numbering. */
251
252static int
253d10v_ts2_register_sim_regno (int nr)
254{
255 if (nr >= TS2_IMAP0_REGNUM
256 && nr < TS2_IMAP0_REGNUM + NR_IMAP_REGS)
257 return nr - TS2_IMAP0_REGNUM + SIM_D10V_IMAP0_REGNUM;
258 if (nr == TS2_DMAP_REGNUM)
259 return nr - TS2_DMAP_REGNUM + SIM_D10V_TS2_DMAP_REGNUM;
260 if (nr >= TS2_A0_REGNUM
261 && nr < TS2_A0_REGNUM + NR_A_REGS)
262 return nr - TS2_A0_REGNUM + SIM_D10V_A0_REGNUM;
263 return nr;
264}
265
266static int
267d10v_ts3_register_sim_regno (int nr)
268{
269 if (nr >= TS3_IMAP0_REGNUM
270 && nr < TS3_IMAP0_REGNUM + NR_IMAP_REGS)
271 return nr - TS3_IMAP0_REGNUM + SIM_D10V_IMAP0_REGNUM;
272 if (nr >= TS3_DMAP0_REGNUM
273 && nr < TS3_DMAP0_REGNUM + TS3_NR_DMAP_REGS)
274 return nr - TS3_DMAP0_REGNUM + SIM_D10V_DMAP0_REGNUM;
275 if (nr >= TS3_A0_REGNUM
276 && nr < TS3_A0_REGNUM + NR_A_REGS)
277 return nr - TS3_A0_REGNUM + SIM_D10V_A0_REGNUM;
278 return nr;
279}
280
281int
282d10v_register_sim_regno (int nr)
283{
284 return gdbarch_tdep (current_gdbarch)->register_sim_regno (nr);
285}
392a587b
JM
286
287/* Index within `registers' of the first byte of the space for
288 register REG_NR. */
289
290int
291d10v_register_byte (reg_nr)
292 int reg_nr;
293{
4ce44c66 294 if (reg_nr < A0_REGNUM)
392a587b 295 return (reg_nr * 2);
4ce44c66
JM
296 else if (reg_nr < (A0_REGNUM + NR_A_REGS))
297 return (A0_REGNUM * 2
298 + (reg_nr - A0_REGNUM) * 8);
299 else
300 return (A0_REGNUM * 2
301 + NR_A_REGS * 8
302 + (reg_nr - A0_REGNUM - NR_A_REGS) * 2);
392a587b
JM
303}
304
305/* Number of bytes of storage in the actual machine representation for
306 register REG_NR. */
307
308int
309d10v_register_raw_size (reg_nr)
310 int reg_nr;
311{
4ce44c66
JM
312 if (reg_nr < A0_REGNUM)
313 return 2;
314 else if (reg_nr < (A0_REGNUM + NR_A_REGS))
392a587b
JM
315 return 8;
316 else
317 return 2;
318}
319
320/* Number of bytes of storage in the program's representation
321 for register N. */
322
323int
324d10v_register_virtual_size (reg_nr)
325 int reg_nr;
326{
4ce44c66 327 return TYPE_LENGTH (REGISTER_VIRTUAL_TYPE (reg_nr));
392a587b
JM
328}
329
330/* Return the GDB type object for the "standard" data type
331 of data in register N. */
332
333struct type *
334d10v_register_virtual_type (reg_nr)
335 int reg_nr;
336{
4ce44c66
JM
337 if (reg_nr >= A0_REGNUM
338 && reg_nr < (A0_REGNUM + NR_A_REGS))
339 return builtin_type_int64;
340 else if (reg_nr == PC_REGNUM
341 || reg_nr == SP_REGNUM)
342 return builtin_type_int32;
392a587b 343 else
4ce44c66 344 return builtin_type_int16;
392a587b
JM
345}
346
392a587b 347/* convert $pc and $sp to/from virtual addresses */
ac9a91a7
JM
348int
349d10v_register_convertible (nr)
350 int nr;
351{
352 return ((nr) == PC_REGNUM || (nr) == SP_REGNUM);
353}
354
355void
356d10v_register_convert_to_virtual (regnum, type, from, to)
357 int regnum;
358 struct type *type;
359 char *from;
360 char *to;
361{
362 ULONGEST x = extract_unsigned_integer (from, REGISTER_RAW_SIZE (regnum));
363 if (regnum == PC_REGNUM)
364 x = (x << 2) | IMEM_START;
365 else
366 x |= DMEM_START;
367 store_unsigned_integer (to, TYPE_LENGTH (type), x);
392a587b 368}
ac9a91a7
JM
369
370void
371d10v_register_convert_to_raw (type, regnum, from, to)
372 struct type *type;
373 int regnum;
374 char *from;
375 char *to;
376{
377 ULONGEST x = extract_unsigned_integer (from, TYPE_LENGTH (type));
378 x &= 0x3ffff;
379 if (regnum == PC_REGNUM)
380 x >>= 2;
381 store_unsigned_integer (to, 2, x);
392a587b 382}
ac9a91a7 383
392a587b
JM
384
385CORE_ADDR
386d10v_make_daddr (x)
387 CORE_ADDR x;
388{
389 return ((x) | DMEM_START);
390}
391
392CORE_ADDR
393d10v_make_iaddr (x)
394 CORE_ADDR x;
395{
396 return (((x) << 2) | IMEM_START);
397}
398
399int
400d10v_daddr_p (x)
401 CORE_ADDR x;
402{
403 return (((x) & 0x3000000) == DMEM_START);
404}
405
406int
407d10v_iaddr_p (x)
408 CORE_ADDR x;
409{
410 return (((x) & 0x3000000) == IMEM_START);
411}
412
413
414CORE_ADDR
415d10v_convert_iaddr_to_raw (x)
416 CORE_ADDR x;
417{
418 return (((x) >> 2) & 0xffff);
419}
420
421CORE_ADDR
c5aa993b 422d10v_convert_daddr_to_raw (x)
392a587b
JM
423 CORE_ADDR x;
424{
425 return ((x) & 0xffff);
426}
427
428/* Store the address of the place in which to copy the structure the
429 subroutine will return. This is called from call_function.
430
431 We store structs through a pointer passed in the first Argument
432 register. */
433
434void
435d10v_store_struct_return (addr, sp)
436 CORE_ADDR addr;
437 CORE_ADDR sp;
438{
439 write_register (ARG1_REGNUM, (addr));
440}
441
442/* Write into appropriate registers a function return value
443 of type TYPE, given in virtual format.
444
445 Things always get returned in RET1_REGNUM, RET2_REGNUM, ... */
446
447void
c5aa993b 448d10v_store_return_value (type, valbuf)
392a587b
JM
449 struct type *type;
450 char *valbuf;
451{
452 write_register_bytes (REGISTER_BYTE (RET1_REGNUM),
453 valbuf,
454 TYPE_LENGTH (type));
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
461CORE_ADDR
462d10v_extract_struct_value_address (regbuf)
463 char *regbuf;
464{
465 return (extract_address ((regbuf) + REGISTER_BYTE (ARG1_REGNUM),
466 REGISTER_RAW_SIZE (ARG1_REGNUM))
467 | DMEM_START);
468}
469
470CORE_ADDR
471d10v_frame_saved_pc (frame)
472 struct frame_info *frame;
473{
cce74817 474 return ((frame)->extra_info->return_pc);
392a587b
JM
475}
476
477CORE_ADDR
478d10v_frame_args_address (fi)
479 struct frame_info *fi;
480{
481 return (fi)->frame;
482}
483
484CORE_ADDR
485d10v_frame_locals_address (fi)
486 struct frame_info *fi;
487{
488 return (fi)->frame;
489}
490
491/* Immediately after a function call, return the saved pc. We can't
492 use frame->return_pc beause that is determined by reading R13 off
493 the stack and that may not be written yet. */
494
495CORE_ADDR
496d10v_saved_pc_after_call (frame)
497 struct frame_info *frame;
498{
c5aa993b 499 return ((read_register (LR_REGNUM) << 2)
392a587b
JM
500 | IMEM_START);
501}
502
c906108c
SS
503/* Discard from the stack the innermost frame, restoring all saved
504 registers. */
505
506void
cce74817
JM
507d10v_pop_frame ()
508{
509 generic_pop_current_frame (do_d10v_pop_frame);
510}
511
512static void
513do_d10v_pop_frame (fi)
514 struct frame_info *fi;
c906108c
SS
515{
516 CORE_ADDR fp;
517 int regnum;
c906108c
SS
518 char raw_buffer[8];
519
cce74817 520 fp = FRAME_FP (fi);
c906108c
SS
521 /* fill out fsr with the address of where each */
522 /* register was stored in the frame */
cce74817 523 d10v_frame_init_saved_regs (fi);
c5aa993b 524
c906108c 525 /* now update the current registers with the old values */
4ce44c66 526 for (regnum = A0_REGNUM; regnum < A0_REGNUM + NR_A_REGS; regnum++)
c906108c 527 {
cce74817 528 if (fi->saved_regs[regnum])
c906108c 529 {
c5aa993b
JM
530 read_memory (fi->saved_regs[regnum], raw_buffer, REGISTER_RAW_SIZE (regnum));
531 write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, REGISTER_RAW_SIZE (regnum));
c906108c
SS
532 }
533 }
534 for (regnum = 0; regnum < SP_REGNUM; regnum++)
535 {
cce74817 536 if (fi->saved_regs[regnum])
c906108c 537 {
c5aa993b 538 write_register (regnum, read_memory_unsigned_integer (fi->saved_regs[regnum], REGISTER_RAW_SIZE (regnum)));
c906108c
SS
539 }
540 }
cce74817 541 if (fi->saved_regs[PSW_REGNUM])
c906108c 542 {
c5aa993b 543 write_register (PSW_REGNUM, read_memory_unsigned_integer (fi->saved_regs[PSW_REGNUM], REGISTER_RAW_SIZE (PSW_REGNUM)));
c906108c
SS
544 }
545
546 write_register (PC_REGNUM, read_register (LR_REGNUM));
cce74817 547 write_register (SP_REGNUM, fp + fi->extra_info->size);
c906108c
SS
548 target_store_registers (-1);
549 flush_cached_frames ();
550}
551
c5aa993b 552static int
c906108c
SS
553check_prologue (op)
554 unsigned short op;
555{
556 /* st rn, @-sp */
557 if ((op & 0x7E1F) == 0x6C1F)
558 return 1;
559
560 /* st2w rn, @-sp */
561 if ((op & 0x7E3F) == 0x6E1F)
562 return 1;
563
564 /* subi sp, n */
565 if ((op & 0x7FE1) == 0x01E1)
566 return 1;
567
568 /* mv r11, sp */
569 if (op == 0x417E)
570 return 1;
571
572 /* nop */
573 if (op == 0x5E00)
574 return 1;
575
576 /* st rn, @sp */
577 if ((op & 0x7E1F) == 0x681E)
578 return 1;
579
580 /* st2w rn, @sp */
c5aa993b
JM
581 if ((op & 0x7E3F) == 0x3A1E)
582 return 1;
c906108c
SS
583
584 return 0;
585}
586
587CORE_ADDR
588d10v_skip_prologue (pc)
589 CORE_ADDR pc;
590{
591 unsigned long op;
592 unsigned short op1, op2;
593 CORE_ADDR func_addr, func_end;
594 struct symtab_and_line sal;
595
596 /* If we have line debugging information, then the end of the */
597 /* prologue should the first assembly instruction of the first source line */
598 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
599 {
600 sal = find_pc_line (func_addr, 0);
c5aa993b 601 if (sal.end && sal.end < func_end)
c906108c
SS
602 return sal.end;
603 }
c5aa993b
JM
604
605 if (target_read_memory (pc, (char *) &op, 4))
c906108c
SS
606 return pc; /* Can't access it -- assume no prologue. */
607
608 while (1)
609 {
c5aa993b 610 op = (unsigned long) read_memory_integer (pc, 4);
c906108c
SS
611 if ((op & 0xC0000000) == 0xC0000000)
612 {
613 /* long instruction */
c5aa993b
JM
614 if (((op & 0x3FFF0000) != 0x01FF0000) && /* add3 sp,sp,n */
615 ((op & 0x3F0F0000) != 0x340F0000) && /* st rn, @(offset,sp) */
616 ((op & 0x3F1F0000) != 0x350F0000)) /* st2w rn, @(offset,sp) */
c906108c
SS
617 break;
618 }
619 else
620 {
621 /* short instructions */
622 if ((op & 0xC0000000) == 0x80000000)
623 {
624 op2 = (op & 0x3FFF8000) >> 15;
625 op1 = op & 0x7FFF;
c5aa993b
JM
626 }
627 else
c906108c
SS
628 {
629 op1 = (op & 0x3FFF8000) >> 15;
630 op2 = op & 0x7FFF;
631 }
c5aa993b 632 if (check_prologue (op1))
c906108c 633 {
c5aa993b 634 if (!check_prologue (op2))
c906108c
SS
635 {
636 /* if the previous opcode was really part of the prologue */
637 /* and not just a NOP, then we want to break after both instructions */
638 if (op1 != 0x5E00)
639 pc += 4;
640 break;
641 }
642 }
643 else
644 break;
645 }
646 pc += 4;
647 }
648 return pc;
649}
650
651/* Given a GDB frame, determine the address of the calling function's frame.
652 This will be used to create a new GDB frame struct, and then
653 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
c5aa993b 654 */
c906108c
SS
655
656CORE_ADDR
cce74817
JM
657d10v_frame_chain (fi)
658 struct frame_info *fi;
c906108c 659{
cce74817 660 d10v_frame_init_saved_regs (fi);
c906108c 661
cce74817
JM
662 if (fi->extra_info->return_pc == IMEM_START
663 || inside_entry_file (fi->extra_info->return_pc))
c5aa993b 664 return (CORE_ADDR) 0;
c906108c 665
cce74817 666 if (!fi->saved_regs[FP_REGNUM])
c906108c 667 {
cce74817
JM
668 if (!fi->saved_regs[SP_REGNUM]
669 || fi->saved_regs[SP_REGNUM] == STACK_START)
c5aa993b
JM
670 return (CORE_ADDR) 0;
671
cce74817 672 return fi->saved_regs[SP_REGNUM];
c906108c
SS
673 }
674
c5aa993b
JM
675 if (!read_memory_unsigned_integer (fi->saved_regs[FP_REGNUM],
676 REGISTER_RAW_SIZE (FP_REGNUM)))
677 return (CORE_ADDR) 0;
c906108c 678
cce74817 679 return D10V_MAKE_DADDR (read_memory_unsigned_integer (fi->saved_regs[FP_REGNUM],
c5aa993b
JM
680 REGISTER_RAW_SIZE (FP_REGNUM)));
681}
c906108c
SS
682
683static int next_addr, uses_frame;
684
c5aa993b 685static int
cce74817 686prologue_find_regs (op, fi, addr)
c906108c 687 unsigned short op;
cce74817 688 struct frame_info *fi;
c906108c
SS
689 CORE_ADDR addr;
690{
691 int n;
692
693 /* st rn, @-sp */
694 if ((op & 0x7E1F) == 0x6C1F)
695 {
696 n = (op & 0x1E0) >> 5;
697 next_addr -= 2;
cce74817 698 fi->saved_regs[n] = next_addr;
c906108c
SS
699 return 1;
700 }
701
702 /* st2w rn, @-sp */
703 else if ((op & 0x7E3F) == 0x6E1F)
704 {
705 n = (op & 0x1E0) >> 5;
706 next_addr -= 4;
cce74817 707 fi->saved_regs[n] = next_addr;
c5aa993b 708 fi->saved_regs[n + 1] = next_addr + 2;
c906108c
SS
709 return 1;
710 }
711
712 /* subi sp, n */
713 if ((op & 0x7FE1) == 0x01E1)
714 {
715 n = (op & 0x1E) >> 1;
716 if (n == 0)
717 n = 16;
718 next_addr -= n;
719 return 1;
720 }
721
722 /* mv r11, sp */
723 if (op == 0x417E)
724 {
725 uses_frame = 1;
726 return 1;
727 }
728
729 /* nop */
730 if (op == 0x5E00)
731 return 1;
732
733 /* st rn, @sp */
734 if ((op & 0x7E1F) == 0x681E)
735 {
736 n = (op & 0x1E0) >> 5;
cce74817 737 fi->saved_regs[n] = next_addr;
c906108c
SS
738 return 1;
739 }
740
741 /* st2w rn, @sp */
742 if ((op & 0x7E3F) == 0x3A1E)
743 {
744 n = (op & 0x1E0) >> 5;
cce74817 745 fi->saved_regs[n] = next_addr;
c5aa993b 746 fi->saved_regs[n + 1] = next_addr + 2;
c906108c
SS
747 return 1;
748 }
749
750 return 0;
751}
752
cce74817
JM
753/* Put here the code to store, into fi->saved_regs, the addresses of
754 the saved registers of frame described by FRAME_INFO. This
755 includes special registers such as pc and fp saved in special ways
756 in the stack frame. sp is even more special: the address we return
757 for it IS the sp for the next frame. */
758
c906108c 759void
cce74817 760d10v_frame_init_saved_regs (fi)
c906108c 761 struct frame_info *fi;
c906108c
SS
762{
763 CORE_ADDR fp, pc;
764 unsigned long op;
765 unsigned short op1, op2;
766 int i;
767
768 fp = fi->frame;
cce74817 769 memset (fi->saved_regs, 0, SIZEOF_FRAME_SAVED_REGS);
c906108c
SS
770 next_addr = 0;
771
772 pc = get_pc_function_start (fi->pc);
773
774 uses_frame = 0;
775 while (1)
776 {
c5aa993b 777 op = (unsigned long) read_memory_integer (pc, 4);
c906108c
SS
778 if ((op & 0xC0000000) == 0xC0000000)
779 {
780 /* long instruction */
781 if ((op & 0x3FFF0000) == 0x01FF0000)
782 {
783 /* add3 sp,sp,n */
784 short n = op & 0xFFFF;
785 next_addr += n;
786 }
787 else if ((op & 0x3F0F0000) == 0x340F0000)
788 {
789 /* st rn, @(offset,sp) */
790 short offset = op & 0xFFFF;
791 short n = (op >> 20) & 0xF;
cce74817 792 fi->saved_regs[n] = next_addr + offset;
c906108c
SS
793 }
794 else if ((op & 0x3F1F0000) == 0x350F0000)
795 {
796 /* st2w rn, @(offset,sp) */
797 short offset = op & 0xFFFF;
798 short n = (op >> 20) & 0xF;
cce74817 799 fi->saved_regs[n] = next_addr + offset;
c5aa993b 800 fi->saved_regs[n + 1] = next_addr + offset + 2;
c906108c
SS
801 }
802 else
803 break;
804 }
805 else
806 {
807 /* short instructions */
808 if ((op & 0xC0000000) == 0x80000000)
809 {
810 op2 = (op & 0x3FFF8000) >> 15;
811 op1 = op & 0x7FFF;
c5aa993b
JM
812 }
813 else
c906108c
SS
814 {
815 op1 = (op & 0x3FFF8000) >> 15;
816 op2 = op & 0x7FFF;
817 }
c5aa993b 818 if (!prologue_find_regs (op1, fi, pc) || !prologue_find_regs (op2, fi, pc))
c906108c
SS
819 break;
820 }
821 pc += 4;
822 }
c5aa993b 823
cce74817 824 fi->extra_info->size = -next_addr;
c906108c
SS
825
826 if (!(fp & 0xffff))
c5aa993b 827 fp = D10V_MAKE_DADDR (read_register (SP_REGNUM));
c906108c 828
c5aa993b 829 for (i = 0; i < NUM_REGS - 1; i++)
cce74817 830 if (fi->saved_regs[i])
c906108c 831 {
c5aa993b 832 fi->saved_regs[i] = fp - (next_addr - fi->saved_regs[i]);
c906108c
SS
833 }
834
cce74817 835 if (fi->saved_regs[LR_REGNUM])
c906108c 836 {
cce74817
JM
837 CORE_ADDR return_pc = read_memory_unsigned_integer (fi->saved_regs[LR_REGNUM], REGISTER_RAW_SIZE (LR_REGNUM));
838 fi->extra_info->return_pc = D10V_MAKE_IADDR (return_pc);
c906108c
SS
839 }
840 else
841 {
c5aa993b 842 fi->extra_info->return_pc = D10V_MAKE_IADDR (read_register (LR_REGNUM));
c906108c 843 }
c5aa993b 844
c906108c 845 /* th SP is not normally (ever?) saved, but check anyway */
cce74817 846 if (!fi->saved_regs[SP_REGNUM])
c906108c
SS
847 {
848 /* if the FP was saved, that means the current FP is valid, */
849 /* otherwise, it isn't being used, so we use the SP instead */
850 if (uses_frame)
c5aa993b 851 fi->saved_regs[SP_REGNUM] = read_register (FP_REGNUM) + fi->extra_info->size;
c906108c
SS
852 else
853 {
cce74817
JM
854 fi->saved_regs[SP_REGNUM] = fp + fi->extra_info->size;
855 fi->extra_info->frameless = 1;
856 fi->saved_regs[FP_REGNUM] = 0;
c906108c
SS
857 }
858 }
859}
860
861void
862d10v_init_extra_frame_info (fromleaf, fi)
863 int fromleaf;
864 struct frame_info *fi;
865{
cce74817
JM
866 fi->extra_info = (struct frame_extra_info *)
867 frame_obstack_alloc (sizeof (struct frame_extra_info));
868 frame_saved_regs_zalloc (fi);
869
870 fi->extra_info->frameless = 0;
871 fi->extra_info->size = 0;
872 fi->extra_info->return_pc = 0;
c906108c
SS
873
874 /* The call dummy doesn't save any registers on the stack, so we can
875 return now. */
876 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
877 {
878 return;
879 }
880 else
881 {
cce74817 882 d10v_frame_init_saved_regs (fi);
c906108c
SS
883 }
884}
885
886static void
887show_regs (args, from_tty)
888 char *args;
889 int from_tty;
890{
891 int a;
d4f3574e
SS
892 printf_filtered ("PC=%04lx (0x%lx) PSW=%04lx RPT_S=%04lx RPT_E=%04lx RPT_C=%04lx\n",
893 (long) read_register (PC_REGNUM),
894 (long) D10V_MAKE_IADDR (read_register (PC_REGNUM)),
895 (long) read_register (PSW_REGNUM),
896 (long) read_register (24),
897 (long) read_register (25),
898 (long) read_register (23));
899 printf_filtered ("R0-R7 %04lx %04lx %04lx %04lx %04lx %04lx %04lx %04lx\n",
900 (long) read_register (0),
901 (long) read_register (1),
902 (long) read_register (2),
903 (long) read_register (3),
904 (long) read_register (4),
905 (long) read_register (5),
906 (long) read_register (6),
907 (long) read_register (7));
908 printf_filtered ("R8-R15 %04lx %04lx %04lx %04lx %04lx %04lx %04lx %04lx\n",
909 (long) read_register (8),
910 (long) read_register (9),
911 (long) read_register (10),
912 (long) read_register (11),
913 (long) read_register (12),
914 (long) read_register (13),
915 (long) read_register (14),
916 (long) read_register (15));
4ce44c66
JM
917 for (a = 0; a < NR_IMAP_REGS; a++)
918 {
919 if (a > 0)
920 printf_filtered (" ");
921 printf_filtered ("IMAP%d %04lx", a, d10v_imap_register (a));
922 }
923 if (NR_DMAP_REGS == 1)
924 printf_filtered (" DMAP %04lx\n", d10v_dmap_register (2));
925 else
926 {
927 for (a = 0; a < NR_DMAP_REGS; a++)
928 {
929 printf_filtered (" DMAP%d %04lx", a, d10v_dmap_register (a));
930 }
931 printf_filtered ("\n");
932 }
933 printf_filtered ("A0-A%d", NR_A_REGS - 1);
934 for (a = A0_REGNUM; a < A0_REGNUM + NR_A_REGS; a++)
c906108c
SS
935 {
936 char num[MAX_REGISTER_RAW_SIZE];
937 int i;
938 printf_filtered (" ");
c5aa993b 939 read_register_gen (a, (char *) &num);
c906108c
SS
940 for (i = 0; i < MAX_REGISTER_RAW_SIZE; i++)
941 {
942 printf_filtered ("%02x", (num[i] & 0xff));
943 }
944 }
945 printf_filtered ("\n");
946}
947
948CORE_ADDR
949d10v_read_pc (pid)
950 int pid;
951{
952 int save_pid;
953 CORE_ADDR pc;
954 CORE_ADDR retval;
955
956 save_pid = inferior_pid;
957 inferior_pid = pid;
958 pc = (int) read_register (PC_REGNUM);
959 inferior_pid = save_pid;
960 retval = D10V_MAKE_IADDR (pc);
961 return retval;
962}
963
964void
965d10v_write_pc (val, pid)
966 CORE_ADDR val;
967 int pid;
968{
969 int save_pid;
970
971 save_pid = inferior_pid;
972 inferior_pid = pid;
973 write_register (PC_REGNUM, D10V_CONVERT_IADDR_TO_RAW (val));
974 inferior_pid = save_pid;
975}
976
977CORE_ADDR
978d10v_read_sp ()
979{
980 return (D10V_MAKE_DADDR (read_register (SP_REGNUM)));
981}
982
983void
984d10v_write_sp (val)
985 CORE_ADDR val;
986{
987 write_register (SP_REGNUM, D10V_CONVERT_DADDR_TO_RAW (val));
988}
989
990void
991d10v_write_fp (val)
992 CORE_ADDR val;
993{
994 write_register (FP_REGNUM, D10V_CONVERT_DADDR_TO_RAW (val));
995}
996
997CORE_ADDR
998d10v_read_fp ()
999{
c5aa993b 1000 return (D10V_MAKE_DADDR (read_register (FP_REGNUM)));
c906108c
SS
1001}
1002
1003/* Function: push_return_address (pc)
1004 Set up the return address for the inferior function call.
1005 Needed for targets where we don't actually execute a JSR/BSR instruction */
c5aa993b 1006
c906108c
SS
1007CORE_ADDR
1008d10v_push_return_address (pc, sp)
1009 CORE_ADDR pc;
1010 CORE_ADDR sp;
1011{
1012 write_register (LR_REGNUM, D10V_CONVERT_IADDR_TO_RAW (CALL_DUMMY_ADDRESS ()));
1013 return sp;
1014}
c5aa993b 1015
c906108c 1016
7a292a7a
SS
1017/* When arguments must be pushed onto the stack, they go on in reverse
1018 order. The below implements a FILO (stack) to do this. */
1019
1020struct stack_item
1021{
1022 int len;
1023 struct stack_item *prev;
1024 void *data;
1025};
1026
a14ed312
KB
1027static struct stack_item *push_stack_item (struct stack_item *prev,
1028 void *contents, int len);
7a292a7a
SS
1029static struct stack_item *
1030push_stack_item (prev, contents, len)
1031 struct stack_item *prev;
1032 void *contents;
1033 int len;
1034{
1035 struct stack_item *si;
1036 si = xmalloc (sizeof (struct stack_item));
1037 si->data = xmalloc (len);
1038 si->len = len;
1039 si->prev = prev;
1040 memcpy (si->data, contents, len);
1041 return si;
1042}
1043
a14ed312 1044static struct stack_item *pop_stack_item (struct stack_item *si);
7a292a7a
SS
1045static struct stack_item *
1046pop_stack_item (si)
1047 struct stack_item *si;
1048{
1049 struct stack_item *dead = si;
1050 si = si->prev;
1051 free (dead->data);
1052 free (dead);
1053 return si;
1054}
1055
1056
c906108c
SS
1057CORE_ADDR
1058d10v_push_arguments (nargs, args, sp, struct_return, struct_addr)
1059 int nargs;
1060 value_ptr *args;
1061 CORE_ADDR sp;
1062 int struct_return;
1063 CORE_ADDR struct_addr;
1064{
1065 int i;
1066 int regnum = ARG1_REGNUM;
7a292a7a 1067 struct stack_item *si = NULL;
c5aa993b 1068
c906108c
SS
1069 /* Fill in registers and arg lists */
1070 for (i = 0; i < nargs; i++)
1071 {
1072 value_ptr arg = args[i];
1073 struct type *type = check_typedef (VALUE_TYPE (arg));
1074 char *contents = VALUE_CONTENTS (arg);
1075 int len = TYPE_LENGTH (type);
1076 /* printf ("push: type=%d len=%d\n", type->code, len); */
1077 if (TYPE_CODE (type) == TYPE_CODE_PTR)
1078 {
1079 /* pointers require special handling - first convert and
1080 then store */
1081 long val = extract_signed_integer (contents, len);
1082 len = 2;
1083 if (TYPE_TARGET_TYPE (type)
1084 && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC))
1085 {
1086 /* function pointer */
1087 val = D10V_CONVERT_IADDR_TO_RAW (val);
1088 }
1089 else if (D10V_IADDR_P (val))
1090 {
1091 /* also function pointer! */
1092 val = D10V_CONVERT_DADDR_TO_RAW (val);
1093 }
1094 else
1095 {
1096 /* data pointer */
1097 val &= 0xFFFF;
1098 }
1099 if (regnum <= ARGN_REGNUM)
1100 write_register (regnum++, val & 0xffff);
1101 else
1102 {
1103 char ptr[2];
7a292a7a 1104 /* arg will go onto stack */
0f71a2f6 1105 store_address (ptr, 2, val & 0xffff);
7a292a7a 1106 si = push_stack_item (si, ptr, 2);
c906108c
SS
1107 }
1108 }
1109 else
1110 {
1111 int aligned_regnum = (regnum + 1) & ~1;
1112 if (len <= 2 && regnum <= ARGN_REGNUM)
1113 /* fits in a single register, do not align */
1114 {
1115 long val = extract_unsigned_integer (contents, len);
1116 write_register (regnum++, val);
1117 }
1118 else if (len <= (ARGN_REGNUM - aligned_regnum + 1) * 2)
1119 /* value fits in remaining registers, store keeping left
c5aa993b 1120 aligned */
c906108c
SS
1121 {
1122 int b;
1123 regnum = aligned_regnum;
1124 for (b = 0; b < (len & ~1); b += 2)
1125 {
1126 long val = extract_unsigned_integer (&contents[b], 2);
1127 write_register (regnum++, val);
1128 }
1129 if (b < len)
1130 {
1131 long val = extract_unsigned_integer (&contents[b], 1);
1132 write_register (regnum++, (val << 8));
1133 }
1134 }
1135 else
1136 {
7a292a7a 1137 /* arg will go onto stack */
c5aa993b 1138 regnum = ARGN_REGNUM + 1;
7a292a7a 1139 si = push_stack_item (si, contents, len);
c906108c
SS
1140 }
1141 }
1142 }
7a292a7a
SS
1143
1144 while (si)
1145 {
1146 sp = (sp - si->len) & ~1;
1147 write_memory (sp, si->data, si->len);
1148 si = pop_stack_item (si);
1149 }
c5aa993b 1150
c906108c
SS
1151 return sp;
1152}
1153
1154
1155/* Given a return value in `regbuf' with a type `valtype',
1156 extract and copy its value into `valbuf'. */
1157
1158void
1159d10v_extract_return_value (type, regbuf, valbuf)
1160 struct type *type;
1161 char regbuf[REGISTER_BYTES];
1162 char *valbuf;
1163{
1164 int len;
1165 /* printf("RET: TYPE=%d len=%d r%d=0x%x\n",type->code, TYPE_LENGTH (type), RET1_REGNUM - R0_REGNUM, (int) extract_unsigned_integer (regbuf + REGISTER_BYTE(RET1_REGNUM), REGISTER_RAW_SIZE (RET1_REGNUM))); */
1166 if (TYPE_CODE (type) == TYPE_CODE_PTR
1167 && TYPE_TARGET_TYPE (type)
1168 && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC))
1169 {
1170 /* pointer to function */
1171 int num;
1172 short snum;
1173 snum = extract_address (regbuf + REGISTER_BYTE (RET1_REGNUM), REGISTER_RAW_SIZE (RET1_REGNUM));
c5aa993b 1174 store_address (valbuf, 4, D10V_MAKE_IADDR (snum));
c906108c 1175 }
c5aa993b 1176 else if (TYPE_CODE (type) == TYPE_CODE_PTR)
c906108c
SS
1177 {
1178 /* pointer to data */
1179 int num;
1180 short snum;
1181 snum = extract_address (regbuf + REGISTER_BYTE (RET1_REGNUM), REGISTER_RAW_SIZE (RET1_REGNUM));
c5aa993b 1182 store_address (valbuf, 4, D10V_MAKE_DADDR (snum));
c906108c
SS
1183 }
1184 else
1185 {
1186 len = TYPE_LENGTH (type);
1187 if (len == 1)
1188 {
1189 unsigned short c = extract_unsigned_integer (regbuf + REGISTER_BYTE (RET1_REGNUM), REGISTER_RAW_SIZE (RET1_REGNUM));
1190 store_unsigned_integer (valbuf, 1, c);
1191 }
1192 else if ((len & 1) == 0)
1193 memcpy (valbuf, regbuf + REGISTER_BYTE (RET1_REGNUM), len);
1194 else
1195 {
1196 /* For return values of odd size, the first byte is in the
c5aa993b
JM
1197 least significant part of the first register. The
1198 remaining bytes in remaining registers. Interestingly,
1199 when such values are passed in, the last byte is in the
1200 most significant byte of that same register - wierd. */
c906108c
SS
1201 memcpy (valbuf, regbuf + REGISTER_BYTE (RET1_REGNUM) + 1, len);
1202 }
1203 }
1204}
1205
c2c6d25f
JM
1206/* Translate a GDB virtual ADDR/LEN into a format the remote target
1207 understands. Returns number of bytes that can be transfered
4ce44c66
JM
1208 starting at TARG_ADDR. Return ZERO if no bytes can be transfered
1209 (segmentation fault). Since the simulator knows all about how the
1210 VM system works, we just call that to do the translation. */
c2c6d25f 1211
4ce44c66 1212static void
c2c6d25f
JM
1213remote_d10v_translate_xfer_address (CORE_ADDR memaddr, int nr_bytes,
1214 CORE_ADDR *targ_addr, int *targ_len)
1215{
4ce44c66
JM
1216 long out_addr;
1217 long out_len;
1218 out_len = sim_d10v_translate_addr (memaddr, nr_bytes,
1219 &out_addr,
1220 d10v_dmap_register,
1221 d10v_imap_register);
1222 *targ_addr = out_addr;
1223 *targ_len = out_len;
c2c6d25f
JM
1224}
1225
4ce44c66 1226
c906108c
SS
1227/* The following code implements access to, and display of, the D10V's
1228 instruction trace buffer. The buffer consists of 64K or more
1229 4-byte words of data, of which each words includes an 8-bit count,
1230 an 8-bit segment number, and a 16-bit instruction address.
1231
1232 In theory, the trace buffer is continuously capturing instruction
1233 data that the CPU presents on its "debug bus", but in practice, the
1234 ROMified GDB stub only enables tracing when it continues or steps
1235 the program, and stops tracing when the program stops; so it
1236 actually works for GDB to read the buffer counter out of memory and
1237 then read each trace word. The counter records where the tracing
1238 stops, but there is no record of where it started, so we remember
1239 the PC when we resumed and then search backwards in the trace
1240 buffer for a word that includes that address. This is not perfect,
1241 because you will miss trace data if the resumption PC is the target
1242 of a branch. (The value of the buffer counter is semi-random, any
1243 trace data from a previous program stop is gone.) */
1244
1245/* The address of the last word recorded in the trace buffer. */
1246
1247#define DBBC_ADDR (0xd80000)
1248
1249/* The base of the trace buffer, at least for the "Board_0". */
1250
1251#define TRACE_BUFFER_BASE (0xf40000)
1252
a14ed312 1253static void trace_command (char *, int);
c906108c 1254
a14ed312 1255static void untrace_command (char *, int);
c906108c 1256
a14ed312 1257static void trace_info (char *, int);
c906108c 1258
a14ed312 1259static void tdisassemble_command (char *, int);
c906108c 1260
a14ed312 1261static void display_trace (int, int);
c906108c
SS
1262
1263/* True when instruction traces are being collected. */
1264
1265static int tracing;
1266
1267/* Remembered PC. */
1268
1269static CORE_ADDR last_pc;
1270
1271/* True when trace output should be displayed whenever program stops. */
1272
1273static int trace_display;
1274
1275/* True when trace listing should include source lines. */
1276
1277static int default_trace_show_source = 1;
1278
c5aa993b
JM
1279struct trace_buffer
1280 {
1281 int size;
1282 short *counts;
1283 CORE_ADDR *addrs;
1284 }
1285trace_data;
c906108c
SS
1286
1287static void
1288trace_command (args, from_tty)
1289 char *args;
1290 int from_tty;
1291{
1292 /* Clear the host-side trace buffer, allocating space if needed. */
1293 trace_data.size = 0;
1294 if (trace_data.counts == NULL)
c5aa993b 1295 trace_data.counts = (short *) xmalloc (65536 * sizeof (short));
c906108c 1296 if (trace_data.addrs == NULL)
c5aa993b 1297 trace_data.addrs = (CORE_ADDR *) xmalloc (65536 * sizeof (CORE_ADDR));
c906108c
SS
1298
1299 tracing = 1;
1300
1301 printf_filtered ("Tracing is now on.\n");
1302}
1303
1304static void
1305untrace_command (args, from_tty)
1306 char *args;
1307 int from_tty;
1308{
1309 tracing = 0;
1310
1311 printf_filtered ("Tracing is now off.\n");
1312}
1313
1314static void
1315trace_info (args, from_tty)
1316 char *args;
1317 int from_tty;
1318{
1319 int i;
1320
1321 if (trace_data.size)
1322 {
1323 printf_filtered ("%d entries in trace buffer:\n", trace_data.size);
1324
1325 for (i = 0; i < trace_data.size; ++i)
1326 {
d4f3574e
SS
1327 printf_filtered ("%d: %d instruction%s at 0x%s\n",
1328 i,
1329 trace_data.counts[i],
c906108c 1330 (trace_data.counts[i] == 1 ? "" : "s"),
d4f3574e 1331 paddr_nz (trace_data.addrs[i]));
c906108c
SS
1332 }
1333 }
1334 else
1335 printf_filtered ("No entries in trace buffer.\n");
1336
1337 printf_filtered ("Tracing is currently %s.\n", (tracing ? "on" : "off"));
1338}
1339
1340/* Print the instruction at address MEMADDR in debugged memory,
1341 on STREAM. Returns length of the instruction, in bytes. */
1342
1343static int
1344print_insn (memaddr, stream)
1345 CORE_ADDR memaddr;
d9fcf2fb 1346 struct ui_file *stream;
c906108c
SS
1347{
1348 /* If there's no disassembler, something is very wrong. */
1349 if (tm_print_insn == NULL)
11cf8741 1350 internal_error ("print_insn: no disassembler");
c906108c
SS
1351
1352 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1353 tm_print_insn_info.endian = BFD_ENDIAN_BIG;
1354 else
1355 tm_print_insn_info.endian = BFD_ENDIAN_LITTLE;
1356 return (*tm_print_insn) (memaddr, &tm_print_insn_info);
1357}
1358
392a587b 1359static void
c906108c
SS
1360d10v_eva_prepare_to_trace ()
1361{
1362 if (!tracing)
1363 return;
1364
1365 last_pc = read_register (PC_REGNUM);
1366}
1367
1368/* Collect trace data from the target board and format it into a form
1369 more useful for display. */
1370
392a587b 1371static void
c906108c
SS
1372d10v_eva_get_trace_data ()
1373{
1374 int count, i, j, oldsize;
1375 int trace_addr, trace_seg, trace_cnt, next_cnt;
1376 unsigned int last_trace, trace_word, next_word;
1377 unsigned int *tmpspace;
1378
1379 if (!tracing)
1380 return;
1381
c5aa993b 1382 tmpspace = xmalloc (65536 * sizeof (unsigned int));
c906108c
SS
1383
1384 last_trace = read_memory_unsigned_integer (DBBC_ADDR, 2) << 2;
1385
1386 /* Collect buffer contents from the target, stopping when we reach
1387 the word recorded when execution resumed. */
1388
1389 count = 0;
1390 while (last_trace > 0)
1391 {
1392 QUIT;
1393 trace_word =
1394 read_memory_unsigned_integer (TRACE_BUFFER_BASE + last_trace, 4);
1395 trace_addr = trace_word & 0xffff;
1396 last_trace -= 4;
1397 /* Ignore an apparently nonsensical entry. */
1398 if (trace_addr == 0xffd5)
1399 continue;
1400 tmpspace[count++] = trace_word;
1401 if (trace_addr == last_pc)
1402 break;
1403 if (count > 65535)
1404 break;
1405 }
1406
1407 /* Move the data to the host-side trace buffer, adjusting counts to
1408 include the last instruction executed and transforming the address
1409 into something that GDB likes. */
1410
1411 for (i = 0; i < count; ++i)
1412 {
1413 trace_word = tmpspace[i];
1414 next_word = ((i == 0) ? 0 : tmpspace[i - 1]);
1415 trace_addr = trace_word & 0xffff;
1416 next_cnt = (next_word >> 24) & 0xff;
1417 j = trace_data.size + count - i - 1;
1418 trace_data.addrs[j] = (trace_addr << 2) + 0x1000000;
1419 trace_data.counts[j] = next_cnt + 1;
1420 }
1421
1422 oldsize = trace_data.size;
1423 trace_data.size += count;
1424
1425 free (tmpspace);
1426
1427 if (trace_display)
1428 display_trace (oldsize, trace_data.size);
1429}
1430
1431static void
1432tdisassemble_command (arg, from_tty)
1433 char *arg;
1434 int from_tty;
1435{
1436 int i, count;
1437 CORE_ADDR low, high;
1438 char *space_index;
1439
1440 if (!arg)
1441 {
1442 low = 0;
1443 high = trace_data.size;
1444 }
1445 else if (!(space_index = (char *) strchr (arg, ' ')))
1446 {
1447 low = parse_and_eval_address (arg);
1448 high = low + 5;
1449 }
1450 else
1451 {
1452 /* Two arguments. */
1453 *space_index = '\0';
1454 low = parse_and_eval_address (arg);
1455 high = parse_and_eval_address (space_index + 1);
1456 if (high < low)
1457 high = low;
1458 }
1459
d4f3574e 1460 printf_filtered ("Dump of trace from %s to %s:\n", paddr_u (low), paddr_u (high));
c906108c
SS
1461
1462 display_trace (low, high);
1463
1464 printf_filtered ("End of trace dump.\n");
1465 gdb_flush (gdb_stdout);
1466}
1467
1468static void
1469display_trace (low, high)
1470 int low, high;
1471{
1472 int i, count, trace_show_source, first, suppress;
1473 CORE_ADDR next_address;
1474
1475 trace_show_source = default_trace_show_source;
c5aa993b 1476 if (!have_full_symbols () && !have_partial_symbols ())
c906108c
SS
1477 {
1478 trace_show_source = 0;
1479 printf_filtered ("No symbol table is loaded. Use the \"file\" command.\n");
1480 printf_filtered ("Trace will not display any source.\n");
1481 }
1482
1483 first = 1;
1484 suppress = 0;
1485 for (i = low; i < high; ++i)
1486 {
1487 next_address = trace_data.addrs[i];
c5aa993b 1488 count = trace_data.counts[i];
c906108c
SS
1489 while (count-- > 0)
1490 {
1491 QUIT;
1492 if (trace_show_source)
1493 {
1494 struct symtab_and_line sal, sal_prev;
1495
1496 sal_prev = find_pc_line (next_address - 4, 0);
1497 sal = find_pc_line (next_address, 0);
1498
1499 if (sal.symtab)
1500 {
1501 if (first || sal.line != sal_prev.line)
1502 print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
1503 suppress = 0;
1504 }
1505 else
1506 {
1507 if (!suppress)
1508 /* FIXME-32x64--assumes sal.pc fits in long. */
1509 printf_filtered ("No source file for address %s.\n",
c5aa993b 1510 local_hex_string ((unsigned long) sal.pc));
c906108c
SS
1511 suppress = 1;
1512 }
1513 }
1514 first = 0;
1515 print_address (next_address, gdb_stdout);
1516 printf_filtered (":");
1517 printf_filtered ("\t");
1518 wrap_here (" ");
1519 next_address = next_address + print_insn (next_address, gdb_stdout);
1520 printf_filtered ("\n");
1521 gdb_flush (gdb_stdout);
1522 }
1523 }
1524}
1525
ac9a91a7 1526
0f71a2f6 1527static gdbarch_init_ftype d10v_gdbarch_init;
4ce44c66 1528
0f71a2f6
JM
1529static struct gdbarch *
1530d10v_gdbarch_init (info, arches)
1531 struct gdbarch_info info;
1532 struct gdbarch_list *arches;
1533{
c5aa993b
JM
1534 static LONGEST d10v_call_dummy_words[] =
1535 {0};
0f71a2f6 1536 struct gdbarch *gdbarch;
4ce44c66
JM
1537 int d10v_num_regs;
1538 struct gdbarch_tdep *tdep;
1539 gdbarch_register_name_ftype *d10v_register_name;
0f71a2f6 1540
4ce44c66
JM
1541 /* Find a candidate among the list of pre-declared architectures. */
1542 arches = gdbarch_list_lookup_by_info (arches, &info);
0f71a2f6
JM
1543 if (arches != NULL)
1544 return arches->gdbarch;
4ce44c66
JM
1545
1546 /* None found, create a new architecture from the information
1547 provided. */
1548 tdep = XMALLOC (struct gdbarch_tdep);
1549 gdbarch = gdbarch_alloc (&info, tdep);
1550
1551 switch (info.bfd_arch_info->mach)
1552 {
1553 case bfd_mach_d10v_ts2:
1554 d10v_num_regs = 37;
1555 d10v_register_name = d10v_ts2_register_name;
1556 tdep->a0_regnum = TS2_A0_REGNUM;
1557 tdep->nr_dmap_regs = TS2_NR_DMAP_REGS;
1558 tdep->register_sim_regno = d10v_ts2_register_sim_regno;
1559 tdep->dmap_register = d10v_ts2_dmap_register;
1560 tdep->imap_register = d10v_ts2_imap_register;
1561 break;
1562 default:
1563 case bfd_mach_d10v_ts3:
1564 d10v_num_regs = 42;
1565 d10v_register_name = d10v_ts3_register_name;
1566 tdep->a0_regnum = TS3_A0_REGNUM;
1567 tdep->nr_dmap_regs = TS3_NR_DMAP_REGS;
1568 tdep->register_sim_regno = d10v_ts3_register_sim_regno;
1569 tdep->dmap_register = d10v_ts3_dmap_register;
1570 tdep->imap_register = d10v_ts3_imap_register;
1571 break;
1572 }
0f71a2f6
JM
1573
1574 set_gdbarch_read_pc (gdbarch, d10v_read_pc);
1575 set_gdbarch_write_pc (gdbarch, d10v_write_pc);
1576 set_gdbarch_read_fp (gdbarch, d10v_read_fp);
1577 set_gdbarch_write_fp (gdbarch, d10v_write_fp);
1578 set_gdbarch_read_sp (gdbarch, d10v_read_sp);
1579 set_gdbarch_write_sp (gdbarch, d10v_write_sp);
1580
1581 set_gdbarch_num_regs (gdbarch, d10v_num_regs);
1582 set_gdbarch_sp_regnum (gdbarch, 15);
1583 set_gdbarch_fp_regnum (gdbarch, 11);
1584 set_gdbarch_pc_regnum (gdbarch, 18);
1585 set_gdbarch_register_name (gdbarch, d10v_register_name);
1586 set_gdbarch_register_size (gdbarch, 2);
1587 set_gdbarch_register_bytes (gdbarch, (d10v_num_regs - 2) * 2 + 16);
1588 set_gdbarch_register_byte (gdbarch, d10v_register_byte);
1589 set_gdbarch_register_raw_size (gdbarch, d10v_register_raw_size);
1590 set_gdbarch_max_register_raw_size (gdbarch, 8);
1591 set_gdbarch_register_virtual_size (gdbarch, d10v_register_virtual_size);
1592 set_gdbarch_max_register_virtual_size (gdbarch, 8);
1593 set_gdbarch_register_virtual_type (gdbarch, d10v_register_virtual_type);
1594
1595 set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1596 set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
1597 set_gdbarch_int_bit (gdbarch, 2 * TARGET_CHAR_BIT);
1598 set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1599 set_gdbarch_long_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
f0d4cc9e
AC
1600 /* NOTE: The d10v as a 32 bit ``float'' and ``double''. ``long
1601 double'' is 64 bits. */
0f71a2f6
JM
1602 set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1603 set_gdbarch_double_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1604 set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
f0d4cc9e
AC
1605 switch (info.byte_order)
1606 {
1607 case BIG_ENDIAN:
1608 set_gdbarch_float_format (gdbarch, &floatformat_ieee_single_big);
1609 set_gdbarch_double_format (gdbarch, &floatformat_ieee_single_big);
1610 set_gdbarch_long_double_format (gdbarch, &floatformat_ieee_double_big);
1611 break;
1612 case LITTLE_ENDIAN:
1613 set_gdbarch_float_format (gdbarch, &floatformat_ieee_single_little);
1614 set_gdbarch_double_format (gdbarch, &floatformat_ieee_single_little);
1615 set_gdbarch_long_double_format (gdbarch, &floatformat_ieee_double_little);
1616 break;
1617 default:
1618 internal_error ("d10v_gdbarch_init: bad byte order for float format");
1619 }
0f71a2f6
JM
1620
1621 set_gdbarch_use_generic_dummy_frames (gdbarch, 1);
1622 set_gdbarch_call_dummy_length (gdbarch, 0);
1623 set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
1624 set_gdbarch_call_dummy_address (gdbarch, entry_point_address);
1625 set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1);
1626 set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
1627 set_gdbarch_call_dummy_start_offset (gdbarch, 0);
1628 set_gdbarch_pc_in_call_dummy (gdbarch, generic_pc_in_call_dummy);
1629 set_gdbarch_call_dummy_words (gdbarch, d10v_call_dummy_words);
1630 set_gdbarch_sizeof_call_dummy_words (gdbarch, sizeof (d10v_call_dummy_words));
1631 set_gdbarch_call_dummy_p (gdbarch, 1);
1632 set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0);
1633 set_gdbarch_get_saved_register (gdbarch, generic_get_saved_register);
1634 set_gdbarch_fix_call_dummy (gdbarch, generic_fix_call_dummy);
1635
1636 set_gdbarch_register_convertible (gdbarch, d10v_register_convertible);
1637 set_gdbarch_register_convert_to_virtual (gdbarch, d10v_register_convert_to_virtual);
1638 set_gdbarch_register_convert_to_raw (gdbarch, d10v_register_convert_to_raw);
1639
1640 set_gdbarch_extract_return_value (gdbarch, d10v_extract_return_value);
1641 set_gdbarch_push_arguments (gdbarch, d10v_push_arguments);
1642 set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame);
1643 set_gdbarch_push_return_address (gdbarch, d10v_push_return_address);
1644
1645 set_gdbarch_d10v_make_daddr (gdbarch, d10v_make_daddr);
1646 set_gdbarch_d10v_make_iaddr (gdbarch, d10v_make_iaddr);
1647 set_gdbarch_d10v_daddr_p (gdbarch, d10v_daddr_p);
1648 set_gdbarch_d10v_iaddr_p (gdbarch, d10v_iaddr_p);
1649 set_gdbarch_d10v_convert_daddr_to_raw (gdbarch, d10v_convert_daddr_to_raw);
1650 set_gdbarch_d10v_convert_iaddr_to_raw (gdbarch, d10v_convert_iaddr_to_raw);
1651
1652 set_gdbarch_store_struct_return (gdbarch, d10v_store_struct_return);
1653 set_gdbarch_store_return_value (gdbarch, d10v_store_return_value);
1654 set_gdbarch_extract_struct_value_address (gdbarch, d10v_extract_struct_value_address);
1655 set_gdbarch_use_struct_convention (gdbarch, d10v_use_struct_convention);
1656
1657 set_gdbarch_frame_init_saved_regs (gdbarch, d10v_frame_init_saved_regs);
1658 set_gdbarch_init_extra_frame_info (gdbarch, d10v_init_extra_frame_info);
1659
1660 set_gdbarch_pop_frame (gdbarch, d10v_pop_frame);
1661
1662 set_gdbarch_skip_prologue (gdbarch, d10v_skip_prologue);
1663 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1664 set_gdbarch_decr_pc_after_break (gdbarch, 4);
1665 set_gdbarch_function_start_offset (gdbarch, 0);
1666 set_gdbarch_breakpoint_from_pc (gdbarch, d10v_breakpoint_from_pc);
1667
1668 set_gdbarch_remote_translate_xfer_address (gdbarch, remote_d10v_translate_xfer_address);
1669
1670 set_gdbarch_frame_args_skip (gdbarch, 0);
1671 set_gdbarch_frameless_function_invocation (gdbarch, frameless_look_for_prologue);
1672 set_gdbarch_frame_chain (gdbarch, d10v_frame_chain);
1673 set_gdbarch_frame_chain_valid (gdbarch, d10v_frame_chain_valid);
1674 set_gdbarch_frame_saved_pc (gdbarch, d10v_frame_saved_pc);
1675 set_gdbarch_frame_args_address (gdbarch, d10v_frame_args_address);
1676 set_gdbarch_frame_locals_address (gdbarch, d10v_frame_locals_address);
1677 set_gdbarch_saved_pc_after_call (gdbarch, d10v_saved_pc_after_call);
1678 set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
23964bcd 1679 set_gdbarch_stack_align (gdbarch, d10v_stack_align);
0f71a2f6
JM
1680
1681 return gdbarch;
1682}
1683
1684
507f3c78
KB
1685extern void (*target_resume_hook) (void);
1686extern void (*target_wait_loop_hook) (void);
c906108c
SS
1687
1688void
1689_initialize_d10v_tdep ()
1690{
0f71a2f6
JM
1691 register_gdbarch_init (bfd_arch_d10v, d10v_gdbarch_init);
1692
c906108c
SS
1693 tm_print_insn = print_insn_d10v;
1694
1695 target_resume_hook = d10v_eva_prepare_to_trace;
1696 target_wait_loop_hook = d10v_eva_get_trace_data;
1697
1698 add_com ("regs", class_vars, show_regs, "Print all registers");
1699
cff3e48b 1700 add_com ("itrace", class_support, trace_command,
c906108c
SS
1701 "Enable tracing of instruction execution.");
1702
cff3e48b 1703 add_com ("iuntrace", class_support, untrace_command,
c906108c
SS
1704 "Disable tracing of instruction execution.");
1705
cff3e48b 1706 add_com ("itdisassemble", class_vars, tdisassemble_command,
c906108c
SS
1707 "Disassemble the trace buffer.\n\
1708Two optional arguments specify a range of trace buffer entries\n\
1709as reported by info trace (NOT addresses!).");
1710
cff3e48b 1711 add_info ("itrace", trace_info,
c906108c
SS
1712 "Display info about the trace data buffer.");
1713
cff3e48b 1714 add_show_from_set (add_set_cmd ("itracedisplay", no_class,
c5aa993b
JM
1715 var_integer, (char *) &trace_display,
1716 "Set automatic display of trace.\n", &setlist),
c906108c 1717 &showlist);
cff3e48b 1718 add_show_from_set (add_set_cmd ("itracesource", no_class,
c5aa993b
JM
1719 var_integer, (char *) &default_trace_show_source,
1720 "Set display of source code with trace.\n", &setlist),
c906108c
SS
1721 &showlist);
1722
c5aa993b 1723}
This page took 0.184908 seconds and 4 git commands to generate.