1 /* Target-dependent code for Mitsubishi D30V, for GDB.
2 Copyright (C) 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /* Contributed by Martin Hunt, hunt@cygnus.com */
30 #include "gdb_string.h"
38 #include "language.h" /* For local_hex_string() */
40 void d30v_frame_find_saved_regs (struct frame_info
*fi
,
41 struct frame_saved_regs
*fsr
);
42 void d30v_frame_find_saved_regs_offsets (struct frame_info
*fi
,
43 struct frame_saved_regs
*fsr
);
44 static void d30v_pop_dummy_frame (struct frame_info
*fi
);
45 static void d30v_print_flags (void);
46 static void print_flags_command (char *, int);
48 /* the following defines assume:
49 fp is r61, lr is r62, sp is r63, and ?? is r22
50 if that changes, they will need to be updated */
52 #define OP_MASK_ALL_BUT_RA 0x0ffc0fff /* throw away Ra, keep the rest */
54 #define OP_STW_SPM 0x054c0fc0 /* stw Ra, @(sp-) */
55 #define OP_STW_SP_R0 0x05400fc0 /* stw Ra, @(sp,r0) */
56 #define OP_STW_SP_IMM0 0x05480fc0 /* st Ra, @(sp, 0x0) */
57 #define OP_STW_R22P_R0 0x05440580 /* stw Ra, @(r22+,r0) */
59 #define OP_ST2W_SPM 0x056c0fc0 /* st2w Ra, @(sp-) */
60 #define OP_ST2W_SP_R0 0x05600fc0 /* st2w Ra, @(sp, r0) */
61 #define OP_ST2W_SP_IMM0 0x05680fc0 /* st2w Ra, @(sp, 0x0) */
62 #define OP_ST2W_R22P_R0 0x05640580 /* st2w Ra, @(r22+, r0) */
64 #define OP_MASK_OPCODE 0x0ffc0000 /* just the opcode, ign operands */
65 #define OP_NOP 0x00f00000 /* nop */
67 #define OP_MASK_ALL_BUT_IMM 0x0fffffc0 /* throw away imm, keep the rest */
68 #define OP_SUB_SP_IMM 0x082bffc0 /* sub sp,sp,imm */
69 #define OP_ADD_SP_IMM 0x080bffc0 /* add sp,sp,imm */
70 #define OP_ADD_R22_SP_IMM 0x08096fc0 /* add r22,sp,imm */
71 #define OP_STW_FP_SP_IMM 0x054bdfc0 /* stw fp,@(sp,imm) */
72 #define OP_OR_SP_R0_IMM 0x03abf000 /* or sp,r0,imm */
75 #define OP_OR_FP_R0_SP 0x03a3d03f /* or fp,r0,sp */
76 #define OP_OR_FP_SP_R0 0x03a3dfc0 /* or fp,sp,r0 */
77 #define OP_OR_FP_IMM0_SP 0x03abd03f /* or fp,0x0,sp */
78 #define OP_STW_FP_R22P_R0 0x0547d580 /* stw fp,@(r22+,r0) */
79 #define OP_STW_LR_R22P_R0 0x0547e580 /* stw lr,@(r22+,r0) */
81 #define OP_MASK_OP_AND_RB 0x0ff80fc0 /* keep op and rb,throw away rest */
82 #define OP_STW_SP_IMM 0x05480fc0 /* stw Ra,@(sp,imm) */
83 #define OP_ST2W_SP_IMM 0x05680fc0 /* st2w Ra,@(sp,imm) */
84 #define OP_STW_FP_IMM 0x05480f40 /* stw Ra,@(fp,imm) */
85 #define OP_STW_FP_R0 0x05400f40 /* stw Ra,@(fp,r0) */
87 #define OP_MASK_FM_BIT 0x80000000
88 #define OP_MASK_CC_BITS 0x70000000
89 #define OP_MASK_SUB_INST 0x0fffffff
91 #define EXTRACT_RA(op) (((op) >> 12) & 0x3f)
92 #define EXTRACT_RB(op) (((op) >> 6) & 0x3f)
93 #define EXTRACT_RC(op) (((op) & 0x3f)
94 #define EXTRACT_UIMM6(op) ((op) & 0x3f)
95 #define EXTRACT_IMM6(op) ((((int)EXTRACT_UIMM6(op)) << 26) >> 26)
96 #define EXTRACT_IMM26(op) ((((op)&0x0ff00000) >> 2) | ((op)&0x0003ffff))
97 #define EXTRACT_IMM32(opl, opr) ((EXTRACT_UIMM6(opl) << 26)|EXTRACT_IMM26(opr))
101 d30v_frame_chain_valid (CORE_ADDR chain
, struct frame_info
*fi
)
104 return ((chain
) != 0 && (fi
) != 0 && (fi
)->return_pc
!= 0);
106 return ((chain
) != 0 && (fi
) != 0 && (fi
)->frame
<= chain
);
110 /* Discard from the stack the innermost frame, restoring all saved
114 d30v_pop_frame (void)
116 struct frame_info
*frame
= get_current_frame ();
119 struct frame_saved_regs fsr
;
122 fp
= FRAME_FP (frame
);
125 d30v_pop_dummy_frame (frame
);
129 /* fill out fsr with the address of where each */
130 /* register was stored in the frame */
131 get_frame_saved_regs (frame
, &fsr
);
133 /* now update the current registers with the old values */
134 for (regnum
= A0_REGNUM
; regnum
< A0_REGNUM
+ 2; regnum
++)
136 if (fsr
.regs
[regnum
])
138 read_memory (fsr
.regs
[regnum
], raw_buffer
, 8);
139 write_register_bytes (REGISTER_BYTE (regnum
), raw_buffer
, 8);
142 for (regnum
= 0; regnum
< SP_REGNUM
; regnum
++)
144 if (fsr
.regs
[regnum
])
146 write_register (regnum
, read_memory_unsigned_integer (fsr
.regs
[regnum
], 4));
149 if (fsr
.regs
[PSW_REGNUM
])
151 write_register (PSW_REGNUM
, read_memory_unsigned_integer (fsr
.regs
[PSW_REGNUM
], 4));
154 write_register (PC_REGNUM
, read_register (LR_REGNUM
));
155 write_register (SP_REGNUM
, fp
+ frame
->size
);
156 target_store_registers (-1);
157 flush_cached_frames ();
161 check_prologue (unsigned long op
)
163 /* add sp,sp,imm -- observed */
164 if ((op
& OP_MASK_ALL_BUT_IMM
) == OP_ADD_SP_IMM
)
167 /* add r22,sp,imm -- observed */
168 if ((op
& OP_MASK_ALL_BUT_IMM
) == OP_ADD_R22_SP_IMM
)
171 /* or fp,r0,sp -- observed */
172 if (op
== OP_OR_FP_R0_SP
)
176 if ((op
& OP_MASK_OPCODE
) == OP_NOP
)
179 /* stw Ra,@(sp,r0) */
180 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_STW_SP_R0
)
183 /* stw Ra,@(sp,0x0) */
184 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_STW_SP_IMM0
)
187 /* st2w Ra,@(sp,r0) */
188 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_ST2W_SP_R0
)
191 /* st2w Ra,@(sp,0x0) */
192 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_ST2W_SP_IMM0
)
195 /* stw fp, @(r22+,r0) -- observed */
196 if (op
== OP_STW_FP_R22P_R0
)
199 /* stw r62, @(r22+,r0) -- observed */
200 if (op
== OP_STW_LR_R22P_R0
)
203 /* stw Ra, @(fp,r0) -- observed */
204 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_STW_FP_R0
)
205 return 1; /* first arg */
207 /* stw Ra, @(fp,imm) -- observed */
208 if ((op
& OP_MASK_OP_AND_RB
) == OP_STW_FP_IMM
)
209 return 1; /* second and subsequent args */
211 /* stw fp,@(sp,imm) -- observed */
212 if ((op
& OP_MASK_ALL_BUT_IMM
) == OP_STW_FP_SP_IMM
)
215 /* st2w Ra,@(r22+,r0) */
216 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_ST2W_R22P_R0
)
220 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_STW_SPM
)
223 /* st2w Ra, @(sp-) */
224 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_ST2W_SPM
)
227 /* sub.? sp,sp,imm */
228 if ((op
& OP_MASK_ALL_BUT_IMM
) == OP_SUB_SP_IMM
)
235 d30v_skip_prologue (CORE_ADDR pc
)
238 unsigned long opl
, opr
; /* left / right sub operations */
239 unsigned long fm0
, fm1
; /* left / right mode bits */
240 unsigned long cc0
, cc1
;
241 unsigned long op1
, op2
;
242 CORE_ADDR func_addr
, func_end
;
243 struct symtab_and_line sal
;
245 /* If we have line debugging information, then the end of the */
246 /* prologue should the first assembly instruction of the first source line */
247 if (find_pc_partial_function (pc
, NULL
, &func_addr
, &func_end
))
249 sal
= find_pc_line (func_addr
, 0);
250 if (sal
.end
&& sal
.end
< func_end
)
254 if (target_read_memory (pc
, (char *) &op
[0], 8))
255 return pc
; /* Can't access it -- assume no prologue. */
259 opl
= (unsigned long) read_memory_integer (pc
, 4);
260 opr
= (unsigned long) read_memory_integer (pc
+ 4, 4);
262 fm0
= (opl
& OP_MASK_FM_BIT
);
263 fm1
= (opr
& OP_MASK_FM_BIT
);
265 cc0
= (opl
& OP_MASK_CC_BITS
);
266 cc1
= (opr
& OP_MASK_CC_BITS
);
268 opl
= (opl
& OP_MASK_SUB_INST
);
269 opr
= (opr
& OP_MASK_SUB_INST
);
273 /* long instruction (opl contains the opcode) */
274 if (((opl
& OP_MASK_ALL_BUT_IMM
) != OP_ADD_SP_IMM
) && /* add sp,sp,imm */
275 ((opl
& OP_MASK_ALL_BUT_IMM
) != OP_ADD_R22_SP_IMM
) && /* add r22,sp,imm */
276 ((opl
& OP_MASK_OP_AND_RB
) != OP_STW_SP_IMM
) && /* stw Ra, @(sp,imm) */
277 ((opl
& OP_MASK_OP_AND_RB
) != OP_ST2W_SP_IMM
)) /* st2w Ra, @(sp,imm) */
282 /* short instructions */
293 if (check_prologue (op1
))
295 if (!check_prologue (op2
))
297 /* if the previous opcode was really part of the prologue */
298 /* and not just a NOP, then we want to break after both instructions */
299 if ((op1
& OP_MASK_OPCODE
) != OP_NOP
)
312 static int end_of_stack
;
314 /* Given a GDB frame, determine the address of the calling function's frame.
315 This will be used to create a new GDB frame struct, and then
316 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
320 d30v_frame_chain (struct frame_info
*frame
)
322 struct frame_saved_regs fsr
;
324 d30v_frame_find_saved_regs (frame
, &fsr
);
327 return (CORE_ADDR
) 0;
329 if (frame
->return_pc
== IMEM_START
)
330 return (CORE_ADDR
) 0;
332 if (!fsr
.regs
[FP_REGNUM
])
334 if (!fsr
.regs
[SP_REGNUM
] || fsr
.regs
[SP_REGNUM
] == STACK_START
)
335 return (CORE_ADDR
) 0;
337 return fsr
.regs
[SP_REGNUM
];
340 if (!read_memory_unsigned_integer (fsr
.regs
[FP_REGNUM
], 4))
341 return (CORE_ADDR
) 0;
343 return read_memory_unsigned_integer (fsr
.regs
[FP_REGNUM
], 4);
346 static int next_addr
, uses_frame
;
347 static int frame_size
;
350 prologue_find_regs (unsigned long op
, struct frame_saved_regs
*fsr
,
356 /* add sp,sp,imm -- observed */
357 if ((op
& OP_MASK_ALL_BUT_IMM
) == OP_ADD_SP_IMM
)
359 offset
= EXTRACT_IMM6 (op
);
360 /*next_addr += offset; */
361 frame_size
+= -offset
;
365 /* add r22,sp,imm -- observed */
366 if ((op
& OP_MASK_ALL_BUT_IMM
) == OP_ADD_R22_SP_IMM
)
368 offset
= EXTRACT_IMM6 (op
);
369 next_addr
= (offset
- frame_size
);
373 /* stw Ra, @(fp, offset) -- observed */
374 if ((op
& OP_MASK_OP_AND_RB
) == OP_STW_FP_IMM
)
377 offset
= EXTRACT_IMM6 (op
);
378 fsr
->regs
[n
] = (offset
- frame_size
);
382 /* stw Ra, @(fp, r0) -- observed */
383 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_STW_FP_R0
)
386 fsr
->regs
[n
] = (-frame_size
);
390 /* or fp,0,sp -- observed */
391 if ((op
== OP_OR_FP_R0_SP
) ||
392 (op
== OP_OR_FP_SP_R0
) ||
393 (op
== OP_OR_FP_IMM0_SP
))
400 if ((op
& OP_MASK_OPCODE
) == OP_NOP
)
403 /* stw Ra,@(r22+,r0) -- observed */
404 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_STW_R22P_R0
)
407 fsr
->regs
[n
] = next_addr
;
411 #if 0 /* subsumed in pattern above */
412 /* stw fp,@(r22+,r0) -- observed */
413 if (op
== OP_STW_FP_R22P_R0
)
415 fsr
->regs
[FP_REGNUM
] = next_addr
; /* XXX */
420 /* stw r62,@(r22+,r0) -- observed */
421 if (op
== OP_STW_LR_R22P_R0
)
423 fsr
->regs
[LR_REGNUM
] = next_addr
;
428 /* st2w Ra,@(r22+,r0) -- observed */
429 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_ST2W_R22P_R0
)
432 fsr
->regs
[n
] = next_addr
;
433 fsr
->regs
[n
+ 1] = next_addr
+ 4;
439 if ((op
& OP_MASK_ALL_BUT_RA
) == OP_STW_SPM
)
442 fsr
->regs
[n
] = next_addr
;
447 /* st2w Ra, @(sp-) */
448 else if ((op
& OP_MASK_ALL_BUT_RA
) == OP_ST2W_SPM
)
451 fsr
->regs
[n
] = next_addr
;
452 fsr
->regs
[n
+ 1] = next_addr
+ 4;
458 if ((op
& OP_MASK_ALL_BUT_IMM
) == OP_SUB_SP_IMM
)
460 offset
= EXTRACT_IMM6 (op
);
461 frame_size
+= -offset
;
465 /* st rn, @(sp,0) -- observed */
466 if (((op
& OP_MASK_ALL_BUT_RA
) == OP_STW_SP_R0
) ||
467 ((op
& OP_MASK_ALL_BUT_RA
) == OP_STW_SP_IMM0
))
470 fsr
->regs
[n
] = (-frame_size
);
474 /* st2w rn, @(sp,0) */
475 if (((op
& OP_MASK_ALL_BUT_RA
) == OP_ST2W_SP_R0
) ||
476 ((op
& OP_MASK_ALL_BUT_RA
) == OP_ST2W_SP_IMM0
))
479 fsr
->regs
[n
] = (-frame_size
);
480 fsr
->regs
[n
+ 1] = (-frame_size
) + 4;
484 /* stw fp,@(sp,imm) -- observed */
485 if ((op
& OP_MASK_ALL_BUT_IMM
) == OP_STW_FP_SP_IMM
)
487 offset
= EXTRACT_IMM6 (op
);
488 fsr
->regs
[FP_REGNUM
] = (offset
- frame_size
);
494 /* Put here the code to store, into a struct frame_saved_regs, the
495 addresses of the saved registers of frame described by FRAME_INFO.
496 This includes special registers such as pc and fp saved in special
497 ways in the stack frame. sp is even more special: the address we
498 return for it IS the sp for the next frame. */
500 d30v_frame_find_saved_regs (struct frame_info
*fi
, struct frame_saved_regs
*fsr
)
503 unsigned long opl
, opr
;
504 unsigned long op1
, op2
;
505 unsigned long fm0
, fm1
;
509 memset (fsr
, 0, sizeof (*fsr
));
516 d30v_frame_find_saved_regs_offsets (fi
, fsr
);
518 fi
->size
= frame_size
;
521 fp
= read_register (SP_REGNUM
);
523 for (i
= 0; i
< NUM_REGS
- 1; i
++)
526 fsr
->regs
[i
] = fsr
->regs
[i
] + fp
+ frame_size
;
529 if (fsr
->regs
[LR_REGNUM
])
530 fi
->return_pc
= read_memory_unsigned_integer (fsr
->regs
[LR_REGNUM
], 4);
532 fi
->return_pc
= read_register (LR_REGNUM
);
534 /* the SP is not normally (ever?) saved, but check anyway */
535 if (!fsr
->regs
[SP_REGNUM
])
537 /* if the FP was saved, that means the current FP is valid, */
538 /* otherwise, it isn't being used, so we use the SP instead */
540 fsr
->regs
[SP_REGNUM
] = read_register (FP_REGNUM
) + fi
->size
;
543 fsr
->regs
[SP_REGNUM
] = fp
+ fi
->size
;
545 fsr
->regs
[FP_REGNUM
] = 0;
551 d30v_frame_find_saved_regs_offsets (struct frame_info
*fi
,
552 struct frame_saved_regs
*fsr
)
555 unsigned long opl
, opr
;
556 unsigned long op1
, op2
;
557 unsigned long fm0
, fm1
;
561 memset (fsr
, 0, sizeof (*fsr
));
566 pc
= get_pc_function_start (fi
->pc
);
571 opl
= (unsigned long) read_memory_integer (pc
, 4);
572 opr
= (unsigned long) read_memory_integer (pc
+ 4, 4);
574 fm0
= (opl
& OP_MASK_FM_BIT
);
575 fm1
= (opr
& OP_MASK_FM_BIT
);
577 opl
= (opl
& OP_MASK_SUB_INST
);
578 opr
= (opr
& OP_MASK_SUB_INST
);
582 /* long instruction */
583 if ((opl
& OP_MASK_ALL_BUT_IMM
) == OP_ADD_SP_IMM
)
586 long offset
= EXTRACT_IMM32 (opl
, opr
);
587 frame_size
+= -offset
;
589 else if ((opl
& OP_MASK_ALL_BUT_IMM
) == OP_ADD_R22_SP_IMM
)
591 /* add r22,sp,offset */
592 long offset
= EXTRACT_IMM32 (opl
, opr
);
593 next_addr
= (offset
- frame_size
);
595 else if ((opl
& OP_MASK_OP_AND_RB
) == OP_STW_SP_IMM
)
597 /* st Ra, @(sp,imm) */
598 long offset
= EXTRACT_IMM32 (opl
, opr
);
599 short n
= EXTRACT_RA (opl
);
600 fsr
->regs
[n
] = (offset
- frame_size
);
602 else if ((opl
& OP_MASK_OP_AND_RB
) == OP_ST2W_SP_IMM
)
604 /* st2w Ra, @(sp,offset) */
605 long offset
= EXTRACT_IMM32 (opl
, opr
);
606 short n
= EXTRACT_RA (opl
);
607 fsr
->regs
[n
] = (offset
- frame_size
);
608 fsr
->regs
[n
+ 1] = (offset
- frame_size
) + 4;
610 else if ((opl
& OP_MASK_ALL_BUT_IMM
) == OP_OR_SP_R0_IMM
)
619 /* short instructions */
630 if (!prologue_find_regs (op1
, fsr
, pc
) || !prologue_find_regs (op2
, fsr
, pc
))
637 fi
->size
= frame_size
;
640 fp
= read_register (SP_REGNUM
);
642 for (i
= 0; i
< NUM_REGS
- 1; i
++)
645 fsr
->regs
[i
] = fsr
->regs
[i
] + fp
+ frame_size
;
648 if (fsr
->regs
[LR_REGNUM
])
649 fi
->return_pc
= read_memory_unsigned_integer (fsr
->regs
[LR_REGNUM
], 4);
651 fi
->return_pc
= read_register (LR_REGNUM
);
653 /* the SP is not normally (ever?) saved, but check anyway */
654 if (!fsr
->regs
[SP_REGNUM
])
656 /* if the FP was saved, that means the current FP is valid, */
657 /* otherwise, it isn't being used, so we use the SP instead */
659 fsr
->regs
[SP_REGNUM
] = read_register (FP_REGNUM
) + fi
->size
;
662 fsr
->regs
[SP_REGNUM
] = fp
+ fi
->size
;
664 fsr
->regs
[FP_REGNUM
] = 0;
671 d30v_init_extra_frame_info (int fromleaf
, struct frame_info
*fi
)
673 struct frame_saved_regs dummy
;
675 if (fi
->next
&& (fi
->pc
== 0))
676 fi
->pc
= fi
->next
->return_pc
;
678 d30v_frame_find_saved_regs_offsets (fi
, &dummy
);
685 if ((fi
->next
== 0) && (uses_frame
== 0))
686 /* innermost frame and it's "frameless",
687 so the fi->frame field is wrong, fix it! */
688 fi
->frame
= read_sp ();
690 if (dummy
.regs
[LR_REGNUM
])
692 /* it was saved, grab it! */
693 dummy
.regs
[LR_REGNUM
] += (fi
->frame
+ frame_size
);
694 fi
->return_pc
= read_memory_unsigned_integer (dummy
.regs
[LR_REGNUM
], 4);
697 fi
->return_pc
= read_register (LR_REGNUM
);
701 d30v_init_frame_pc (int fromleaf
, struct frame_info
*prev
)
703 /* default value, put here so we can breakpoint on it and
704 see if the default value is really the right thing to use */
705 prev
->pc
= (fromleaf
? SAVED_PC_AFTER_CALL (prev
->next
) : \
706 prev
->next
? FRAME_SAVED_PC (prev
->next
) : read_pc ());
709 static void d30v_print_register (int regnum
, int tabular
);
712 d30v_print_register (int regnum
, int tabular
)
714 if (regnum
< A0_REGNUM
)
717 printf_filtered ("%08lx", (long) read_register (regnum
));
719 printf_filtered ("0x%lx %ld",
720 (long) read_register (regnum
),
721 (long) read_register (regnum
));
725 char regbuf
[MAX_REGISTER_RAW_SIZE
];
727 read_relative_register_raw_bytes (regnum
, regbuf
);
729 val_print (REGISTER_VIRTUAL_TYPE (regnum
), regbuf
, 0, 0,
730 gdb_stdout
, 'x', 1, 0, Val_pretty_default
);
734 printf_filtered (" ");
735 val_print (REGISTER_VIRTUAL_TYPE (regnum
), regbuf
, 0, 0,
736 gdb_stdout
, 'd', 1, 0, Val_pretty_default
);
742 d30v_print_flags (void)
744 long psw
= read_register (PSW_REGNUM
);
745 printf_filtered ("flags #1");
746 printf_filtered (" (sm) %d", (psw
& PSW_SM
) != 0);
747 printf_filtered (" (ea) %d", (psw
& PSW_EA
) != 0);
748 printf_filtered (" (db) %d", (psw
& PSW_DB
) != 0);
749 printf_filtered (" (ds) %d", (psw
& PSW_DS
) != 0);
750 printf_filtered (" (ie) %d", (psw
& PSW_IE
) != 0);
751 printf_filtered (" (rp) %d", (psw
& PSW_RP
) != 0);
752 printf_filtered (" (md) %d\n", (psw
& PSW_MD
) != 0);
754 printf_filtered ("flags #2");
755 printf_filtered (" (f0) %d", (psw
& PSW_F0
) != 0);
756 printf_filtered (" (f1) %d", (psw
& PSW_F1
) != 0);
757 printf_filtered (" (f2) %d", (psw
& PSW_F2
) != 0);
758 printf_filtered (" (f3) %d", (psw
& PSW_F3
) != 0);
759 printf_filtered (" (s) %d", (psw
& PSW_S
) != 0);
760 printf_filtered (" (v) %d", (psw
& PSW_V
) != 0);
761 printf_filtered (" (va) %d", (psw
& PSW_VA
) != 0);
762 printf_filtered (" (c) %d\n", (psw
& PSW_C
) != 0);
766 print_flags_command (char *args
, int from_tty
)
772 d30v_do_registers_info (int regnum
, int fpregs
)
774 long long num1
, num2
;
779 if (REGISTER_NAME (0) == NULL
|| REGISTER_NAME (0)[0] == '\000')
782 printf_filtered ("%s ", REGISTER_NAME (regnum
));
783 d30v_print_register (regnum
, 0);
785 printf_filtered ("\n");
789 /* Have to print all the registers. Format them nicely. */
791 printf_filtered ("PC=");
792 print_address (read_pc (), gdb_stdout
);
794 printf_filtered (" PSW=");
795 d30v_print_register (PSW_REGNUM
, 1);
797 printf_filtered (" BPC=");
798 print_address (read_register (BPC_REGNUM
), gdb_stdout
);
800 printf_filtered (" BPSW=");
801 d30v_print_register (BPSW_REGNUM
, 1);
802 printf_filtered ("\n");
804 printf_filtered ("DPC=");
805 print_address (read_register (DPC_REGNUM
), gdb_stdout
);
807 printf_filtered (" DPSW=");
808 d30v_print_register (DPSW_REGNUM
, 1);
810 printf_filtered (" IBA=");
811 print_address (read_register (IBA_REGNUM
), gdb_stdout
);
812 printf_filtered ("\n");
814 printf_filtered ("RPT_C=");
815 d30v_print_register (RPT_C_REGNUM
, 1);
817 printf_filtered (" RPT_S=");
818 print_address (read_register (RPT_S_REGNUM
), gdb_stdout
);
820 printf_filtered (" RPT_E=");
821 print_address (read_register (RPT_E_REGNUM
), gdb_stdout
);
822 printf_filtered ("\n");
824 printf_filtered ("MOD_S=");
825 print_address (read_register (MOD_S_REGNUM
), gdb_stdout
);
827 printf_filtered (" MOD_E=");
828 print_address (read_register (MOD_E_REGNUM
), gdb_stdout
);
829 printf_filtered ("\n");
831 printf_filtered ("EIT_VB=");
832 print_address (read_register (EIT_VB_REGNUM
), gdb_stdout
);
834 printf_filtered (" INT_S=");
835 d30v_print_register (INT_S_REGNUM
, 1);
837 printf_filtered (" INT_M=");
838 d30v_print_register (INT_M_REGNUM
, 1);
839 printf_filtered ("\n");
842 for (regnum
= 0; regnum
<= 63;)
846 printf_filtered ("R%d-R%d ", regnum
, regnum
+ 7);
848 printf_filtered (" ");
850 printf_filtered (" ");
852 for (i
= 0; i
< 8; i
++)
854 printf_filtered (" ");
855 d30v_print_register (regnum
++, 1);
858 printf_filtered ("\n");
861 printf_filtered ("A0-A1 ");
863 d30v_print_register (A0_REGNUM
, 1);
864 printf_filtered (" ");
865 d30v_print_register (A1_REGNUM
, 1);
866 printf_filtered ("\n");
870 d30v_fix_call_dummy (char *dummyname
, CORE_ADDR start_sp
, CORE_ADDR fun
,
871 int nargs
, value_ptr
*args
, struct type
*type
, int gcc_p
)
875 char buffer
[MAX_REGISTER_RAW_SIZE
];
876 struct frame_info
*frame
= get_current_frame ();
877 frame
->dummy
= start_sp
;
878 /*start_sp |= DMEM_START; */
881 for (regnum
= 0; regnum
< NUM_REGS
; regnum
++)
883 sp
-= REGISTER_RAW_SIZE (regnum
);
884 store_address (buffer
, REGISTER_RAW_SIZE (regnum
), read_register (regnum
));
885 write_memory (sp
, buffer
, REGISTER_RAW_SIZE (regnum
));
887 write_register (SP_REGNUM
, (LONGEST
) sp
);
888 /* now we need to load LR with the return address */
889 write_register (LR_REGNUM
, (LONGEST
) d30v_call_dummy_address ());
894 d30v_pop_dummy_frame (struct frame_info
*fi
)
896 CORE_ADDR sp
= fi
->dummy
;
899 for (regnum
= 0; regnum
< NUM_REGS
; regnum
++)
901 sp
-= REGISTER_RAW_SIZE (regnum
);
902 write_register (regnum
, read_memory_unsigned_integer (sp
, REGISTER_RAW_SIZE (regnum
)));
904 flush_cached_frames (); /* needed? */
909 d30v_push_arguments (int nargs
, value_ptr
*args
, CORE_ADDR sp
,
910 int struct_return
, CORE_ADDR struct_addr
)
912 int i
, len
, index
= 0, regnum
= 2;
913 char buffer
[4], *contents
;
918 /* Pass 1. Put all large args on stack */
919 for (i
= 0; i
< nargs
; i
++)
921 value_ptr arg
= args
[i
];
922 struct type
*arg_type
= check_typedef (VALUE_TYPE (arg
));
923 len
= TYPE_LENGTH (arg_type
);
924 contents
= VALUE_CONTENTS (arg
);
925 val
= extract_signed_integer (contents
, len
);
928 /* put on stack and pass pointers */
930 write_memory (sp
, contents
, len
);
937 for (i
= 0; i
< nargs
; i
++)
939 value_ptr arg
= args
[i
];
940 struct type
*arg_type
= check_typedef (VALUE_TYPE (arg
));
941 len
= TYPE_LENGTH (arg_type
);
942 contents
= VALUE_CONTENTS (arg
);
945 /* we need multiple registers */
948 for (ndx
= 0; len
> 0; ndx
+= 8, len
-= 8)
951 regnum
++; /* all args > 4 bytes start in even register */
955 val
= extract_signed_integer (&contents
[ndx
], 4);
956 write_register (regnum
++, val
);
959 val
= extract_signed_integer (&contents
[ndx
+ 4], 4);
961 val
= extract_signed_integer (&contents
[ndx
+ 4], len
- 4);
962 write_register (regnum
++, val
);
966 /* no more registers available. put it on the stack */
968 /* all args > 4 bytes are padded to a multiple of 8 bytes
969 and start on an 8 byte boundary */
971 sp
-= (sp
& 7); /* align it */
973 sp
-= ((len
+ 7) & ~7); /* allocate space */
974 write_memory (sp
, &contents
[ndx
], len
);
983 val
= extract_signed_integer (contents
, len
);
984 write_register (regnum
++, val
);
988 /* all args are padded to a multiple of 4 bytes (at least) */
989 sp
-= ((len
+ 3) & ~3);
990 write_memory (sp
, contents
, len
);
995 /* stack pointer is not on an 8 byte boundary -- align it */
1001 /* pick an out-of-the-way place to set the return value */
1002 /* for an inferior function call. The link register is set to this */
1003 /* value and a momentary breakpoint is set there. When the breakpoint */
1004 /* is hit, the dummy frame is popped and the previous environment is */
1008 d30v_call_dummy_address (void)
1011 struct minimal_symbol
*sym
;
1013 entry
= entry_point_address ();
1018 sym
= lookup_minimal_symbol ("_start", NULL
, symfile_objfile
);
1020 if (!sym
|| MSYMBOL_TYPE (sym
) != mst_text
)
1023 return SYMBOL_VALUE_ADDRESS (sym
);
1026 /* Given a return value in `regbuf' with a type `valtype',
1027 extract and copy its value into `valbuf'. */
1030 d30v_extract_return_value (struct type
*valtype
, char regbuf
[REGISTER_BYTES
],
1033 memcpy (valbuf
, regbuf
+ REGISTER_BYTE (2), TYPE_LENGTH (valtype
));
1036 /* The following code implements access to, and display of, the D30V's
1037 instruction trace buffer. The buffer consists of 64K or more
1038 4-byte words of data, of which each words includes an 8-bit count,
1039 an 8-bit segment number, and a 16-bit instruction address.
1041 In theory, the trace buffer is continuously capturing instruction
1042 data that the CPU presents on its "debug bus", but in practice, the
1043 ROMified GDB stub only enables tracing when it continues or steps
1044 the program, and stops tracing when the program stops; so it
1045 actually works for GDB to read the buffer counter out of memory and
1046 then read each trace word. The counter records where the tracing
1047 stops, but there is no record of where it started, so we remember
1048 the PC when we resumed and then search backwards in the trace
1049 buffer for a word that includes that address. This is not perfect,
1050 because you will miss trace data if the resumption PC is the target
1051 of a branch. (The value of the buffer counter is semi-random, any
1052 trace data from a previous program stop is gone.) */
1054 /* The address of the last word recorded in the trace buffer. */
1056 #define DBBC_ADDR (0xd80000)
1058 /* The base of the trace buffer, at least for the "Board_0". */
1060 #define TRACE_BUFFER_BASE (0xf40000)
1062 static void trace_command (char *, int);
1064 static void untrace_command (char *, int);
1066 static void trace_info (char *, int);
1068 static void tdisassemble_command (char *, int);
1070 static void display_trace (int, int);
1072 /* True when instruction traces are being collected. */
1076 /* Remembered PC. */
1078 static CORE_ADDR last_pc
;
1080 /* True when trace output should be displayed whenever program stops. */
1082 static int trace_display
;
1084 /* True when trace listing should include source lines. */
1086 static int default_trace_show_source
= 1;
1097 trace_command (char *args
, int from_tty
)
1099 /* Clear the host-side trace buffer, allocating space if needed. */
1100 trace_data
.size
= 0;
1101 if (trace_data
.counts
== NULL
)
1102 trace_data
.counts
= (short *) xmalloc (65536 * sizeof (short));
1103 if (trace_data
.addrs
== NULL
)
1104 trace_data
.addrs
= (CORE_ADDR
*) xmalloc (65536 * sizeof (CORE_ADDR
));
1108 printf_filtered ("Tracing is now on.\n");
1112 untrace_command (char *args
, int from_tty
)
1116 printf_filtered ("Tracing is now off.\n");
1120 trace_info (char *args
, int from_tty
)
1124 if (trace_data
.size
)
1126 printf_filtered ("%d entries in trace buffer:\n", trace_data
.size
);
1128 for (i
= 0; i
< trace_data
.size
; ++i
)
1130 printf_filtered ("%d: %d instruction%s at 0x%s\n",
1131 i
, trace_data
.counts
[i
],
1132 (trace_data
.counts
[i
] == 1 ? "" : "s"),
1133 paddr_nz (trace_data
.addrs
[i
]));
1137 printf_filtered ("No entries in trace buffer.\n");
1139 printf_filtered ("Tracing is currently %s.\n", (tracing
? "on" : "off"));
1142 /* Print the instruction at address MEMADDR in debugged memory,
1143 on STREAM. Returns length of the instruction, in bytes. */
1146 print_insn (CORE_ADDR memaddr
, struct ui_file
*stream
)
1148 /* If there's no disassembler, something is very wrong. */
1149 if (tm_print_insn
== NULL
)
1150 internal_error (__FILE__
, __LINE__
,
1151 "print_insn: no disassembler");
1153 if (TARGET_BYTE_ORDER
== BIG_ENDIAN
)
1154 tm_print_insn_info
.endian
= BFD_ENDIAN_BIG
;
1156 tm_print_insn_info
.endian
= BFD_ENDIAN_LITTLE
;
1157 return (*tm_print_insn
) (memaddr
, &tm_print_insn_info
);
1161 d30v_eva_prepare_to_trace (void)
1166 last_pc
= read_register (PC_REGNUM
);
1169 /* Collect trace data from the target board and format it into a form
1170 more useful for display. */
1173 d30v_eva_get_trace_data (void)
1175 int count
, i
, j
, oldsize
;
1176 int trace_addr
, trace_seg
, trace_cnt
, next_cnt
;
1177 unsigned int last_trace
, trace_word
, next_word
;
1178 unsigned int *tmpspace
;
1183 tmpspace
= xmalloc (65536 * sizeof (unsigned int));
1185 last_trace
= read_memory_unsigned_integer (DBBC_ADDR
, 2) << 2;
1187 /* Collect buffer contents from the target, stopping when we reach
1188 the word recorded when execution resumed. */
1191 while (last_trace
> 0)
1195 read_memory_unsigned_integer (TRACE_BUFFER_BASE
+ last_trace
, 4);
1196 trace_addr
= trace_word
& 0xffff;
1198 /* Ignore an apparently nonsensical entry. */
1199 if (trace_addr
== 0xffd5)
1201 tmpspace
[count
++] = trace_word
;
1202 if (trace_addr
== last_pc
)
1208 /* Move the data to the host-side trace buffer, adjusting counts to
1209 include the last instruction executed and transforming the address
1210 into something that GDB likes. */
1212 for (i
= 0; i
< count
; ++i
)
1214 trace_word
= tmpspace
[i
];
1215 next_word
= ((i
== 0) ? 0 : tmpspace
[i
- 1]);
1216 trace_addr
= trace_word
& 0xffff;
1217 next_cnt
= (next_word
>> 24) & 0xff;
1218 j
= trace_data
.size
+ count
- i
- 1;
1219 trace_data
.addrs
[j
] = (trace_addr
<< 2) + 0x1000000;
1220 trace_data
.counts
[j
] = next_cnt
+ 1;
1223 oldsize
= trace_data
.size
;
1224 trace_data
.size
+= count
;
1229 display_trace (oldsize
, trace_data
.size
);
1233 tdisassemble_command (char *arg
, int from_tty
)
1236 CORE_ADDR low
, high
;
1242 high
= trace_data
.size
;
1244 else if (!(space_index
= (char *) strchr (arg
, ' ')))
1246 low
= parse_and_eval_address (arg
);
1251 /* Two arguments. */
1252 *space_index
= '\0';
1253 low
= parse_and_eval_address (arg
);
1254 high
= parse_and_eval_address (space_index
+ 1);
1259 printf_filtered ("Dump of trace from %s to %s:\n",
1263 display_trace (low
, high
);
1265 printf_filtered ("End of trace dump.\n");
1266 gdb_flush (gdb_stdout
);
1270 display_trace (int low
, int high
)
1272 int i
, count
, trace_show_source
, first
, suppress
;
1273 CORE_ADDR next_address
;
1275 trace_show_source
= default_trace_show_source
;
1276 if (!have_full_symbols () && !have_partial_symbols ())
1278 trace_show_source
= 0;
1279 printf_filtered ("No symbol table is loaded. Use the \"file\" command.\n");
1280 printf_filtered ("Trace will not display any source.\n");
1285 for (i
= low
; i
< high
; ++i
)
1287 next_address
= trace_data
.addrs
[i
];
1288 count
= trace_data
.counts
[i
];
1292 if (trace_show_source
)
1294 struct symtab_and_line sal
, sal_prev
;
1296 sal_prev
= find_pc_line (next_address
- 4, 0);
1297 sal
= find_pc_line (next_address
, 0);
1301 if (first
|| sal
.line
!= sal_prev
.line
)
1302 print_source_lines (sal
.symtab
, sal
.line
, sal
.line
+ 1, 0);
1308 /* FIXME-32x64--assumes sal.pc fits in long. */
1309 printf_filtered ("No source file for address %s.\n",
1310 local_hex_string ((unsigned long) sal
.pc
));
1315 print_address (next_address
, gdb_stdout
);
1316 printf_filtered (":");
1317 printf_filtered ("\t");
1319 next_address
= next_address
+ print_insn (next_address
, gdb_stdout
);
1320 printf_filtered ("\n");
1321 gdb_flush (gdb_stdout
);
1326 extern void (*target_resume_hook
) (void);
1327 extern void (*target_wait_loop_hook
) (void);
1330 _initialize_d30v_tdep (void)
1332 tm_print_insn
= print_insn_d30v
;
1334 target_resume_hook
= d30v_eva_prepare_to_trace
;
1335 target_wait_loop_hook
= d30v_eva_get_trace_data
;
1337 add_info ("flags", print_flags_command
, "Print d30v flags.");
1339 add_com ("trace", class_support
, trace_command
,
1340 "Enable tracing of instruction execution.");
1342 add_com ("untrace", class_support
, untrace_command
,
1343 "Disable tracing of instruction execution.");
1345 add_com ("tdisassemble", class_vars
, tdisassemble_command
,
1346 "Disassemble the trace buffer.\n\
1347 Two optional arguments specify a range of trace buffer entries\n\
1348 as reported by info trace (NOT addresses!).");
1350 add_info ("trace", trace_info
,
1351 "Display info about the trace data buffer.");
1353 add_show_from_set (add_set_cmd ("tracedisplay", no_class
,
1354 var_integer
, (char *) &trace_display
,
1355 "Set automatic display of trace.\n", &setlist
),
1357 add_show_from_set (add_set_cmd ("tracesource", no_class
,
1358 var_integer
, (char *) &default_trace_show_source
,
1359 "Set display of source code with trace.\n", &setlist
),