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