* Sanitization fixes to retain new files.
[binutils-gdb.git] / gdb / d10v-tdep.c
blobf4b52f62295bb13dd6115dacbffad9fb195c1e21
1 /* Target-dependent code for Mitsubishi D10V, for GDB.
2 Copyright (C) 1996, 1997 Free Software Foundation, Inc.
4 This file is part of GDB.
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.
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.
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, Boston, MA 02111-1307, USA. */
20 /* Contributed by Martin Hunt, hunt@cygnus.com */
22 #include "defs.h"
23 #include "frame.h"
24 #include "obstack.h"
25 #include "symtab.h"
26 #include "gdbtypes.h"
27 #include "gdbcmd.h"
28 #include "gdbcore.h"
29 #include "gdb_string.h"
30 #include "value.h"
31 #include "inferior.h"
32 #include "dis-asm.h"
33 #include "symfile.h"
34 #include "objfiles.h"
36 void d10v_frame_find_saved_regs PARAMS ((struct frame_info *fi,
37 struct frame_saved_regs *fsr));
39 int
40 d10v_frame_chain_valid (chain, frame)
41 CORE_ADDR chain;
42 struct frame_info *frame; /* not used here */
44 return ((chain) != 0 && (frame) != 0 && (frame)->pc > IMEM_START);
48 /* Should we use EXTRACT_STRUCT_VALUE_ADDRESS instead of
49 EXTRACT_RETURN_VALUE? GCC_P is true if compiled with gcc
50 and TYPE is the type (which is known to be struct, union or array).
52 The d10v returns anything less than 8 bytes in size in
53 registers. */
55 int
56 d10v_use_struct_convention (gcc_p, type)
57 int gcc_p;
58 struct type *type;
60 return (TYPE_LENGTH (type) > 8);
64 /* Discard from the stack the innermost frame, restoring all saved
65 registers. */
67 void
68 d10v_pop_frame (frame)
69 struct frame_info *frame;
71 CORE_ADDR fp;
72 int regnum;
73 struct frame_saved_regs fsr;
74 char raw_buffer[8];
76 fp = FRAME_FP (frame);
77 /* fill out fsr with the address of where each */
78 /* register was stored in the frame */
79 get_frame_saved_regs (frame, &fsr);
81 /* now update the current registers with the old values */
82 for (regnum = A0_REGNUM; regnum < A0_REGNUM+2 ; regnum++)
84 if (fsr.regs[regnum])
86 read_memory (fsr.regs[regnum], raw_buffer, REGISTER_RAW_SIZE(regnum));
87 write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, REGISTER_RAW_SIZE(regnum));
90 for (regnum = 0; regnum < SP_REGNUM; regnum++)
92 if (fsr.regs[regnum])
94 write_register (regnum, read_memory_unsigned_integer (fsr.regs[regnum], REGISTER_RAW_SIZE(regnum)));
97 if (fsr.regs[PSW_REGNUM])
99 write_register (PSW_REGNUM, read_memory_unsigned_integer (fsr.regs[PSW_REGNUM], REGISTER_RAW_SIZE(PSW_REGNUM)));
102 write_register (PC_REGNUM, read_register (LR_REGNUM));
103 write_register (SP_REGNUM, fp + frame->size);
104 target_store_registers (-1);
105 flush_cached_frames ();
108 static int
109 check_prologue (op)
110 unsigned short op;
112 /* st rn, @-sp */
113 if ((op & 0x7E1F) == 0x6C1F)
114 return 1;
116 /* st2w rn, @-sp */
117 if ((op & 0x7E3F) == 0x6E1F)
118 return 1;
120 /* subi sp, n */
121 if ((op & 0x7FE1) == 0x01E1)
122 return 1;
124 /* mv r11, sp */
125 if (op == 0x417E)
126 return 1;
128 /* nop */
129 if (op == 0x5E00)
130 return 1;
132 /* st rn, @sp */
133 if ((op & 0x7E1F) == 0x681E)
134 return 1;
136 /* st2w rn, @sp */
137 if ((op & 0x7E3F) == 0x3A1E)
138 return 1;
140 return 0;
143 CORE_ADDR
144 d10v_skip_prologue (pc)
145 CORE_ADDR pc;
147 unsigned long op;
148 unsigned short op1, op2;
149 CORE_ADDR func_addr, func_end;
150 struct symtab_and_line sal;
152 /* If we have line debugging information, then the end of the */
153 /* prologue should the first assembly instruction of the first source line */
154 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
156 sal = find_pc_line (func_addr, 0);
157 if ( sal.end && sal.end < func_end)
158 return sal.end;
161 if (target_read_memory (pc, (char *)&op, 4))
162 return pc; /* Can't access it -- assume no prologue. */
164 while (1)
166 op = (unsigned long)read_memory_integer (pc, 4);
167 if ((op & 0xC0000000) == 0xC0000000)
169 /* long instruction */
170 if ( ((op & 0x3FFF0000) != 0x01FF0000) && /* add3 sp,sp,n */
171 ((op & 0x3F0F0000) != 0x340F0000) && /* st rn, @(offset,sp) */
172 ((op & 0x3F1F0000) != 0x350F0000)) /* st2w rn, @(offset,sp) */
173 break;
175 else
177 /* short instructions */
178 if ((op & 0xC0000000) == 0x80000000)
180 op2 = (op & 0x3FFF8000) >> 15;
181 op1 = op & 0x7FFF;
183 else
185 op1 = (op & 0x3FFF8000) >> 15;
186 op2 = op & 0x7FFF;
188 if (check_prologue(op1))
190 if (!check_prologue(op2))
192 /* if the previous opcode was really part of the prologue */
193 /* and not just a NOP, then we want to break after both instructions */
194 if (op1 != 0x5E00)
195 pc += 4;
196 break;
199 else
200 break;
202 pc += 4;
204 return pc;
207 /* Given a GDB frame, determine the address of the calling function's frame.
208 This will be used to create a new GDB frame struct, and then
209 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
212 CORE_ADDR
213 d10v_frame_chain (frame)
214 struct frame_info *frame;
216 struct frame_saved_regs fsr;
218 d10v_frame_find_saved_regs (frame, &fsr);
220 if (frame->return_pc == IMEM_START || inside_entry_file(frame->return_pc))
221 return (CORE_ADDR)0;
223 if (!fsr.regs[FP_REGNUM])
225 if (!fsr.regs[SP_REGNUM] || fsr.regs[SP_REGNUM] == STACK_START)
226 return (CORE_ADDR)0;
228 return fsr.regs[SP_REGNUM];
231 if (!read_memory_unsigned_integer(fsr.regs[FP_REGNUM], REGISTER_RAW_SIZE(FP_REGNUM)))
232 return (CORE_ADDR)0;
234 return D10V_MAKE_DADDR (read_memory_unsigned_integer (fsr.regs[FP_REGNUM], REGISTER_RAW_SIZE (FP_REGNUM)));
237 static int next_addr, uses_frame;
239 static int
240 prologue_find_regs (op, fsr, addr)
241 unsigned short op;
242 struct frame_saved_regs *fsr;
243 CORE_ADDR addr;
245 int n;
247 /* st rn, @-sp */
248 if ((op & 0x7E1F) == 0x6C1F)
250 n = (op & 0x1E0) >> 5;
251 next_addr -= 2;
252 fsr->regs[n] = next_addr;
253 return 1;
256 /* st2w rn, @-sp */
257 else if ((op & 0x7E3F) == 0x6E1F)
259 n = (op & 0x1E0) >> 5;
260 next_addr -= 4;
261 fsr->regs[n] = next_addr;
262 fsr->regs[n+1] = next_addr+2;
263 return 1;
266 /* subi sp, n */
267 if ((op & 0x7FE1) == 0x01E1)
269 n = (op & 0x1E) >> 1;
270 if (n == 0)
271 n = 16;
272 next_addr -= n;
273 return 1;
276 /* mv r11, sp */
277 if (op == 0x417E)
279 uses_frame = 1;
280 return 1;
283 /* nop */
284 if (op == 0x5E00)
285 return 1;
287 /* st rn, @sp */
288 if ((op & 0x7E1F) == 0x681E)
290 n = (op & 0x1E0) >> 5;
291 fsr->regs[n] = next_addr;
292 return 1;
295 /* st2w rn, @sp */
296 if ((op & 0x7E3F) == 0x3A1E)
298 n = (op & 0x1E0) >> 5;
299 fsr->regs[n] = next_addr;
300 fsr->regs[n+1] = next_addr+2;
301 return 1;
304 return 0;
307 /* Put here the code to store, into a struct frame_saved_regs, the
308 addresses of the saved registers of frame described by FRAME_INFO.
309 This includes special registers such as pc and fp saved in special
310 ways in the stack frame. sp is even more special: the address we
311 return for it IS the sp for the next frame. */
312 void
313 d10v_frame_find_saved_regs (fi, fsr)
314 struct frame_info *fi;
315 struct frame_saved_regs *fsr;
317 CORE_ADDR fp, pc;
318 unsigned long op;
319 unsigned short op1, op2;
320 int i;
322 fp = fi->frame;
323 memset (fsr, 0, sizeof (*fsr));
324 next_addr = 0;
326 pc = get_pc_function_start (fi->pc);
328 uses_frame = 0;
329 while (1)
331 op = (unsigned long)read_memory_integer (pc, 4);
332 if ((op & 0xC0000000) == 0xC0000000)
334 /* long instruction */
335 if ((op & 0x3FFF0000) == 0x01FF0000)
337 /* add3 sp,sp,n */
338 short n = op & 0xFFFF;
339 next_addr += n;
341 else if ((op & 0x3F0F0000) == 0x340F0000)
343 /* st rn, @(offset,sp) */
344 short offset = op & 0xFFFF;
345 short n = (op >> 20) & 0xF;
346 fsr->regs[n] = next_addr + offset;
348 else if ((op & 0x3F1F0000) == 0x350F0000)
350 /* st2w rn, @(offset,sp) */
351 short offset = op & 0xFFFF;
352 short n = (op >> 20) & 0xF;
353 fsr->regs[n] = next_addr + offset;
354 fsr->regs[n+1] = next_addr + offset + 2;
356 else
357 break;
359 else
361 /* short instructions */
362 if ((op & 0xC0000000) == 0x80000000)
364 op2 = (op & 0x3FFF8000) >> 15;
365 op1 = op & 0x7FFF;
367 else
369 op1 = (op & 0x3FFF8000) >> 15;
370 op2 = op & 0x7FFF;
372 if (!prologue_find_regs(op1,fsr,pc) || !prologue_find_regs(op2,fsr,pc))
373 break;
375 pc += 4;
378 fi->size = -next_addr;
380 if (!(fp & 0xffff))
381 fp = D10V_MAKE_DADDR (read_register(SP_REGNUM));
383 for (i=0; i<NUM_REGS-1; i++)
384 if (fsr->regs[i])
386 fsr->regs[i] = fp - (next_addr - fsr->regs[i]);
389 if (fsr->regs[LR_REGNUM])
391 CORE_ADDR return_pc = read_memory_unsigned_integer (fsr->regs[LR_REGNUM], REGISTER_RAW_SIZE (LR_REGNUM));
392 fi->return_pc = D10V_MAKE_IADDR (return_pc);
394 else
396 fi->return_pc = D10V_MAKE_IADDR (read_register(LR_REGNUM));
399 /* th SP is not normally (ever?) saved, but check anyway */
400 if (!fsr->regs[SP_REGNUM])
402 /* if the FP was saved, that means the current FP is valid, */
403 /* otherwise, it isn't being used, so we use the SP instead */
404 if (uses_frame)
405 fsr->regs[SP_REGNUM] = read_register(FP_REGNUM) + fi->size;
406 else
408 fsr->regs[SP_REGNUM] = fp + fi->size;
409 fi->frameless = 1;
410 fsr->regs[FP_REGNUM] = 0;
415 void
416 d10v_init_extra_frame_info (fromleaf, fi)
417 int fromleaf;
418 struct frame_info *fi;
420 fi->frameless = 0;
421 fi->size = 0;
422 fi->return_pc = 0;
424 /* The call dummy doesn't save any registers on the stack, so we can
425 return now. */
426 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
428 return;
430 else
432 struct frame_saved_regs dummy;
433 d10v_frame_find_saved_regs (fi, &dummy);
437 static void
438 show_regs (args, from_tty)
439 char *args;
440 int from_tty;
442 int a;
443 printf_filtered ("PC=%04x (0x%x) PSW=%04x RPT_S=%04x RPT_E=%04x RPT_C=%04x\n",
444 read_register (PC_REGNUM), D10V_MAKE_IADDR (read_register (PC_REGNUM)),
445 read_register (PSW_REGNUM),
446 read_register (24),
447 read_register (25),
448 read_register (23));
449 printf_filtered ("R0-R7 %04x %04x %04x %04x %04x %04x %04x %04x\n",
450 read_register (0),
451 read_register (1),
452 read_register (2),
453 read_register (3),
454 read_register (4),
455 read_register (5),
456 read_register (6),
457 read_register (7));
458 printf_filtered ("R8-R15 %04x %04x %04x %04x %04x %04x %04x %04x\n",
459 read_register (8),
460 read_register (9),
461 read_register (10),
462 read_register (11),
463 read_register (12),
464 read_register (13),
465 read_register (14),
466 read_register (15));
467 printf_filtered ("IMAP0 %04x IMAP1 %04x DMAP %04x\n",
468 read_register (IMAP0_REGNUM),
469 read_register (IMAP1_REGNUM),
470 read_register (DMAP_REGNUM));
471 printf_filtered ("A0-A1");
472 for (a = A0_REGNUM; a <= A0_REGNUM + 1; a++)
474 char num[MAX_REGISTER_RAW_SIZE];
475 int i;
476 printf_filtered (" ");
477 read_register_gen (a, (char *)&num);
478 for (i = 0; i < MAX_REGISTER_RAW_SIZE; i++)
480 printf_filtered ("%02x", (num[i] & 0xff));
483 printf_filtered ("\n");
486 CORE_ADDR
487 d10v_read_pc (pid)
488 int pid;
490 int save_pid;
491 CORE_ADDR pc;
492 CORE_ADDR retval;
494 save_pid = inferior_pid;
495 inferior_pid = pid;
496 pc = (int) read_register (PC_REGNUM);
497 inferior_pid = save_pid;
498 retval = D10V_MAKE_IADDR (pc);
499 return retval;
502 void
503 d10v_write_pc (val, pid)
504 CORE_ADDR val;
505 int pid;
507 int save_pid;
509 save_pid = inferior_pid;
510 inferior_pid = pid;
511 write_register (PC_REGNUM, D10V_CONVERT_IADDR_TO_RAW (val));
512 inferior_pid = save_pid;
515 CORE_ADDR
516 d10v_read_sp ()
518 return (D10V_MAKE_DADDR (read_register (SP_REGNUM)));
521 void
522 d10v_write_sp (val)
523 CORE_ADDR val;
525 write_register (SP_REGNUM, D10V_CONVERT_DADDR_TO_RAW (val));
528 void
529 d10v_write_fp (val)
530 CORE_ADDR val;
532 write_register (FP_REGNUM, D10V_CONVERT_DADDR_TO_RAW (val));
535 CORE_ADDR
536 d10v_read_fp ()
538 return (D10V_MAKE_DADDR (read_register(FP_REGNUM)));
541 /* Function: push_return_address (pc)
542 Set up the return address for the inferior function call.
543 Needed for targets where we don't actually execute a JSR/BSR instruction */
545 CORE_ADDR
546 d10v_push_return_address (pc, sp)
547 CORE_ADDR pc;
548 CORE_ADDR sp;
550 write_register (LR_REGNUM, D10V_CONVERT_IADDR_TO_RAW (CALL_DUMMY_ADDRESS ()));
551 return sp;
555 CORE_ADDR
556 d10v_push_arguments (nargs, args, sp, struct_return, struct_addr)
557 int nargs;
558 value_ptr *args;
559 CORE_ADDR sp;
560 int struct_return;
561 CORE_ADDR struct_addr;
563 int i;
564 int regnum = ARG1_REGNUM;
566 /* Fill in registers and arg lists */
567 for (i = 0; i < nargs; i++)
569 value_ptr arg = args[i];
570 struct type *type = check_typedef (VALUE_TYPE (arg));
571 char *contents = VALUE_CONTENTS (arg);
572 int len = TYPE_LENGTH (type);
573 /* printf ("push: type=%d len=%d\n", type->code, len); */
574 if (TYPE_CODE (type) == TYPE_CODE_PTR)
576 /* pointers require special handling - first convert and
577 then store */
578 long val = extract_signed_integer (contents, len);
579 len = 2;
580 if (TYPE_TARGET_TYPE (type)
581 && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC))
583 /* function pointer */
584 val = D10V_CONVERT_IADDR_TO_RAW (val);
586 else if (D10V_IADDR_P (val))
588 /* also function pointer! */
589 val = D10V_CONVERT_DADDR_TO_RAW (val);
591 else
593 /* data pointer */
594 val &= 0xFFFF;
596 if (regnum <= ARGN_REGNUM)
597 write_register (regnum++, val & 0xffff);
598 else
600 char ptr[2];
601 sp -= 2;
602 store_address (ptr, val & 0xffff, 2);
603 write_memory (sp, ptr, 2);
606 else
608 int aligned_regnum = (regnum + 1) & ~1;
609 if (len <= 2 && regnum <= ARGN_REGNUM)
610 /* fits in a single register, do not align */
612 long val = extract_unsigned_integer (contents, len);
613 write_register (regnum++, val);
615 else if (len <= (ARGN_REGNUM - aligned_regnum + 1) * 2)
616 /* value fits in remaining registers, store keeping left
617 aligned */
619 int b;
620 regnum = aligned_regnum;
621 for (b = 0; b < (len & ~1); b += 2)
623 long val = extract_unsigned_integer (&contents[b], 2);
624 write_register (regnum++, val);
626 if (b < len)
628 long val = extract_unsigned_integer (&contents[b], 1);
629 write_register (regnum++, (val << 8));
632 else
634 /* arg goes straight on stack */
635 regnum = ARGN_REGNUM + 1;
636 sp = (sp - len) & ~1;
637 write_memory (sp, contents, len);
641 return sp;
645 /* Given a return value in `regbuf' with a type `valtype',
646 extract and copy its value into `valbuf'. */
648 void
649 d10v_extract_return_value (type, regbuf, valbuf)
650 struct type *type;
651 char regbuf[REGISTER_BYTES];
652 char *valbuf;
654 int len;
655 /* 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))); */
656 if (TYPE_CODE (type) == TYPE_CODE_PTR
657 && TYPE_TARGET_TYPE (type)
658 && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC))
660 /* pointer to function */
661 int num;
662 short snum;
663 snum = extract_address (regbuf + REGISTER_BYTE (RET1_REGNUM), REGISTER_RAW_SIZE (RET1_REGNUM));
664 store_address ( valbuf, 4, D10V_MAKE_IADDR(snum));
666 else if (TYPE_CODE(type) == TYPE_CODE_PTR)
668 /* pointer to data */
669 int num;
670 short snum;
671 snum = extract_address (regbuf + REGISTER_BYTE (RET1_REGNUM), REGISTER_RAW_SIZE (RET1_REGNUM));
672 store_address ( valbuf, 4, D10V_MAKE_DADDR(snum));
674 else
676 len = TYPE_LENGTH (type);
677 if (len == 1)
679 unsigned short c = extract_unsigned_integer (regbuf + REGISTER_BYTE (RET1_REGNUM), REGISTER_RAW_SIZE (RET1_REGNUM));
680 store_unsigned_integer (valbuf, 1, c);
682 else if ((len & 1) == 0)
683 memcpy (valbuf, regbuf + REGISTER_BYTE (RET1_REGNUM), len);
684 else
686 /* For return values of odd size, the first byte is in the
687 least significant part of the first register. The
688 remaining bytes in remaining registers. Interestingly,
689 when such values are passed in, the last byte is in the
690 most significant byte of that same register - wierd. */
691 memcpy (valbuf, regbuf + REGISTER_BYTE (RET1_REGNUM) + 1, len);
696 /* The following code implements access to, and display of, the D10V's
697 instruction trace buffer. The buffer consists of 64K or more
698 4-byte words of data, of which each words includes an 8-bit count,
699 an 8-bit segment number, and a 16-bit instruction address.
701 In theory, the trace buffer is continuously capturing instruction
702 data that the CPU presents on its "debug bus", but in practice, the
703 ROMified GDB stub only enables tracing when it continues or steps
704 the program, and stops tracing when the program stops; so it
705 actually works for GDB to read the buffer counter out of memory and
706 then read each trace word. The counter records where the tracing
707 stops, but there is no record of where it started, so we remember
708 the PC when we resumed and then search backwards in the trace
709 buffer for a word that includes that address. This is not perfect,
710 because you will miss trace data if the resumption PC is the target
711 of a branch. (The value of the buffer counter is semi-random, any
712 trace data from a previous program stop is gone.) */
714 /* The address of the last word recorded in the trace buffer. */
716 #define DBBC_ADDR (0xd80000)
718 /* The base of the trace buffer, at least for the "Board_0". */
720 #define TRACE_BUFFER_BASE (0xf40000)
722 static void trace_command PARAMS ((char *, int));
724 static void untrace_command PARAMS ((char *, int));
726 static void trace_info PARAMS ((char *, int));
728 static void tdisassemble_command PARAMS ((char *, int));
730 static void display_trace PARAMS ((int, int));
732 /* True when instruction traces are being collected. */
734 static int tracing;
736 /* Remembered PC. */
738 static CORE_ADDR last_pc;
740 /* True when trace output should be displayed whenever program stops. */
742 static int trace_display;
744 /* True when trace listing should include source lines. */
746 static int default_trace_show_source = 1;
748 struct trace_buffer {
749 int size;
750 short *counts;
751 CORE_ADDR *addrs;
752 } trace_data;
754 static void
755 trace_command (args, from_tty)
756 char *args;
757 int from_tty;
759 /* Clear the host-side trace buffer, allocating space if needed. */
760 trace_data.size = 0;
761 if (trace_data.counts == NULL)
762 trace_data.counts = (short *) xmalloc (65536 * sizeof(short));
763 if (trace_data.addrs == NULL)
764 trace_data.addrs = (CORE_ADDR *) xmalloc (65536 * sizeof(CORE_ADDR));
766 tracing = 1;
768 printf_filtered ("Tracing is now on.\n");
771 static void
772 untrace_command (args, from_tty)
773 char *args;
774 int from_tty;
776 tracing = 0;
778 printf_filtered ("Tracing is now off.\n");
781 static void
782 trace_info (args, from_tty)
783 char *args;
784 int from_tty;
786 int i;
788 if (trace_data.size)
790 printf_filtered ("%d entries in trace buffer:\n", trace_data.size);
792 for (i = 0; i < trace_data.size; ++i)
794 printf_filtered ("%d: %d instruction%s at 0x%x\n",
795 i, trace_data.counts[i],
796 (trace_data.counts[i] == 1 ? "" : "s"),
797 trace_data.addrs[i]);
800 else
801 printf_filtered ("No entries in trace buffer.\n");
803 printf_filtered ("Tracing is currently %s.\n", (tracing ? "on" : "off"));
806 /* Print the instruction at address MEMADDR in debugged memory,
807 on STREAM. Returns length of the instruction, in bytes. */
809 static int
810 print_insn (memaddr, stream)
811 CORE_ADDR memaddr;
812 GDB_FILE *stream;
814 /* If there's no disassembler, something is very wrong. */
815 if (tm_print_insn == NULL)
816 abort ();
818 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
819 tm_print_insn_info.endian = BFD_ENDIAN_BIG;
820 else
821 tm_print_insn_info.endian = BFD_ENDIAN_LITTLE;
822 return (*tm_print_insn) (memaddr, &tm_print_insn_info);
825 void
826 d10v_eva_prepare_to_trace ()
828 if (!tracing)
829 return;
831 last_pc = read_register (PC_REGNUM);
834 /* Collect trace data from the target board and format it into a form
835 more useful for display. */
837 void
838 d10v_eva_get_trace_data ()
840 int count, i, j, oldsize;
841 int trace_addr, trace_seg, trace_cnt, next_cnt;
842 unsigned int last_trace, trace_word, next_word;
843 unsigned int *tmpspace;
845 if (!tracing)
846 return;
848 tmpspace = xmalloc (65536 * sizeof(unsigned int));
850 last_trace = read_memory_unsigned_integer (DBBC_ADDR, 2) << 2;
852 /* Collect buffer contents from the target, stopping when we reach
853 the word recorded when execution resumed. */
855 count = 0;
856 while (last_trace > 0)
858 QUIT;
859 trace_word =
860 read_memory_unsigned_integer (TRACE_BUFFER_BASE + last_trace, 4);
861 trace_addr = trace_word & 0xffff;
862 last_trace -= 4;
863 /* Ignore an apparently nonsensical entry. */
864 if (trace_addr == 0xffd5)
865 continue;
866 tmpspace[count++] = trace_word;
867 if (trace_addr == last_pc)
868 break;
869 if (count > 65535)
870 break;
873 /* Move the data to the host-side trace buffer, adjusting counts to
874 include the last instruction executed and transforming the address
875 into something that GDB likes. */
877 for (i = 0; i < count; ++i)
879 trace_word = tmpspace[i];
880 next_word = ((i == 0) ? 0 : tmpspace[i - 1]);
881 trace_addr = trace_word & 0xffff;
882 next_cnt = (next_word >> 24) & 0xff;
883 j = trace_data.size + count - i - 1;
884 trace_data.addrs[j] = (trace_addr << 2) + 0x1000000;
885 trace_data.counts[j] = next_cnt + 1;
888 oldsize = trace_data.size;
889 trace_data.size += count;
891 free (tmpspace);
893 if (trace_display)
894 display_trace (oldsize, trace_data.size);
897 static void
898 tdisassemble_command (arg, from_tty)
899 char *arg;
900 int from_tty;
902 int i, count;
903 CORE_ADDR low, high;
904 char *space_index;
906 if (!arg)
908 low = 0;
909 high = trace_data.size;
911 else if (!(space_index = (char *) strchr (arg, ' ')))
913 low = parse_and_eval_address (arg);
914 high = low + 5;
916 else
918 /* Two arguments. */
919 *space_index = '\0';
920 low = parse_and_eval_address (arg);
921 high = parse_and_eval_address (space_index + 1);
922 if (high < low)
923 high = low;
926 printf_filtered ("Dump of trace from %d to %d:\n", low, high);
928 display_trace (low, high);
930 printf_filtered ("End of trace dump.\n");
931 gdb_flush (gdb_stdout);
934 static void
935 display_trace (low, high)
936 int low, high;
938 int i, count, trace_show_source, first, suppress;
939 CORE_ADDR next_address;
941 trace_show_source = default_trace_show_source;
942 if (!have_full_symbols () && !have_partial_symbols())
944 trace_show_source = 0;
945 printf_filtered ("No symbol table is loaded. Use the \"file\" command.\n");
946 printf_filtered ("Trace will not display any source.\n");
949 first = 1;
950 suppress = 0;
951 for (i = low; i < high; ++i)
953 next_address = trace_data.addrs[i];
954 count = trace_data.counts[i];
955 while (count-- > 0)
957 QUIT;
958 if (trace_show_source)
960 struct symtab_and_line sal, sal_prev;
962 sal_prev = find_pc_line (next_address - 4, 0);
963 sal = find_pc_line (next_address, 0);
965 if (sal.symtab)
967 if (first || sal.line != sal_prev.line)
968 print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
969 suppress = 0;
971 else
973 if (!suppress)
974 /* FIXME-32x64--assumes sal.pc fits in long. */
975 printf_filtered ("No source file for address %s.\n",
976 local_hex_string((unsigned long) sal.pc));
977 suppress = 1;
980 first = 0;
981 print_address (next_address, gdb_stdout);
982 printf_filtered (":");
983 printf_filtered ("\t");
984 wrap_here (" ");
985 next_address = next_address + print_insn (next_address, gdb_stdout);
986 printf_filtered ("\n");
987 gdb_flush (gdb_stdout);
992 extern void (*target_resume_hook) PARAMS ((void));
993 extern void (*target_wait_loop_hook) PARAMS ((void));
995 void
996 _initialize_d10v_tdep ()
998 tm_print_insn = print_insn_d10v;
1000 target_resume_hook = d10v_eva_prepare_to_trace;
1001 target_wait_loop_hook = d10v_eva_get_trace_data;
1003 add_com ("regs", class_vars, show_regs, "Print all registers");
1005 add_com ("trace", class_support, trace_command,
1006 "Enable tracing of instruction execution.");
1008 add_com ("untrace", class_support, untrace_command,
1009 "Disable tracing of instruction execution.");
1011 add_com ("tdisassemble", class_vars, tdisassemble_command,
1012 "Disassemble the trace buffer.\n\
1013 Two optional arguments specify a range of trace buffer entries\n\
1014 as reported by info trace (NOT addresses!).");
1016 add_info ("trace", trace_info,
1017 "Display info about the trace data buffer.");
1019 add_show_from_set (add_set_cmd ("tracedisplay", no_class,
1020 var_integer, (char *)&trace_display,
1021 "Set automatic display of trace.\n", &setlist),
1022 &showlist);
1023 add_show_from_set (add_set_cmd ("tracesource", no_class,
1024 var_integer, (char *)&default_trace_show_source,
1025 "Set display of source code with trace.\n", &setlist),
1026 &showlist);