OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [d30v-tdep.c] - Blame information for rev 1767

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/* Target-dependent code for Mitsubishi D30V, for GDB.
2
   Copyright 1996, 1997, 1998, 1999, 2000, 2001
3
   Free Software Foundation, Inc.
4
 
5
   This file is part of GDB.
6
 
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.
11
 
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.
16
 
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.  */
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"
34
#include "dis-asm.h"
35
#include "symfile.h"
36
#include "objfiles.h"
37
#include "regcache.h"
38
 
39
#include "language.h" /* For local_hex_string() */
40
 
41
void d30v_frame_find_saved_regs (struct frame_info *fi,
42
                                 struct frame_saved_regs *fsr);
43
void d30v_frame_find_saved_regs_offsets (struct frame_info *fi,
44
                                         struct frame_saved_regs *fsr);
45
static void d30v_pop_dummy_frame (struct frame_info *fi);
46
static void d30v_print_flags (void);
47
static void print_flags_command (char *, int);
48
 
49
/* the following defines assume:
50
   fp is r61, lr is r62, sp is r63, and ?? is r22
51
   if that changes, they will need to be updated */
52
 
53
#define OP_MASK_ALL_BUT_RA      0x0ffc0fff      /* throw away Ra, keep the rest */
54
 
55
#define OP_STW_SPM              0x054c0fc0      /* stw Ra, @(sp-) */
56
#define OP_STW_SP_R0            0x05400fc0      /* stw Ra, @(sp,r0) */
57
#define OP_STW_SP_IMM0          0x05480fc0      /* st Ra, @(sp, 0x0) */
58
#define OP_STW_R22P_R0          0x05440580      /* stw Ra, @(r22+,r0) */
59
 
60
#define OP_ST2W_SPM             0x056c0fc0      /* st2w Ra, @(sp-) */
61
#define OP_ST2W_SP_R0           0x05600fc0      /* st2w Ra, @(sp, r0) */
62
#define OP_ST2W_SP_IMM0         0x05680fc0      /* st2w Ra, @(sp, 0x0) */
63
#define OP_ST2W_R22P_R0         0x05640580      /* st2w Ra, @(r22+, r0) */
64
 
65
#define OP_MASK_OPCODE          0x0ffc0000      /* just the opcode, ign operands */
66
#define OP_NOP                  0x00f00000      /* nop */
67
 
68
#define OP_MASK_ALL_BUT_IMM     0x0fffffc0      /* throw away imm, keep the rest */
69
#define OP_SUB_SP_IMM           0x082bffc0      /* sub sp,sp,imm */
70
#define OP_ADD_SP_IMM           0x080bffc0      /* add sp,sp,imm */
71
#define OP_ADD_R22_SP_IMM       0x08096fc0      /* add r22,sp,imm */
72
#define OP_STW_FP_SP_IMM        0x054bdfc0      /* stw fp,@(sp,imm) */
73
#define OP_OR_SP_R0_IMM         0x03abf000      /* or sp,r0,imm */
74
 
75
/* no mask */
76
#define OP_OR_FP_R0_SP          0x03a3d03f      /* or fp,r0,sp */
77
#define OP_OR_FP_SP_R0          0x03a3dfc0      /* or fp,sp,r0 */
78
#define OP_OR_FP_IMM0_SP        0x03abd03f      /* or fp,0x0,sp */
79
#define OP_STW_FP_R22P_R0       0x0547d580      /* stw fp,@(r22+,r0) */
80
#define OP_STW_LR_R22P_R0       0x0547e580      /* stw lr,@(r22+,r0) */
81
 
82
#define OP_MASK_OP_AND_RB       0x0ff80fc0      /* keep op and rb,throw away rest */
83
#define OP_STW_SP_IMM           0x05480fc0      /* stw Ra,@(sp,imm) */
84
#define OP_ST2W_SP_IMM          0x05680fc0      /* st2w Ra,@(sp,imm) */
85
#define OP_STW_FP_IMM           0x05480f40      /* stw Ra,@(fp,imm) */
86
#define OP_STW_FP_R0            0x05400f40      /* stw Ra,@(fp,r0) */
87
 
88
#define OP_MASK_FM_BIT          0x80000000
89
#define OP_MASK_CC_BITS         0x70000000
90
#define OP_MASK_SUB_INST        0x0fffffff
91
 
92
#define EXTRACT_RA(op)          (((op) >> 12) & 0x3f)
93
#define EXTRACT_RB(op)          (((op) >> 6) & 0x3f)
94
#define EXTRACT_RC(op)          (((op) & 0x3f)
95
#define EXTRACT_UIMM6(op)       ((op) & 0x3f)
96
#define EXTRACT_IMM6(op)        ((((int)EXTRACT_UIMM6(op)) << 26) >> 26)
97
#define EXTRACT_IMM26(op)       ((((op)&0x0ff00000) >> 2) | ((op)&0x0003ffff))
98
#define EXTRACT_IMM32(opl, opr) ((EXTRACT_UIMM6(opl) << 26)|EXTRACT_IMM26(opr))
99
 
100
 
101
int
102
d30v_frame_chain_valid (CORE_ADDR chain, struct frame_info *fi)
103
{
104
#if 0
105
  return ((chain) != 0 && (fi) != 0 && (fi)->return_pc != 0);
106
#else
107
  return ((chain) != 0 && (fi) != 0 && (fi)->frame <= chain);
108
#endif
109
}
110
 
111
/* Discard from the stack the innermost frame, restoring all saved
112
   registers.  */
113
 
114
void
115
d30v_pop_frame (void)
116
{
117
  struct frame_info *frame = get_current_frame ();
118
  CORE_ADDR fp;
119
  int regnum;
120
  struct frame_saved_regs fsr;
121
  char raw_buffer[8];
122
 
123
  fp = FRAME_FP (frame);
124
  if (frame->dummy)
125
    {
126
      d30v_pop_dummy_frame (frame);
127
      return;
128
    }
129
 
130
  /* fill out fsr with the address of where each */
131
  /* register was stored in the frame */
132
  get_frame_saved_regs (frame, &fsr);
133
 
134
  /* now update the current registers with the old values */
135
  for (regnum = A0_REGNUM; regnum < A0_REGNUM + 2; regnum++)
136
    {
137
      if (fsr.regs[regnum])
138
        {
139
          read_memory (fsr.regs[regnum], raw_buffer, 8);
140
          write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 8);
141
        }
142
    }
143
  for (regnum = 0; regnum < SP_REGNUM; regnum++)
144
    {
145
      if (fsr.regs[regnum])
146
        {
147
          write_register (regnum, read_memory_unsigned_integer (fsr.regs[regnum], 4));
148
        }
149
    }
150
  if (fsr.regs[PSW_REGNUM])
151
    {
152
      write_register (PSW_REGNUM, read_memory_unsigned_integer (fsr.regs[PSW_REGNUM], 4));
153
    }
154
 
155
  write_register (PC_REGNUM, read_register (LR_REGNUM));
156
  write_register (SP_REGNUM, fp + frame->size);
157
  target_store_registers (-1);
158
  flush_cached_frames ();
159
}
160
 
161
static int
162
check_prologue (unsigned long op)
163
{
164
  /* add sp,sp,imm -- observed */
165
  if ((op & OP_MASK_ALL_BUT_IMM) == OP_ADD_SP_IMM)
166
    return 1;
167
 
168
  /* add r22,sp,imm -- observed */
169
  if ((op & OP_MASK_ALL_BUT_IMM) == OP_ADD_R22_SP_IMM)
170
    return 1;
171
 
172
  /* or  fp,r0,sp -- observed */
173
  if (op == OP_OR_FP_R0_SP)
174
    return 1;
175
 
176
  /* nop */
177
  if ((op & OP_MASK_OPCODE) == OP_NOP)
178
    return 1;
179
 
180
  /* stw  Ra,@(sp,r0) */
181
  if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_SP_R0)
182
    return 1;
183
 
184
  /* stw  Ra,@(sp,0x0) */
185
  if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_SP_IMM0)
186
    return 1;
187
 
188
  /* st2w  Ra,@(sp,r0) */
189
  if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SP_R0)
190
    return 1;
191
 
192
  /* st2w  Ra,@(sp,0x0) */
193
  if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SP_IMM0)
194
    return 1;
195
 
196
  /* stw fp, @(r22+,r0) -- observed */
197
  if (op == OP_STW_FP_R22P_R0)
198
    return 1;
199
 
200
  /* stw r62, @(r22+,r0) -- observed */
201
  if (op == OP_STW_LR_R22P_R0)
202
    return 1;
203
 
204
  /* stw Ra, @(fp,r0) -- observed */
205
  if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_FP_R0)
206
    return 1;                   /* first arg */
207
 
208
  /* stw Ra, @(fp,imm) -- observed */
209
  if ((op & OP_MASK_OP_AND_RB) == OP_STW_FP_IMM)
210
    return 1;                   /* second and subsequent args */
211
 
212
  /* stw fp,@(sp,imm) -- observed */
213
  if ((op & OP_MASK_ALL_BUT_IMM) == OP_STW_FP_SP_IMM)
214
    return 1;
215
 
216
  /* st2w Ra,@(r22+,r0) */
217
  if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_R22P_R0)
218
    return 1;
219
 
220
  /* stw  Ra, @(sp-) */
221
  if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_SPM)
222
    return 1;
223
 
224
  /* st2w  Ra, @(sp-) */
225
  if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SPM)
226
    return 1;
227
 
228
  /* sub.?  sp,sp,imm */
229
  if ((op & OP_MASK_ALL_BUT_IMM) == OP_SUB_SP_IMM)
230
    return 1;
231
 
232
  return 0;
233
}
234
 
235
CORE_ADDR
236
d30v_skip_prologue (CORE_ADDR pc)
237
{
238
  unsigned long op[2];
239
  unsigned long opl, opr;       /* left / right sub operations */
240
  unsigned long fm0, fm1;       /* left / right mode bits */
241
  unsigned long cc0, cc1;
242
  unsigned long op1, op2;
243
  CORE_ADDR func_addr, func_end;
244
  struct symtab_and_line sal;
245
 
246
  /* If we have line debugging information, then the end of the */
247
  /* prologue should the first assembly instruction of  the first source line */
248
  if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
249
    {
250
      sal = find_pc_line (func_addr, 0);
251
      if (sal.end && sal.end < func_end)
252
        return sal.end;
253
    }
254
 
255
  if (target_read_memory (pc, (char *) &op[0], 8))
256
    return pc;                  /* Can't access it -- assume no prologue. */
257
 
258
  while (1)
259
    {
260
      opl = (unsigned long) read_memory_integer (pc, 4);
261
      opr = (unsigned long) read_memory_integer (pc + 4, 4);
262
 
263
      fm0 = (opl & OP_MASK_FM_BIT);
264
      fm1 = (opr & OP_MASK_FM_BIT);
265
 
266
      cc0 = (opl & OP_MASK_CC_BITS);
267
      cc1 = (opr & OP_MASK_CC_BITS);
268
 
269
      opl = (opl & OP_MASK_SUB_INST);
270
      opr = (opr & OP_MASK_SUB_INST);
271
 
272
      if (fm0 && fm1)
273
        {
274
          /* long instruction (opl contains the opcode) */
275
          if (((opl & OP_MASK_ALL_BUT_IMM) != OP_ADD_SP_IMM) &&         /* add sp,sp,imm */
276
              ((opl & OP_MASK_ALL_BUT_IMM) != OP_ADD_R22_SP_IMM) &&     /* add r22,sp,imm */
277
              ((opl & OP_MASK_OP_AND_RB) != OP_STW_SP_IMM) &&   /* stw Ra, @(sp,imm) */
278
              ((opl & OP_MASK_OP_AND_RB) != OP_ST2W_SP_IMM))    /* st2w Ra, @(sp,imm) */
279
            break;
280
        }
281
      else
282
        {
283
          /* short instructions */
284
          if (fm0 && !fm1)
285
            {
286
              op1 = opr;
287
              op2 = opl;
288
            }
289
          else
290
            {
291
              op1 = opl;
292
              op2 = opr;
293
            }
294
          if (check_prologue (op1))
295
            {
296
              if (!check_prologue (op2))
297
                {
298
                  /* if the previous opcode was really part of the prologue */
299
                  /* and not just a NOP, then we want to break after both instructions */
300
                  if ((op1 & OP_MASK_OPCODE) != OP_NOP)
301
                    pc += 8;
302
                  break;
303
                }
304
            }
305
          else
306
            break;
307
        }
308
      pc += 8;
309
    }
310
  return pc;
311
}
312
 
313
static int end_of_stack;
314
 
315
/* Given a GDB frame, determine the address of the calling function's frame.
316
   This will be used to create a new GDB frame struct, and then
317
   INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
318
 */
319
 
320
CORE_ADDR
321
d30v_frame_chain (struct frame_info *frame)
322
{
323
  struct frame_saved_regs fsr;
324
 
325
  d30v_frame_find_saved_regs (frame, &fsr);
326
 
327
  if (end_of_stack)
328
    return (CORE_ADDR) 0;
329
 
330
  if (frame->return_pc == IMEM_START)
331
    return (CORE_ADDR) 0;
332
 
333
  if (!fsr.regs[FP_REGNUM])
334
    {
335
      if (!fsr.regs[SP_REGNUM] || fsr.regs[SP_REGNUM] == STACK_START)
336
        return (CORE_ADDR) 0;
337
 
338
      return fsr.regs[SP_REGNUM];
339
    }
340
 
341
  if (!read_memory_unsigned_integer (fsr.regs[FP_REGNUM], 4))
342
    return (CORE_ADDR) 0;
343
 
344
  return read_memory_unsigned_integer (fsr.regs[FP_REGNUM], 4);
345
}
346
 
347
static int next_addr, uses_frame;
348
static int frame_size;
349
 
350
static int
351
prologue_find_regs (unsigned long op, struct frame_saved_regs *fsr,
352
                    CORE_ADDR addr)
353
{
354
  int n;
355
  int offset;
356
 
357
  /* add sp,sp,imm -- observed */
358
  if ((op & OP_MASK_ALL_BUT_IMM) == OP_ADD_SP_IMM)
359
    {
360
      offset = EXTRACT_IMM6 (op);
361
      /*next_addr += offset; */
362
      frame_size += -offset;
363
      return 1;
364
    }
365
 
366
  /* add r22,sp,imm -- observed */
367
  if ((op & OP_MASK_ALL_BUT_IMM) == OP_ADD_R22_SP_IMM)
368
    {
369
      offset = EXTRACT_IMM6 (op);
370
      next_addr = (offset - frame_size);
371
      return 1;
372
    }
373
 
374
  /* stw Ra, @(fp, offset) -- observed */
375
  if ((op & OP_MASK_OP_AND_RB) == OP_STW_FP_IMM)
376
    {
377
      n = EXTRACT_RA (op);
378
      offset = EXTRACT_IMM6 (op);
379
      fsr->regs[n] = (offset - frame_size);
380
      return 1;
381
    }
382
 
383
  /* stw Ra, @(fp, r0) -- observed */
384
  if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_FP_R0)
385
    {
386
      n = EXTRACT_RA (op);
387
      fsr->regs[n] = (-frame_size);
388
      return 1;
389
    }
390
 
391
  /* or  fp,0,sp -- observed */
392
  if ((op == OP_OR_FP_R0_SP) ||
393
      (op == OP_OR_FP_SP_R0) ||
394
      (op == OP_OR_FP_IMM0_SP))
395
    {
396
      uses_frame = 1;
397
      return 1;
398
    }
399
 
400
  /* nop */
401
  if ((op & OP_MASK_OPCODE) == OP_NOP)
402
    return 1;
403
 
404
  /* stw Ra,@(r22+,r0) -- observed */
405
  if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_R22P_R0)
406
    {
407
      n = EXTRACT_RA (op);
408
      fsr->regs[n] = next_addr;
409
      next_addr += 4;
410
      return 1;
411
    }
412
#if 0                           /* subsumed in pattern above */
413
  /* stw fp,@(r22+,r0) -- observed */
414
  if (op == OP_STW_FP_R22P_R0)
415
    {
416
      fsr->regs[FP_REGNUM] = next_addr;         /* XXX */
417
      next_addr += 4;
418
      return 1;
419
    }
420
 
421
  /* stw r62,@(r22+,r0) -- observed */
422
  if (op == OP_STW_LR_R22P_R0)
423
    {
424
      fsr->regs[LR_REGNUM] = next_addr;
425
      next_addr += 4;
426
      return 1;
427
    }
428
#endif
429
  /* st2w Ra,@(r22+,r0) -- observed */
430
  if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_R22P_R0)
431
    {
432
      n = EXTRACT_RA (op);
433
      fsr->regs[n] = next_addr;
434
      fsr->regs[n + 1] = next_addr + 4;
435
      next_addr += 8;
436
      return 1;
437
    }
438
 
439
  /* stw  rn, @(sp-) */
440
  if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_SPM)
441
    {
442
      n = EXTRACT_RA (op);
443
      fsr->regs[n] = next_addr;
444
      next_addr -= 4;
445
      return 1;
446
    }
447
 
448
  /* st2w  Ra, @(sp-) */
449
  else if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SPM)
450
    {
451
      n = EXTRACT_RA (op);
452
      fsr->regs[n] = next_addr;
453
      fsr->regs[n + 1] = next_addr + 4;
454
      next_addr -= 8;
455
      return 1;
456
    }
457
 
458
  /* sub  sp,sp,imm */
459
  if ((op & OP_MASK_ALL_BUT_IMM) == OP_SUB_SP_IMM)
460
    {
461
      offset = EXTRACT_IMM6 (op);
462
      frame_size += -offset;
463
      return 1;
464
    }
465
 
466
  /* st  rn, @(sp,0) -- observed */
467
  if (((op & OP_MASK_ALL_BUT_RA) == OP_STW_SP_R0) ||
468
      ((op & OP_MASK_ALL_BUT_RA) == OP_STW_SP_IMM0))
469
    {
470
      n = EXTRACT_RA (op);
471
      fsr->regs[n] = (-frame_size);
472
      return 1;
473
    }
474
 
475
  /* st2w  rn, @(sp,0) */
476
  if (((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SP_R0) ||
477
      ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SP_IMM0))
478
    {
479
      n = EXTRACT_RA (op);
480
      fsr->regs[n] = (-frame_size);
481
      fsr->regs[n + 1] = (-frame_size) + 4;
482
      return 1;
483
    }
484
 
485
  /* stw fp,@(sp,imm) -- observed */
486
  if ((op & OP_MASK_ALL_BUT_IMM) == OP_STW_FP_SP_IMM)
487
    {
488
      offset = EXTRACT_IMM6 (op);
489
      fsr->regs[FP_REGNUM] = (offset - frame_size);
490
      return 1;
491
    }
492
  return 0;
493
}
494
 
495
/* Put here the code to store, into a struct frame_saved_regs, the
496
   addresses of the saved registers of frame described by FRAME_INFO.
497
   This includes special registers such as pc and fp saved in special
498
   ways in the stack frame.  sp is even more special: the address we
499
   return for it IS the sp for the next frame. */
500
void
501
d30v_frame_find_saved_regs (struct frame_info *fi, struct frame_saved_regs *fsr)
502
{
503
  CORE_ADDR fp, pc;
504
  unsigned long opl, opr;
505
  unsigned long op1, op2;
506
  unsigned long fm0, fm1;
507
  int i;
508
 
509
  fp = fi->frame;
510
  memset (fsr, 0, sizeof (*fsr));
511
  next_addr = 0;
512
  frame_size = 0;
513
  end_of_stack = 0;
514
 
515
  uses_frame = 0;
516
 
517
  d30v_frame_find_saved_regs_offsets (fi, fsr);
518
 
519
  fi->size = frame_size;
520
 
521
  if (!fp)
522
    fp = read_register (SP_REGNUM);
523
 
524
  for (i = 0; i < NUM_REGS - 1; i++)
525
    if (fsr->regs[i])
526
      {
527
        fsr->regs[i] = fsr->regs[i] + fp + frame_size;
528
      }
529
 
530
  if (fsr->regs[LR_REGNUM])
531
    fi->return_pc = read_memory_unsigned_integer (fsr->regs[LR_REGNUM], 4);
532
  else
533
    fi->return_pc = read_register (LR_REGNUM);
534
 
535
  /* the SP is not normally (ever?) saved, but check anyway */
536
  if (!fsr->regs[SP_REGNUM])
537
    {
538
      /* if the FP was saved, that means the current FP is valid, */
539
      /* otherwise, it isn't being used, so we use the SP instead */
540
      if (uses_frame)
541
        fsr->regs[SP_REGNUM] = read_register (FP_REGNUM) + fi->size;
542
      else
543
        {
544
          fsr->regs[SP_REGNUM] = fp + fi->size;
545
          fi->frameless = 1;
546
          fsr->regs[FP_REGNUM] = 0;
547
        }
548
    }
549
}
550
 
551
void
552
d30v_frame_find_saved_regs_offsets (struct frame_info *fi,
553
                                    struct frame_saved_regs *fsr)
554
{
555
  CORE_ADDR fp, pc;
556
  unsigned long opl, opr;
557
  unsigned long op1, op2;
558
  unsigned long fm0, fm1;
559
  int i;
560
 
561
  fp = fi->frame;
562
  memset (fsr, 0, sizeof (*fsr));
563
  next_addr = 0;
564
  frame_size = 0;
565
  end_of_stack = 0;
566
 
567
  pc = get_pc_function_start (fi->pc);
568
 
569
  uses_frame = 0;
570
  while (pc < fi->pc)
571
    {
572
      opl = (unsigned long) read_memory_integer (pc, 4);
573
      opr = (unsigned long) read_memory_integer (pc + 4, 4);
574
 
575
      fm0 = (opl & OP_MASK_FM_BIT);
576
      fm1 = (opr & OP_MASK_FM_BIT);
577
 
578
      opl = (opl & OP_MASK_SUB_INST);
579
      opr = (opr & OP_MASK_SUB_INST);
580
 
581
      if (fm0 && fm1)
582
        {
583
          /* long instruction */
584
          if ((opl & OP_MASK_ALL_BUT_IMM) == OP_ADD_SP_IMM)
585
            {
586
              /* add sp,sp,n */
587
              long offset = EXTRACT_IMM32 (opl, opr);
588
              frame_size += -offset;
589
            }
590
          else if ((opl & OP_MASK_ALL_BUT_IMM) == OP_ADD_R22_SP_IMM)
591
            {
592
              /* add r22,sp,offset */
593
              long offset = EXTRACT_IMM32 (opl, opr);
594
              next_addr = (offset - frame_size);
595
            }
596
          else if ((opl & OP_MASK_OP_AND_RB) == OP_STW_SP_IMM)
597
            {
598
              /* st Ra, @(sp,imm) */
599
              long offset = EXTRACT_IMM32 (opl, opr);
600
              short n = EXTRACT_RA (opl);
601
              fsr->regs[n] = (offset - frame_size);
602
            }
603
          else if ((opl & OP_MASK_OP_AND_RB) == OP_ST2W_SP_IMM)
604
            {
605
              /* st2w Ra, @(sp,offset) */
606
              long offset = EXTRACT_IMM32 (opl, opr);
607
              short n = EXTRACT_RA (opl);
608
              fsr->regs[n] = (offset - frame_size);
609
              fsr->regs[n + 1] = (offset - frame_size) + 4;
610
            }
611
          else if ((opl & OP_MASK_ALL_BUT_IMM) == OP_OR_SP_R0_IMM)
612
            {
613
              end_of_stack = 1;
614
            }
615
          else
616
            break;
617
        }
618
      else
619
        {
620
          /* short instructions */
621
          if (fm0 && !fm1)
622
            {
623
              op2 = opl;
624
              op1 = opr;
625
            }
626
          else
627
            {
628
              op1 = opl;
629
              op2 = opr;
630
            }
631
          if (!prologue_find_regs (op1, fsr, pc) || !prologue_find_regs (op2, fsr, pc))
632
            break;
633
        }
634
      pc += 8;
635
    }
636
 
637
#if 0
638
  fi->size = frame_size;
639
 
640
  if (!fp)
641
    fp = read_register (SP_REGNUM);
642
 
643
  for (i = 0; i < NUM_REGS - 1; i++)
644
    if (fsr->regs[i])
645
      {
646
        fsr->regs[i] = fsr->regs[i] + fp + frame_size;
647
      }
648
 
649
  if (fsr->regs[LR_REGNUM])
650
    fi->return_pc = read_memory_unsigned_integer (fsr->regs[LR_REGNUM], 4);
651
  else
652
    fi->return_pc = read_register (LR_REGNUM);
653
 
654
  /* the SP is not normally (ever?) saved, but check anyway */
655
  if (!fsr->regs[SP_REGNUM])
656
    {
657
      /* if the FP was saved, that means the current FP is valid, */
658
      /* otherwise, it isn't being used, so we use the SP instead */
659
      if (uses_frame)
660
        fsr->regs[SP_REGNUM] = read_register (FP_REGNUM) + fi->size;
661
      else
662
        {
663
          fsr->regs[SP_REGNUM] = fp + fi->size;
664
          fi->frameless = 1;
665
          fsr->regs[FP_REGNUM] = 0;
666
        }
667
    }
668
#endif
669
}
670
 
671
void
672
d30v_init_extra_frame_info (int fromleaf, struct frame_info *fi)
673
{
674
  struct frame_saved_regs dummy;
675
 
676
  if (fi->next && (fi->pc == 0))
677
    fi->pc = fi->next->return_pc;
678
 
679
  d30v_frame_find_saved_regs_offsets (fi, &dummy);
680
 
681
  if (uses_frame == 0)
682
    fi->frameless = 1;
683
  else
684
    fi->frameless = 0;
685
 
686
  if ((fi->next == 0) && (uses_frame == 0))
687
    /* innermost frame and it's "frameless",
688
       so the fi->frame field is wrong, fix it! */
689
    fi->frame = read_sp ();
690
 
691
  if (dummy.regs[LR_REGNUM])
692
    {
693
      /* it was saved, grab it! */
694
      dummy.regs[LR_REGNUM] += (fi->frame + frame_size);
695
      fi->return_pc = read_memory_unsigned_integer (dummy.regs[LR_REGNUM], 4);
696
    }
697
  else
698
    fi->return_pc = read_register (LR_REGNUM);
699
}
700
 
701
void
702
d30v_init_frame_pc (int fromleaf, struct frame_info *prev)
703
{
704
  /* default value, put here so we can breakpoint on it and
705
     see if the default value is really the right thing to use */
706
  prev->pc = (fromleaf ? SAVED_PC_AFTER_CALL (prev->next) : \
707
              prev->next ? FRAME_SAVED_PC (prev->next) : read_pc ());
708
}
709
 
710
static void d30v_print_register (int regnum, int tabular);
711
 
712
static void
713
d30v_print_register (int regnum, int tabular)
714
{
715
  if (regnum < A0_REGNUM)
716
    {
717
      if (tabular)
718
        printf_filtered ("%08lx", (long) read_register (regnum));
719
      else
720
        printf_filtered ("0x%lx %ld",
721
                         (long) read_register (regnum),
722
                         (long) read_register (regnum));
723
    }
724
  else
725
    {
726
      char regbuf[MAX_REGISTER_RAW_SIZE];
727
 
728
      read_relative_register_raw_bytes (regnum, regbuf);
729
 
730
      val_print (REGISTER_VIRTUAL_TYPE (regnum), regbuf, 0, 0,
731
                 gdb_stdout, 'x', 1, 0, Val_pretty_default);
732
 
733
      if (!tabular)
734
        {
735
          printf_filtered ("    ");
736
          val_print (REGISTER_VIRTUAL_TYPE (regnum), regbuf, 0, 0,
737
                     gdb_stdout, 'd', 1, 0, Val_pretty_default);
738
        }
739
    }
740
}
741
 
742
static void
743
d30v_print_flags (void)
744
{
745
  long psw = read_register (PSW_REGNUM);
746
  printf_filtered ("flags #1");
747
  printf_filtered ("   (sm) %d", (psw & PSW_SM) != 0);
748
  printf_filtered ("   (ea) %d", (psw & PSW_EA) != 0);
749
  printf_filtered ("   (db) %d", (psw & PSW_DB) != 0);
750
  printf_filtered ("   (ds) %d", (psw & PSW_DS) != 0);
751
  printf_filtered ("   (ie) %d", (psw & PSW_IE) != 0);
752
  printf_filtered ("   (rp) %d", (psw & PSW_RP) != 0);
753
  printf_filtered ("   (md) %d\n", (psw & PSW_MD) != 0);
754
 
755
  printf_filtered ("flags #2");
756
  printf_filtered ("   (f0) %d", (psw & PSW_F0) != 0);
757
  printf_filtered ("   (f1) %d", (psw & PSW_F1) != 0);
758
  printf_filtered ("   (f2) %d", (psw & PSW_F2) != 0);
759
  printf_filtered ("   (f3) %d", (psw & PSW_F3) != 0);
760
  printf_filtered ("    (s) %d", (psw & PSW_S) != 0);
761
  printf_filtered ("    (v) %d", (psw & PSW_V) != 0);
762
  printf_filtered ("   (va) %d", (psw & PSW_VA) != 0);
763
  printf_filtered ("    (c) %d\n", (psw & PSW_C) != 0);
764
}
765
 
766
static void
767
print_flags_command (char *args, int from_tty)
768
{
769
  d30v_print_flags ();
770
}
771
 
772
void
773
d30v_do_registers_info (int regnum, int fpregs)
774
{
775
  long long num1, num2;
776
  long psw;
777
 
778
  if (regnum != -1)
779
    {
780
      if (REGISTER_NAME (0) == NULL || REGISTER_NAME (0)[0] == '\000')
781
        return;
782
 
783
      printf_filtered ("%s ", REGISTER_NAME (regnum));
784
      d30v_print_register (regnum, 0);
785
 
786
      printf_filtered ("\n");
787
      return;
788
    }
789
 
790
  /* Have to print all the registers.  Format them nicely.  */
791
 
792
  printf_filtered ("PC=");
793
  print_address (read_pc (), gdb_stdout);
794
 
795
  printf_filtered (" PSW=");
796
  d30v_print_register (PSW_REGNUM, 1);
797
 
798
  printf_filtered (" BPC=");
799
  print_address (read_register (BPC_REGNUM), gdb_stdout);
800
 
801
  printf_filtered (" BPSW=");
802
  d30v_print_register (BPSW_REGNUM, 1);
803
  printf_filtered ("\n");
804
 
805
  printf_filtered ("DPC=");
806
  print_address (read_register (DPC_REGNUM), gdb_stdout);
807
 
808
  printf_filtered (" DPSW=");
809
  d30v_print_register (DPSW_REGNUM, 1);
810
 
811
  printf_filtered (" IBA=");
812
  print_address (read_register (IBA_REGNUM), gdb_stdout);
813
  printf_filtered ("\n");
814
 
815
  printf_filtered ("RPT_C=");
816
  d30v_print_register (RPT_C_REGNUM, 1);
817
 
818
  printf_filtered (" RPT_S=");
819
  print_address (read_register (RPT_S_REGNUM), gdb_stdout);
820
 
821
  printf_filtered (" RPT_E=");
822
  print_address (read_register (RPT_E_REGNUM), gdb_stdout);
823
  printf_filtered ("\n");
824
 
825
  printf_filtered ("MOD_S=");
826
  print_address (read_register (MOD_S_REGNUM), gdb_stdout);
827
 
828
  printf_filtered (" MOD_E=");
829
  print_address (read_register (MOD_E_REGNUM), gdb_stdout);
830
  printf_filtered ("\n");
831
 
832
  printf_filtered ("EIT_VB=");
833
  print_address (read_register (EIT_VB_REGNUM), gdb_stdout);
834
 
835
  printf_filtered (" INT_S=");
836
  d30v_print_register (INT_S_REGNUM, 1);
837
 
838
  printf_filtered (" INT_M=");
839
  d30v_print_register (INT_M_REGNUM, 1);
840
  printf_filtered ("\n");
841
 
842
  d30v_print_flags ();
843
  for (regnum = 0; regnum <= 63;)
844
    {
845
      int i;
846
 
847
      printf_filtered ("R%d-R%d ", regnum, regnum + 7);
848
      if (regnum < 10)
849
        printf_filtered (" ");
850
      if (regnum + 7 < 10)
851
        printf_filtered (" ");
852
 
853
      for (i = 0; i < 8; i++)
854
        {
855
          printf_filtered (" ");
856
          d30v_print_register (regnum++, 1);
857
        }
858
 
859
      printf_filtered ("\n");
860
    }
861
 
862
  printf_filtered ("A0-A1    ");
863
 
864
  d30v_print_register (A0_REGNUM, 1);
865
  printf_filtered ("    ");
866
  d30v_print_register (A1_REGNUM, 1);
867
  printf_filtered ("\n");
868
}
869
 
870
CORE_ADDR
871
d30v_fix_call_dummy (char *dummyname, CORE_ADDR start_sp, CORE_ADDR fun,
872
                     int nargs, value_ptr *args, struct type *type, int gcc_p)
873
{
874
  int regnum;
875
  CORE_ADDR sp;
876
  char buffer[MAX_REGISTER_RAW_SIZE];
877
  struct frame_info *frame = get_current_frame ();
878
  frame->dummy = start_sp;
879
  /*start_sp |= DMEM_START; */
880
 
881
  sp = start_sp;
882
  for (regnum = 0; regnum < NUM_REGS; regnum++)
883
    {
884
      sp -= REGISTER_RAW_SIZE (regnum);
885
      store_address (buffer, REGISTER_RAW_SIZE (regnum), read_register (regnum));
886
      write_memory (sp, buffer, REGISTER_RAW_SIZE (regnum));
887
    }
888
  write_register (SP_REGNUM, (LONGEST) sp);
889
  /* now we need to load LR with the return address */
890
  write_register (LR_REGNUM, (LONGEST) d30v_call_dummy_address ());
891
  return sp;
892
}
893
 
894
static void
895
d30v_pop_dummy_frame (struct frame_info *fi)
896
{
897
  CORE_ADDR sp = fi->dummy;
898
  int regnum;
899
 
900
  for (regnum = 0; regnum < NUM_REGS; regnum++)
901
    {
902
      sp -= REGISTER_RAW_SIZE (regnum);
903
      write_register (regnum, read_memory_unsigned_integer (sp, REGISTER_RAW_SIZE (regnum)));
904
    }
905
  flush_cached_frames ();       /* needed? */
906
}
907
 
908
 
909
CORE_ADDR
910
d30v_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
911
                     int struct_return, CORE_ADDR struct_addr)
912
{
913
  int i, len, index = 0, regnum = 2;
914
  char buffer[4], *contents;
915
  LONGEST val;
916
  CORE_ADDR ptrs[10];
917
 
918
#if 0
919
  /* Pass 1. Put all large args on stack */
920
  for (i = 0; i < nargs; i++)
921
    {
922
      value_ptr arg = args[i];
923
      struct type *arg_type = check_typedef (VALUE_TYPE (arg));
924
      len = TYPE_LENGTH (arg_type);
925
      contents = VALUE_CONTENTS (arg);
926
      val = extract_signed_integer (contents, len);
927
      if (len > 4)
928
        {
929
          /* put on stack and pass pointers */
930
          sp -= len;
931
          write_memory (sp, contents, len);
932
          ptrs[index++] = sp;
933
        }
934
    }
935
#endif
936
  index = 0;
937
 
938
  for (i = 0; i < nargs; i++)
939
    {
940
      value_ptr arg = args[i];
941
      struct type *arg_type = check_typedef (VALUE_TYPE (arg));
942
      len = TYPE_LENGTH (arg_type);
943
      contents = VALUE_CONTENTS (arg);
944
      if (len > 4)
945
        {
946
          /* we need multiple registers */
947
          int ndx;
948
 
949
          for (ndx = 0; len > 0; ndx += 8, len -= 8)
950
            {
951
              if (regnum & 1)
952
                regnum++;       /* all args > 4 bytes start in even register */
953
 
954
              if (regnum < 18)
955
                {
956
                  val = extract_signed_integer (&contents[ndx], 4);
957
                  write_register (regnum++, val);
958
 
959
                  if (len >= 8)
960
                    val = extract_signed_integer (&contents[ndx + 4], 4);
961
                  else
962
                    val = extract_signed_integer (&contents[ndx + 4], len - 4);
963
                  write_register (regnum++, val);
964
                }
965
              else
966
                {
967
                  /* no more registers available.  put it on the stack */
968
 
969
                  /* all args > 4 bytes are padded to a multiple of 8 bytes
970
                     and start on an 8 byte boundary */
971
                  if (sp & 7)
972
                    sp -= (sp & 7);     /* align it */
973
 
974
                  sp -= ((len + 7) & ~7);       /* allocate space */
975
                  write_memory (sp, &contents[ndx], len);
976
                  break;
977
                }
978
            }
979
        }
980
      else
981
        {
982
          if (regnum < 18)
983
            {
984
              val = extract_signed_integer (contents, len);
985
              write_register (regnum++, val);
986
            }
987
          else
988
            {
989
              /* all args are padded to a multiple of 4 bytes (at least) */
990
              sp -= ((len + 3) & ~3);
991
              write_memory (sp, contents, len);
992
            }
993
        }
994
    }
995
  if (sp & 7)
996
    /* stack pointer is not on an 8 byte boundary -- align it */
997
    sp -= (sp & 7);
998
  return sp;
999
}
1000
 
1001
 
1002
/* pick an out-of-the-way place to set the return value */
1003
/* for an inferior function call.  The link register is set to this  */
1004
/* value and a momentary breakpoint is set there.  When the breakpoint */
1005
/* is hit, the dummy frame is popped and the previous environment is */
1006
/* restored. */
1007
 
1008
CORE_ADDR
1009
d30v_call_dummy_address (void)
1010
{
1011
  CORE_ADDR entry;
1012
  struct minimal_symbol *sym;
1013
 
1014
  entry = entry_point_address ();
1015
 
1016
  if (entry != 0)
1017
    return entry;
1018
 
1019
  sym = lookup_minimal_symbol ("_start", NULL, symfile_objfile);
1020
 
1021
  if (!sym || MSYMBOL_TYPE (sym) != mst_text)
1022
    return 0;
1023
  else
1024
    return SYMBOL_VALUE_ADDRESS (sym);
1025
}
1026
 
1027
/* Given a return value in `regbuf' with a type `valtype',
1028
   extract and copy its value into `valbuf'.  */
1029
 
1030
void
1031
d30v_extract_return_value (struct type *valtype, char regbuf[REGISTER_BYTES],
1032
                           char *valbuf)
1033
{
1034
  memcpy (valbuf, regbuf + REGISTER_BYTE (2), TYPE_LENGTH (valtype));
1035
}
1036
 
1037
/* The following code implements access to, and display of, the D30V's
1038
   instruction trace buffer.  The buffer consists of 64K or more
1039
   4-byte words of data, of which each words includes an 8-bit count,
1040
   an 8-bit segment number, and a 16-bit instruction address.
1041
 
1042
   In theory, the trace buffer is continuously capturing instruction
1043
   data that the CPU presents on its "debug bus", but in practice, the
1044
   ROMified GDB stub only enables tracing when it continues or steps
1045
   the program, and stops tracing when the program stops; so it
1046
   actually works for GDB to read the buffer counter out of memory and
1047
   then read each trace word.  The counter records where the tracing
1048
   stops, but there is no record of where it started, so we remember
1049
   the PC when we resumed and then search backwards in the trace
1050
   buffer for a word that includes that address.  This is not perfect,
1051
   because you will miss trace data if the resumption PC is the target
1052
   of a branch.  (The value of the buffer counter is semi-random, any
1053
   trace data from a previous program stop is gone.)  */
1054
 
1055
/* The address of the last word recorded in the trace buffer.  */
1056
 
1057
#define DBBC_ADDR (0xd80000)
1058
 
1059
/* The base of the trace buffer, at least for the "Board_0".  */
1060
 
1061
#define TRACE_BUFFER_BASE (0xf40000)
1062
 
1063
static void trace_command (char *, int);
1064
 
1065
static void untrace_command (char *, int);
1066
 
1067
static void trace_info (char *, int);
1068
 
1069
static void tdisassemble_command (char *, int);
1070
 
1071
static void display_trace (int, int);
1072
 
1073
/* True when instruction traces are being collected.  */
1074
 
1075
static int tracing;
1076
 
1077
/* Remembered PC.  */
1078
 
1079
static CORE_ADDR last_pc;
1080
 
1081
/* True when trace output should be displayed whenever program stops.  */
1082
 
1083
static int trace_display;
1084
 
1085
/* True when trace listing should include source lines.  */
1086
 
1087
static int default_trace_show_source = 1;
1088
 
1089
struct trace_buffer
1090
  {
1091
    int size;
1092
    short *counts;
1093
    CORE_ADDR *addrs;
1094
  }
1095
trace_data;
1096
 
1097
static void
1098
trace_command (char *args, int from_tty)
1099
{
1100
  /* Clear the host-side trace buffer, allocating space if needed.  */
1101
  trace_data.size = 0;
1102
  if (trace_data.counts == NULL)
1103
    trace_data.counts = (short *) xmalloc (65536 * sizeof (short));
1104
  if (trace_data.addrs == NULL)
1105
    trace_data.addrs = (CORE_ADDR *) xmalloc (65536 * sizeof (CORE_ADDR));
1106
 
1107
  tracing = 1;
1108
 
1109
  printf_filtered ("Tracing is now on.\n");
1110
}
1111
 
1112
static void
1113
untrace_command (char *args, int from_tty)
1114
{
1115
  tracing = 0;
1116
 
1117
  printf_filtered ("Tracing is now off.\n");
1118
}
1119
 
1120
static void
1121
trace_info (char *args, int from_tty)
1122
{
1123
  int i;
1124
 
1125
  if (trace_data.size)
1126
    {
1127
      printf_filtered ("%d entries in trace buffer:\n", trace_data.size);
1128
 
1129
      for (i = 0; i < trace_data.size; ++i)
1130
        {
1131
          printf_filtered ("%d: %d instruction%s at 0x%s\n",
1132
                           i, trace_data.counts[i],
1133
                           (trace_data.counts[i] == 1 ? "" : "s"),
1134
                           paddr_nz (trace_data.addrs[i]));
1135
        }
1136
    }
1137
  else
1138
    printf_filtered ("No entries in trace buffer.\n");
1139
 
1140
  printf_filtered ("Tracing is currently %s.\n", (tracing ? "on" : "off"));
1141
}
1142
 
1143
/* Print the instruction at address MEMADDR in debugged memory,
1144
   on STREAM.  Returns length of the instruction, in bytes.  */
1145
 
1146
static int
1147
print_insn (CORE_ADDR memaddr, struct ui_file *stream)
1148
{
1149
  /* If there's no disassembler, something is very wrong.  */
1150
  if (tm_print_insn == NULL)
1151
    internal_error (__FILE__, __LINE__,
1152
                    "print_insn: no disassembler");
1153
 
1154
  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1155
    tm_print_insn_info.endian = BFD_ENDIAN_BIG;
1156
  else
1157
    tm_print_insn_info.endian = BFD_ENDIAN_LITTLE;
1158
  return (*tm_print_insn) (memaddr, &tm_print_insn_info);
1159
}
1160
 
1161
void
1162
d30v_eva_prepare_to_trace (void)
1163
{
1164
  if (!tracing)
1165
    return;
1166
 
1167
  last_pc = read_register (PC_REGNUM);
1168
}
1169
 
1170
/* Collect trace data from the target board and format it into a form
1171
   more useful for display.  */
1172
 
1173
void
1174
d30v_eva_get_trace_data (void)
1175
{
1176
  int count, i, j, oldsize;
1177
  int trace_addr, trace_seg, trace_cnt, next_cnt;
1178
  unsigned int last_trace, trace_word, next_word;
1179
  unsigned int *tmpspace;
1180
 
1181
  if (!tracing)
1182
    return;
1183
 
1184
  tmpspace = xmalloc (65536 * sizeof (unsigned int));
1185
 
1186
  last_trace = read_memory_unsigned_integer (DBBC_ADDR, 2) << 2;
1187
 
1188
  /* Collect buffer contents from the target, stopping when we reach
1189
     the word recorded when execution resumed.  */
1190
 
1191
  count = 0;
1192
  while (last_trace > 0)
1193
    {
1194
      QUIT;
1195
      trace_word =
1196
        read_memory_unsigned_integer (TRACE_BUFFER_BASE + last_trace, 4);
1197
      trace_addr = trace_word & 0xffff;
1198
      last_trace -= 4;
1199
      /* Ignore an apparently nonsensical entry.  */
1200
      if (trace_addr == 0xffd5)
1201
        continue;
1202
      tmpspace[count++] = trace_word;
1203
      if (trace_addr == last_pc)
1204
        break;
1205
      if (count > 65535)
1206
        break;
1207
    }
1208
 
1209
  /* Move the data to the host-side trace buffer, adjusting counts to
1210
     include the last instruction executed and transforming the address
1211
     into something that GDB likes.  */
1212
 
1213
  for (i = 0; i < count; ++i)
1214
    {
1215
      trace_word = tmpspace[i];
1216
      next_word = ((i == 0) ? 0 : tmpspace[i - 1]);
1217
      trace_addr = trace_word & 0xffff;
1218
      next_cnt = (next_word >> 24) & 0xff;
1219
      j = trace_data.size + count - i - 1;
1220
      trace_data.addrs[j] = (trace_addr << 2) + 0x1000000;
1221
      trace_data.counts[j] = next_cnt + 1;
1222
    }
1223
 
1224
  oldsize = trace_data.size;
1225
  trace_data.size += count;
1226
 
1227
  xfree (tmpspace);
1228
 
1229
  if (trace_display)
1230
    display_trace (oldsize, trace_data.size);
1231
}
1232
 
1233
static void
1234
tdisassemble_command (char *arg, int from_tty)
1235
{
1236
  int i, count;
1237
  CORE_ADDR low, high;
1238
  char *space_index;
1239
 
1240
  if (!arg)
1241
    {
1242
      low = 0;
1243
      high = trace_data.size;
1244
    }
1245
  else if (!(space_index = (char *) strchr (arg, ' ')))
1246
    {
1247
      low = parse_and_eval_address (arg);
1248
      high = low + 5;
1249
    }
1250
  else
1251
    {
1252
      /* Two arguments.  */
1253
      *space_index = '\0';
1254
      low = parse_and_eval_address (arg);
1255
      high = parse_and_eval_address (space_index + 1);
1256
      if (high < low)
1257
        high = low;
1258
    }
1259
 
1260
  printf_filtered ("Dump of trace from %s to %s:\n",
1261
                   paddr_u (low),
1262
                   paddr_u (high));
1263
 
1264
  display_trace (low, high);
1265
 
1266
  printf_filtered ("End of trace dump.\n");
1267
  gdb_flush (gdb_stdout);
1268
}
1269
 
1270
static void
1271
display_trace (int low, int high)
1272
{
1273
  int i, count, trace_show_source, first, suppress;
1274
  CORE_ADDR next_address;
1275
 
1276
  trace_show_source = default_trace_show_source;
1277
  if (!have_full_symbols () && !have_partial_symbols ())
1278
    {
1279
      trace_show_source = 0;
1280
      printf_filtered ("No symbol table is loaded.  Use the \"file\" command.\n");
1281
      printf_filtered ("Trace will not display any source.\n");
1282
    }
1283
 
1284
  first = 1;
1285
  suppress = 0;
1286
  for (i = low; i < high; ++i)
1287
    {
1288
      next_address = trace_data.addrs[i];
1289
      count = trace_data.counts[i];
1290
      while (count-- > 0)
1291
        {
1292
          QUIT;
1293
          if (trace_show_source)
1294
            {
1295
              struct symtab_and_line sal, sal_prev;
1296
 
1297
              sal_prev = find_pc_line (next_address - 4, 0);
1298
              sal = find_pc_line (next_address, 0);
1299
 
1300
              if (sal.symtab)
1301
                {
1302
                  if (first || sal.line != sal_prev.line)
1303
                    print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
1304
                  suppress = 0;
1305
                }
1306
              else
1307
                {
1308
                  if (!suppress)
1309
                    /* FIXME-32x64--assumes sal.pc fits in long.  */
1310
                    printf_filtered ("No source file for address %s.\n",
1311
                                 local_hex_string ((unsigned long) sal.pc));
1312
                  suppress = 1;
1313
                }
1314
            }
1315
          first = 0;
1316
          print_address (next_address, gdb_stdout);
1317
          printf_filtered (":");
1318
          printf_filtered ("\t");
1319
          wrap_here ("    ");
1320
          next_address = next_address + print_insn (next_address, gdb_stdout);
1321
          printf_filtered ("\n");
1322
          gdb_flush (gdb_stdout);
1323
        }
1324
    }
1325
}
1326
 
1327
extern void (*target_resume_hook) (void);
1328
extern void (*target_wait_loop_hook) (void);
1329
 
1330
void
1331
_initialize_d30v_tdep (void)
1332
{
1333
  tm_print_insn = print_insn_d30v;
1334
 
1335
  target_resume_hook = d30v_eva_prepare_to_trace;
1336
  target_wait_loop_hook = d30v_eva_get_trace_data;
1337
 
1338
  add_info ("flags", print_flags_command, "Print d30v flags.");
1339
 
1340
  add_com ("trace", class_support, trace_command,
1341
           "Enable tracing of instruction execution.");
1342
 
1343
  add_com ("untrace", class_support, untrace_command,
1344
           "Disable tracing of instruction execution.");
1345
 
1346
  add_com ("tdisassemble", class_vars, tdisassemble_command,
1347
           "Disassemble the trace buffer.\n\
1348
Two optional arguments specify a range of trace buffer entries\n\
1349
as reported by info trace (NOT addresses!).");
1350
 
1351
  add_info ("trace", trace_info,
1352
            "Display info about the trace data buffer.");
1353
 
1354
  add_show_from_set (add_set_cmd ("tracedisplay", no_class,
1355
                                  var_integer, (char *) &trace_display,
1356
                             "Set automatic display of trace.\n", &setlist),
1357
                     &showlist);
1358
  add_show_from_set (add_set_cmd ("tracesource", no_class,
1359
                           var_integer, (char *) &default_trace_show_source,
1360
                      "Set display of source code with trace.\n", &setlist),
1361
                     &showlist);
1362
 
1363
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.