1 /* Target-dependent code for Mitsubishi D30V, for GDB.
2 Copyright (C) 1996, 1997 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20 /* Contributed by Martin Hunt, hunt@cygnus.com */
29 #include "gdb_string.h"
36 void d30v_frame_find_saved_regs PARAMS ((struct frame_info *fi,
37 struct frame_saved_regs *fsr));
38 void d30v_frame_find_saved_regs_offsets PARAMS ((struct frame_info *fi,
39 struct frame_saved_regs *fsr));
40 static void d30v_pop_dummy_frame PARAMS ((struct frame_info *fi));
41 static void d30v_print_flags PARAMS ((void));
42 static void print_flags_command PARAMS ((char *, int));
44 /* the following defines assume:
45 fp is r61, lr is r62, sp is r63, and ?? is r22
46 if that changes, they will need to be updated */
48 #define OP_MASK_ALL_BUT_RA 0x0ffc0fff /* throw away Ra, keep the rest */
50 #define OP_STW_SPM 0x054c0fc0 /* stw Ra, @(sp-) */
51 #define OP_STW_SP_R0 0x05400fc0 /* stw Ra, @(sp,r0) */
52 #define OP_STW_SP_IMM0 0x05480fc0 /* st Ra, @(sp, 0x0) */
53 #define OP_STW_R22P_R0 0x05440580 /* stw Ra, @(r22+,r0) */
55 #define OP_ST2W_SPM 0x056c0fc0 /* st2w Ra, @(sp-) */
56 #define OP_ST2W_SP_R0 0x05600fc0 /* st2w Ra, @(sp, r0) */
57 #define OP_ST2W_SP_IMM0 0x05680fc0 /* st2w Ra, @(sp, 0x0) */
58 #define OP_ST2W_R22P_R0 0x05640580 /* st2w Ra, @(r22+, r0) */
60 #define OP_MASK_OPCODE 0x0ffc0000 /* just the opcode, ign operands */
61 #define OP_NOP 0x00f00000 /* nop */
63 #define OP_MASK_ALL_BUT_IMM 0x0fffffc0 /* throw away imm, keep the rest */
64 #define OP_SUB_SP_IMM 0x082bffc0 /* sub sp,sp,imm */
65 #define OP_ADD_SP_IMM 0x080bffc0 /* add sp,sp,imm */
66 #define OP_ADD_R22_SP_IMM 0x08096fc0 /* add r22,sp,imm */
67 #define OP_STW_FP_SP_IMM 0x054bdfc0 /* stw fp,@(sp,imm) */
68 #define OP_OR_SP_R0_IMM 0x03abf000 /* or sp,r0,imm */
71 #define OP_OR_FP_R0_SP 0x03a3d03f /* or fp,r0,sp */
72 #define OP_OR_FP_SP_R0 0x03a3dfc0 /* or fp,sp,r0 */
73 #define OP_OR_FP_IMM0_SP 0x03abd03f /* or fp,0x0,sp */
74 #define OP_STW_FP_R22P_R0 0x0547d580 /* stw fp,@(r22+,r0) */
75 #define OP_STW_LR_R22P_R0 0x0547e580 /* stw lr,@(r22+,r0) */
77 #define OP_MASK_OP_AND_RB 0x0ff80fc0 /* keep op and rb,throw away rest */
78 #define OP_STW_SP_IMM 0x05480fc0 /* stw Ra,@(sp,imm) */
79 #define OP_ST2W_SP_IMM 0x05680fc0 /* st2w Ra,@(sp,imm) */
80 #define OP_STW_FP_IMM 0x05480f40 /* stw Ra,@(fp,imm) */
81 #define OP_STW_FP_R0 0x05400f40 /* stw Ra,@(fp,r0) */
83 #define OP_MASK_FM_BIT 0x80000000
84 #define OP_MASK_CC_BITS 0x70000000
85 #define OP_MASK_SUB_INST 0x0fffffff
87 #define EXTRACT_RA(op) (((op) >> 12) & 0x3f)
88 #define EXTRACT_RB(op) (((op) >> 6) & 0x3f)
89 #define EXTRACT_RC(op) (((op) & 0x3f)
90 #define EXTRACT_UIMM6(op) ((op) & 0x3f)
91 #define EXTRACT_IMM6(op) ((((int)EXTRACT_UIMM6(op)) << 26) >> 26)
92 #define EXTRACT_IMM26(op) ((((op)&0x0ff00000) >> 2) | ((op)&0x0003ffff))
93 #define EXTRACT_IMM32(opl, opr) ((EXTRACT_UIMM6(opl) << 26)|EXTRACT_IMM26(opr))
95 /* Discard from the stack the innermost frame, restoring all saved
101 struct frame_info *frame = get_current_frame ();
104 struct frame_saved_regs fsr;
107 fp = FRAME_FP (frame);
110 d30v_pop_dummy_frame(frame);
114 /* fill out fsr with the address of where each */
115 /* register was stored in the frame */
116 get_frame_saved_regs (frame, &fsr);
118 /* now update the current registers with the old values */
119 for (regnum = A0_REGNUM; regnum < A0_REGNUM+2 ; regnum++)
121 if (fsr.regs[regnum])
123 read_memory (fsr.regs[regnum], raw_buffer, 8);
124 write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 8);
127 for (regnum = 0; regnum < SP_REGNUM; regnum++)
129 if (fsr.regs[regnum])
131 write_register (regnum, read_memory_unsigned_integer (fsr.regs[regnum], 4));
134 if (fsr.regs[PSW_REGNUM])
136 write_register (PSW_REGNUM, read_memory_unsigned_integer (fsr.regs[PSW_REGNUM], 4));
139 write_register (PC_REGNUM, read_register(LR_REGNUM));
140 write_register (SP_REGNUM, fp + frame->size);
141 target_store_registers (-1);
142 flush_cached_frames ();
149 /* add sp,sp,imm -- observed */
150 if ((op & OP_MASK_ALL_BUT_IMM) == OP_ADD_SP_IMM)
153 /* add r22,sp,imm -- observed */
154 if ((op & OP_MASK_ALL_BUT_IMM) == OP_ADD_R22_SP_IMM)
157 /* or fp,r0,sp -- observed */
158 if (op == OP_OR_FP_R0_SP)
162 if ((op & OP_MASK_OPCODE) == OP_NOP)
165 /* stw Ra,@(sp,r0) */
166 if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_SP_R0)
169 /* stw Ra,@(sp,0x0) */
170 if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_SP_IMM0)
173 /* st2w Ra,@(sp,r0) */
174 if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SP_R0)
177 /* st2w Ra,@(sp,0x0) */
178 if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SP_IMM0)
181 /* stw fp, @(r22+,r0) -- observed */
182 if (op == OP_STW_FP_R22P_R0)
185 /* stw r62, @(r22+,r0) -- observed */
186 if (op == OP_STW_LR_R22P_R0)
189 /* stw Ra, @(fp,r0) -- observed */
190 if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_FP_R0)
191 return 1; /* first arg */
193 /* stw Ra, @(fp,imm) -- observed */
194 if ((op & OP_MASK_OP_AND_RB) == OP_STW_FP_IMM)
195 return 1; /* second and subsequent args */
197 /* stw fp,@(sp,imm) -- observed */
198 if ((op & OP_MASK_ALL_BUT_IMM) == OP_STW_FP_SP_IMM)
201 /* st2w Ra,@(r22+,r0) */
202 if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_R22P_R0)
206 if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_SPM)
209 /* st2w Ra, @(sp-) */
210 if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SPM)
213 /* sub.? sp,sp,imm */
214 if ((op & OP_MASK_ALL_BUT_IMM) == OP_SUB_SP_IMM)
221 d30v_skip_prologue (pc)
225 unsigned long opl, opr; /* left / right sub operations */
226 unsigned long fm0, fm1; /* left / right mode bits */
227 unsigned long cc0, cc1;
228 unsigned long op1, op2;
229 CORE_ADDR func_addr, func_end;
230 struct symtab_and_line sal;
232 /* If we have line debugging information, then the end of the */
233 /* prologue should the first assembly instruction of the first source line */
234 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
236 sal = find_pc_line (func_addr, 0);
237 if ( sal.end && sal.end < func_end)
241 if (target_read_memory (pc, (char *)&op[0], 8))
242 return pc; /* Can't access it -- assume no prologue. */
246 opl = (unsigned long)read_memory_integer (pc, 4);
247 opr = (unsigned long)read_memory_integer (pc+4, 4);
249 fm0 = (opl & OP_MASK_FM_BIT);
250 fm1 = (opr & OP_MASK_FM_BIT);
252 cc0 = (opl & OP_MASK_CC_BITS);
253 cc1 = (opr & OP_MASK_CC_BITS);
255 opl = (opl & OP_MASK_SUB_INST);
256 opr = (opr & OP_MASK_SUB_INST);
260 /* long instruction (opl contains the opcode) */
261 if (((opl & OP_MASK_ALL_BUT_IMM) != OP_ADD_SP_IMM) && /* add sp,sp,imm */
262 ((opl & OP_MASK_ALL_BUT_IMM) != OP_ADD_R22_SP_IMM) && /* add r22,sp,imm */
263 ((opl & OP_MASK_OP_AND_RB) != OP_STW_SP_IMM) && /* stw Ra, @(sp,imm) */
264 ((opl & OP_MASK_OP_AND_RB) != OP_ST2W_SP_IMM)) /* st2w Ra, @(sp,imm) */
269 /* short instructions */
280 if (check_prologue(op1))
282 if (!check_prologue(op2))
284 /* if the previous opcode was really part of the prologue */
285 /* and not just a NOP, then we want to break after both instructions */
286 if ((op1 & OP_MASK_OPCODE) != OP_NOP)
299 static int end_of_stack;
301 /* Given a GDB frame, determine the address of the calling function's frame.
302 This will be used to create a new GDB frame struct, and then
303 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
307 d30v_frame_chain (frame)
308 struct frame_info *frame;
310 struct frame_saved_regs fsr;
312 d30v_frame_find_saved_regs (frame, &fsr);
317 if (frame->return_pc == IMEM_START)
320 if (!fsr.regs[FP_REGNUM])
322 if (!fsr.regs[SP_REGNUM] || fsr.regs[SP_REGNUM] == STACK_START)
325 return fsr.regs[SP_REGNUM];
328 if (!read_memory_unsigned_integer(fsr.regs[FP_REGNUM],4))
331 return read_memory_unsigned_integer(fsr.regs[FP_REGNUM],4);
334 static int next_addr, uses_frame;
335 static int frame_size;
338 prologue_find_regs (op, fsr, addr)
340 struct frame_saved_regs *fsr;
346 /* add sp,sp,imm -- observed */
347 if ((op & OP_MASK_ALL_BUT_IMM) == OP_ADD_SP_IMM)
349 offset = EXTRACT_IMM6(op);
350 /*next_addr += offset;*/
351 frame_size += -offset;
355 /* add r22,sp,imm -- observed */
356 if ((op & OP_MASK_ALL_BUT_IMM) == OP_ADD_R22_SP_IMM)
358 offset = EXTRACT_IMM6(op);
359 next_addr = (offset - frame_size);
363 /* stw Ra, @(fp, offset) -- observed */
364 if ((op & OP_MASK_OP_AND_RB) == OP_STW_FP_IMM)
367 offset = EXTRACT_IMM6(op);
368 fsr->regs[n] = (offset - frame_size);
372 /* stw Ra, @(fp, r0) -- observed */
373 if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_FP_R0)
376 fsr->regs[n] = (- frame_size);
380 /* or fp,0,sp -- observed */
381 if ((op == OP_OR_FP_R0_SP) ||
382 (op == OP_OR_FP_SP_R0) ||
383 (op == OP_OR_FP_IMM0_SP))
390 if ((op & OP_MASK_OPCODE) == OP_NOP)
393 /* stw Ra,@(r22+,r0) -- observed */
394 if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_R22P_R0)
397 fsr->regs[n] = next_addr;
401 #if 0 /* subsumed in pattern above */
402 /* stw fp,@(r22+,r0) -- observed */
403 if (op == OP_STW_FP_R22P_R0)
405 fsr->regs[FP_REGNUM] = next_addr; /* XXX */
410 /* stw r62,@(r22+,r0) -- observed */
411 if (op == OP_STW_LR_R22P_R0)
413 fsr->regs[LR_REGNUM] = next_addr;
418 /* st2w Ra,@(r22+,r0) -- observed */
419 if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_R22P_R0)
422 fsr->regs[n] = next_addr;
423 fsr->regs[n+1] = next_addr + 4;
429 if ((op & OP_MASK_ALL_BUT_RA) == OP_STW_SPM)
432 fsr->regs[n] = next_addr;
437 /* st2w Ra, @(sp-) */
438 else if ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SPM)
441 fsr->regs[n] = next_addr;
442 fsr->regs[n+1] = next_addr+4;
448 if ((op & OP_MASK_ALL_BUT_IMM) == OP_SUB_SP_IMM)
450 offset = EXTRACT_IMM6(op);
451 frame_size += -offset;
455 /* st rn, @(sp,0) -- observed */
456 if (((op & OP_MASK_ALL_BUT_RA) == OP_STW_SP_R0) ||
457 ((op & OP_MASK_ALL_BUT_RA) == OP_STW_SP_IMM0))
460 fsr->regs[n] = (- frame_size);
464 /* st2w rn, @(sp,0) */
465 if (((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SP_R0) ||
466 ((op & OP_MASK_ALL_BUT_RA) == OP_ST2W_SP_IMM0))
469 fsr->regs[n] = (- frame_size);
470 fsr->regs[n+1] = (- frame_size) + 4;
474 /* stw fp,@(sp,imm) -- observed */
475 if ((op & OP_MASK_ALL_BUT_IMM) == OP_STW_FP_SP_IMM)
477 offset = EXTRACT_IMM6(op);
478 fsr->regs[FP_REGNUM] = (offset - frame_size);
484 /* Put here the code to store, into a struct frame_saved_regs, the
485 addresses of the saved registers of frame described by FRAME_INFO.
486 This includes special registers such as pc and fp saved in special
487 ways in the stack frame. sp is even more special: the address we
488 return for it IS the sp for the next frame. */
490 d30v_frame_find_saved_regs (fi, fsr)
491 struct frame_info *fi;
492 struct frame_saved_regs *fsr;
495 unsigned long opl, opr;
496 unsigned long op1, op2;
497 unsigned long fm0, fm1;
501 memset (fsr, 0, sizeof (*fsr));
508 d30v_frame_find_saved_regs_offsets (fi, fsr);
510 fi->size = frame_size;
513 fp = read_register(SP_REGNUM);
515 for (i=0; i<NUM_REGS-1; i++)
518 fsr->regs[i] = fsr->regs[i] + fp + frame_size;
521 if (fsr->regs[LR_REGNUM])
522 fi->return_pc = read_memory_unsigned_integer(fsr->regs[LR_REGNUM],4);
524 fi->return_pc = read_register(LR_REGNUM);
526 /* the SP is not normally (ever?) saved, but check anyway */
527 if (!fsr->regs[SP_REGNUM])
529 /* if the FP was saved, that means the current FP is valid, */
530 /* otherwise, it isn't being used, so we use the SP instead */
532 fsr->regs[SP_REGNUM] = read_register(FP_REGNUM) + fi->size;
535 fsr->regs[SP_REGNUM] = fp + fi->size;
537 fsr->regs[FP_REGNUM] = 0;
543 d30v_frame_find_saved_regs_offsets (fi, fsr)
544 struct frame_info *fi;
545 struct frame_saved_regs *fsr;
548 unsigned long opl, opr;
549 unsigned long op1, op2;
550 unsigned long fm0, fm1;
554 memset (fsr, 0, sizeof (*fsr));
559 pc = get_pc_function_start (fi->pc);
564 opl = (unsigned long)read_memory_integer (pc, 4);
565 opr = (unsigned long)read_memory_integer (pc+4, 4);
567 fm0 = (opl & OP_MASK_FM_BIT);
568 fm1 = (opr & OP_MASK_FM_BIT);
570 opl = (opl & OP_MASK_SUB_INST);
571 opr = (opr & OP_MASK_SUB_INST);
575 /* long instruction */
576 if ((opl & OP_MASK_ALL_BUT_IMM) == OP_ADD_SP_IMM)
579 long offset = EXTRACT_IMM32(opl, opr);
580 frame_size += -offset;
582 else if ((opl & OP_MASK_ALL_BUT_IMM) == OP_ADD_R22_SP_IMM)
584 /* add r22,sp,offset */
585 long offset = EXTRACT_IMM32(opl,opr);
586 next_addr = (offset - frame_size);
588 else if ((opl & OP_MASK_OP_AND_RB) == OP_STW_SP_IMM)
590 /* st Ra, @(sp,imm) */
591 long offset = EXTRACT_IMM32(opl, opr);
592 short n = EXTRACT_RA(opl);
593 fsr->regs[n] = (offset - frame_size);
595 else if ((opl & OP_MASK_OP_AND_RB) == OP_ST2W_SP_IMM)
597 /* st2w Ra, @(sp,offset) */
598 long offset = EXTRACT_IMM32(opl, opr);
599 short n = EXTRACT_RA(opl);
600 fsr->regs[n] = (offset - frame_size);
601 fsr->regs[n+1] = (offset - frame_size) + 4;
603 else if ((opl & OP_MASK_ALL_BUT_IMM) == OP_OR_SP_R0_IMM)
612 /* short instructions */
623 if (!prologue_find_regs(op1,fsr,pc) || !prologue_find_regs(op2,fsr,pc))
630 fi->size = frame_size;
633 fp = read_register(SP_REGNUM);
635 for (i=0; i<NUM_REGS-1; i++)
638 fsr->regs[i] = fsr->regs[i] + fp + frame_size;
641 if (fsr->regs[LR_REGNUM])
642 fi->return_pc = read_memory_unsigned_integer(fsr->regs[LR_REGNUM],4);
644 fi->return_pc = read_register(LR_REGNUM);
646 /* the SP is not normally (ever?) saved, but check anyway */
647 if (!fsr->regs[SP_REGNUM])
649 /* if the FP was saved, that means the current FP is valid, */
650 /* otherwise, it isn't being used, so we use the SP instead */
652 fsr->regs[SP_REGNUM] = read_register(FP_REGNUM) + fi->size;
655 fsr->regs[SP_REGNUM] = fp + fi->size;
657 fsr->regs[FP_REGNUM] = 0;
664 d30v_init_extra_frame_info (fromleaf, fi)
666 struct frame_info *fi;
668 struct frame_saved_regs dummy;
670 if (fi->next && (fi->pc == 0))
671 fi->pc = fi->next->return_pc;
673 d30v_frame_find_saved_regs_offsets (fi, &dummy);
680 if ((fi->next == 0) && (uses_frame == 0))
681 /* innermost frame and it's "frameless",
682 so the fi->frame field is wrong, fix it! */
683 fi->frame = read_sp ();
685 if (dummy.regs[LR_REGNUM])
687 /* it was saved, grab it! */
688 dummy.regs[LR_REGNUM] += (fi->frame + frame_size);
689 fi->return_pc = read_memory_unsigned_integer(dummy.regs[LR_REGNUM],4);
692 fi->return_pc = read_register(LR_REGNUM);
696 d30v_init_frame_pc (fromleaf, prev)
698 struct frame_info *prev;
700 /* default value, put here so we can breakpoint on it and
701 see if the default value is really the right thing to use */
702 prev->pc = (fromleaf ? SAVED_PC_AFTER_CALL (prev->next) : \
703 prev->next ? FRAME_SAVED_PC (prev->next) : read_pc ());
706 static void d30v_print_register PARAMS ((int regnum, int tabular));
709 d30v_print_register (regnum, tabular)
713 if (regnum < A0_REGNUM)
716 printf_filtered ("%08x", read_register (regnum));
718 printf_filtered ("0x%x %d", read_register (regnum),
719 read_register (regnum));
723 char regbuf[MAX_REGISTER_RAW_SIZE];
725 read_relative_register_raw_bytes (regnum, regbuf);
727 val_print (REGISTER_VIRTUAL_TYPE (regnum), regbuf, 0,
728 gdb_stdout, 'x', 1, 0, Val_pretty_default);
732 printf_filtered (" ");
733 val_print (REGISTER_VIRTUAL_TYPE (regnum), regbuf, 0,
734 gdb_stdout, 'd', 1, 0, Val_pretty_default);
742 long psw = read_register (PSW_REGNUM);
743 printf_filtered ("flags #1");
744 printf_filtered (" (sm) %d", (psw & PSW_SM) != 0);
745 printf_filtered (" (ea) %d", (psw & PSW_EA) != 0);
746 printf_filtered (" (db) %d", (psw & PSW_DB) != 0);
747 printf_filtered (" (ds) %d", (psw & PSW_DS) != 0);
748 printf_filtered (" (ie) %d", (psw & PSW_IE) != 0);
749 printf_filtered (" (rp) %d", (psw & PSW_RP) != 0);
750 printf_filtered (" (md) %d\n", (psw & PSW_MD) != 0);
752 printf_filtered ("flags #2");
753 printf_filtered (" (f0) %d", (psw & PSW_F0) != 0);
754 printf_filtered (" (f1) %d", (psw & PSW_F1) != 0);
755 printf_filtered (" (f2) %d", (psw & PSW_F2) != 0);
756 printf_filtered (" (f3) %d", (psw & PSW_F3) != 0);
757 printf_filtered (" (s) %d", (psw & PSW_S) != 0);
758 printf_filtered (" (v) %d", (psw & PSW_V) != 0);
759 printf_filtered (" (va) %d", (psw & PSW_VA) != 0);
760 printf_filtered (" (c) %d\n", (psw & PSW_C) != 0);
764 print_flags_command (args, from_tty)
772 d30v_do_registers_info (regnum, fpregs)
776 long long num1, num2;
781 if (reg_names[0] == NULL || reg_names[0][0] == '\000')
784 printf_filtered ("%s ", reg_names[regnum]);
785 d30v_print_register (regnum, 0);
787 printf_filtered ("\n");
791 /* Have to print all the registers. Format them nicely. */
793 printf_filtered ("PC=");
794 print_address (read_pc (), gdb_stdout);
796 printf_filtered (" PSW=");
797 d30v_print_register (PSW_REGNUM, 1);
799 printf_filtered (" BPC=");
800 print_address (read_register (BPC_REGNUM), gdb_stdout);
802 printf_filtered (" BPSW=");
803 d30v_print_register (BPSW_REGNUM, 1);
804 printf_filtered ("\n");
806 printf_filtered ("DPC=");
807 print_address (read_register (DPC_REGNUM), gdb_stdout);
809 printf_filtered (" DPSW=");
810 d30v_print_register (DPSW_REGNUM, 1);
812 printf_filtered (" IBA=");
813 print_address (read_register (IBA_REGNUM), gdb_stdout);
814 printf_filtered ("\n");
816 printf_filtered ("RPT_C=");
817 d30v_print_register (RPT_C_REGNUM, 1);
819 printf_filtered (" RPT_S=");
820 print_address (read_register (RPT_S_REGNUM), gdb_stdout);
822 printf_filtered (" RPT_E=");
823 print_address (read_register (RPT_E_REGNUM), gdb_stdout);
824 printf_filtered ("\n");
826 printf_filtered ("MOD_S=");
827 print_address (read_register (MOD_S_REGNUM), gdb_stdout);
829 printf_filtered (" MOD_E=");
830 print_address (read_register (MOD_E_REGNUM), gdb_stdout);
831 printf_filtered ("\n");
833 printf_filtered ("EIT_VB=");
834 print_address (read_register (EIT_VB_REGNUM), gdb_stdout);
836 printf_filtered (" INT_S=");
837 d30v_print_register (INT_S_REGNUM, 1);
839 printf_filtered (" INT_M=");
840 d30v_print_register (INT_M_REGNUM, 1);
841 printf_filtered ("\n");
844 for (regnum = 0; regnum <= 63;)
848 printf_filtered ("R%d-R%d ", regnum, regnum + 7);
850 printf_filtered (" ");
852 printf_filtered (" ");
854 for (i = 0; i < 8; i++)
856 printf_filtered (" ");
857 d30v_print_register (regnum++, 1);
860 printf_filtered ("\n");
863 printf_filtered ("A0-A1 ");
865 d30v_print_register (A0_REGNUM, 1);
866 printf_filtered (" ");
867 d30v_print_register (A1_REGNUM, 1);
868 printf_filtered ("\n");
872 d30v_fix_call_dummy (dummyname, start_sp, fun, nargs, args, type, gcc_p)
883 char buffer[MAX_REGISTER_RAW_SIZE];
884 struct frame_info *frame = get_current_frame ();
885 frame->dummy = start_sp;
886 /*start_sp |= DMEM_START;*/
889 for (regnum = 0; regnum < NUM_REGS; regnum++)
891 sp -= REGISTER_RAW_SIZE(regnum);
892 store_address (buffer, REGISTER_RAW_SIZE(regnum), read_register(regnum));
893 write_memory (sp, buffer, REGISTER_RAW_SIZE(regnum));
895 write_register (SP_REGNUM, (LONGEST)sp);
896 /* now we need to load LR with the return address */
897 write_register (LR_REGNUM, (LONGEST)d30v_call_dummy_address());
902 d30v_pop_dummy_frame (fi)
903 struct frame_info *fi;
905 CORE_ADDR sp = fi->dummy;
908 for (regnum = 0; regnum < NUM_REGS; regnum++)
910 sp -= REGISTER_RAW_SIZE(regnum);
911 write_register(regnum, read_memory_unsigned_integer (sp, REGISTER_RAW_SIZE(regnum)));
913 flush_cached_frames (); /* needed? */
918 d30v_push_arguments (nargs, args, sp, struct_return, struct_addr)
923 CORE_ADDR struct_addr;
925 int i, len, index=0, regnum=2;
926 char buffer[4], *contents;
931 /* Pass 1. Put all large args on stack */
932 for (i = 0; i < nargs; i++)
934 value_ptr arg = args[i];
935 struct type *arg_type = check_typedef (VALUE_TYPE (arg));
936 len = TYPE_LENGTH (arg_type);
937 contents = VALUE_CONTENTS(arg);
938 val = extract_signed_integer (contents, len);
941 /* put on stack and pass pointers */
943 write_memory (sp, contents, len);
950 for (i = 0; i < nargs; i++)
952 value_ptr arg = args[i];
953 struct type *arg_type = check_typedef (VALUE_TYPE (arg));
954 len = TYPE_LENGTH (arg_type);
955 contents = VALUE_CONTENTS(arg);
958 /* we need multiple registers */
961 for (ndx = 0; len > 0; ndx += 8, len -= 8)
964 regnum++; /* all args > 4 bytes start in even register */
968 val = extract_signed_integer (&contents[ndx], 4);
969 write_register (regnum++, val);
972 val = extract_signed_integer (&contents[ndx+4], 4);
974 val = extract_signed_integer (&contents[ndx+4], len-4);
975 write_register (regnum++, val);
979 /* no more registers available. put it on the stack */
981 /* all args > 4 bytes are padded to a multiple of 8 bytes
982 and start on an 8 byte boundary */
984 sp -= (sp & 7); /* align it */
986 sp -= ((len + 7) & ~7); /* allocate space */
987 write_memory (sp, &contents[ndx], len);
996 val = extract_signed_integer (contents, len);
997 write_register (regnum++, val);
1001 /* all args are padded to a multiple of 4 bytes (at least) */
1002 sp -= ((len + 3) & ~3);
1003 write_memory (sp, contents, len);
1008 /* stack pointer is not on an 8 byte boundary -- align it */
1014 /* pick an out-of-the-way place to set the return value */
1015 /* for an inferior function call. The link register is set to this */
1016 /* value and a momentary breakpoint is set there. When the breakpoint */
1017 /* is hit, the dummy frame is popped and the previous environment is */
1021 d30v_call_dummy_address ()
1024 struct minimal_symbol *sym;
1026 entry = entry_point_address ();
1031 sym = lookup_minimal_symbol ("_start", NULL, symfile_objfile);
1033 if (!sym || MSYMBOL_TYPE (sym) != mst_text)
1036 return SYMBOL_VALUE_ADDRESS (sym);
1039 /* Given a return value in `regbuf' with a type `valtype',
1040 extract and copy its value into `valbuf'. */
1043 d30v_extract_return_value (valtype, regbuf, valbuf)
1044 struct type *valtype;
1045 char regbuf[REGISTER_BYTES];
1048 memcpy (valbuf, regbuf + REGISTER_BYTE (2), TYPE_LENGTH (valtype));
1051 /* The following code implements access to, and display of, the D30V's
1052 instruction trace buffer. The buffer consists of 64K or more
1053 4-byte words of data, of which each words includes an 8-bit count,
1054 an 8-bit segment number, and a 16-bit instruction address.
1056 In theory, the trace buffer is continuously capturing instruction
1057 data that the CPU presents on its "debug bus", but in practice, the
1058 ROMified GDB stub only enables tracing when it continues or steps
1059 the program, and stops tracing when the program stops; so it
1060 actually works for GDB to read the buffer counter out of memory and
1061 then read each trace word. The counter records where the tracing
1062 stops, but there is no record of where it started, so we remember
1063 the PC when we resumed and then search backwards in the trace
1064 buffer for a word that includes that address. This is not perfect,
1065 because you will miss trace data if the resumption PC is the target
1066 of a branch. (The value of the buffer counter is semi-random, any
1067 trace data from a previous program stop is gone.) */
1069 /* The address of the last word recorded in the trace buffer. */
1071 #define DBBC_ADDR (0xd80000)
1073 /* The base of the trace buffer, at least for the "Board_0". */
1075 #define TRACE_BUFFER_BASE (0xf40000)
1077 static void trace_command PARAMS ((char *, int));
1079 static void untrace_command PARAMS ((char *, int));
1081 static void trace_info PARAMS ((char *, int));
1083 static void tdisassemble_command PARAMS ((char *, int));
1085 static void display_trace PARAMS ((int, int));
1087 /* True when instruction traces are being collected. */
1091 /* Remembered PC. */
1093 static CORE_ADDR last_pc;
1095 /* True when trace output should be displayed whenever program stops. */
1097 static int trace_display;
1099 /* True when trace listing should include source lines. */
1101 static int default_trace_show_source = 1;
1103 struct trace_buffer {
1110 trace_command (args, from_tty)
1114 /* Clear the host-side trace buffer, allocating space if needed. */
1115 trace_data.size = 0;
1116 if (trace_data.counts == NULL)
1117 trace_data.counts = (short *) xmalloc (65536 * sizeof(short));
1118 if (trace_data.addrs == NULL)
1119 trace_data.addrs = (CORE_ADDR *) xmalloc (65536 * sizeof(CORE_ADDR));
1123 printf_filtered ("Tracing is now on.\n");
1127 untrace_command (args, from_tty)
1133 printf_filtered ("Tracing is now off.\n");
1137 trace_info (args, from_tty)
1143 if (trace_data.size)
1145 printf_filtered ("%d entries in trace buffer:\n", trace_data.size);
1147 for (i = 0; i < trace_data.size; ++i)
1149 printf_filtered ("%d: %d instruction%s at 0x%x\n",
1150 i, trace_data.counts[i],
1151 (trace_data.counts[i] == 1 ? "" : "s"),
1152 trace_data.addrs[i]);
1156 printf_filtered ("No entries in trace buffer.\n");
1158 printf_filtered ("Tracing is currently %s.\n", (tracing ? "on" : "off"));
1161 /* Print the instruction at address MEMADDR in debugged memory,
1162 on STREAM. Returns length of the instruction, in bytes. */
1165 print_insn (memaddr, stream)
1169 /* If there's no disassembler, something is very wrong. */
1170 if (tm_print_insn == NULL)
1173 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1174 tm_print_insn_info.endian = BFD_ENDIAN_BIG;
1176 tm_print_insn_info.endian = BFD_ENDIAN_LITTLE;
1177 return (*tm_print_insn) (memaddr, &tm_print_insn_info);
1181 d30v_eva_prepare_to_trace ()
1186 last_pc = read_register (PC_REGNUM);
1189 /* Collect trace data from the target board and format it into a form
1190 more useful for display. */
1193 d30v_eva_get_trace_data ()
1195 int count, i, j, oldsize;
1196 int trace_addr, trace_seg, trace_cnt, next_cnt;
1197 unsigned int last_trace, trace_word, next_word;
1198 unsigned int *tmpspace;
1203 tmpspace = xmalloc (65536 * sizeof(unsigned int));
1205 last_trace = read_memory_unsigned_integer (DBBC_ADDR, 2) << 2;
1207 /* Collect buffer contents from the target, stopping when we reach
1208 the word recorded when execution resumed. */
1211 while (last_trace > 0)
1215 read_memory_unsigned_integer (TRACE_BUFFER_BASE + last_trace, 4);
1216 trace_addr = trace_word & 0xffff;
1218 /* Ignore an apparently nonsensical entry. */
1219 if (trace_addr == 0xffd5)
1221 tmpspace[count++] = trace_word;
1222 if (trace_addr == last_pc)
1228 /* Move the data to the host-side trace buffer, adjusting counts to
1229 include the last instruction executed and transforming the address
1230 into something that GDB likes. */
1232 for (i = 0; i < count; ++i)
1234 trace_word = tmpspace[i];
1235 next_word = ((i == 0) ? 0 : tmpspace[i - 1]);
1236 trace_addr = trace_word & 0xffff;
1237 next_cnt = (next_word >> 24) & 0xff;
1238 j = trace_data.size + count - i - 1;
1239 trace_data.addrs[j] = (trace_addr << 2) + 0x1000000;
1240 trace_data.counts[j] = next_cnt + 1;
1243 oldsize = trace_data.size;
1244 trace_data.size += count;
1249 display_trace (oldsize, trace_data.size);
1253 tdisassemble_command (arg, from_tty)
1258 CORE_ADDR low, high;
1264 high = trace_data.size;
1266 else if (!(space_index = (char *) strchr (arg, ' ')))
1268 low = parse_and_eval_address (arg);
1273 /* Two arguments. */
1274 *space_index = '\0';
1275 low = parse_and_eval_address (arg);
1276 high = parse_and_eval_address (space_index + 1);
1281 printf_filtered ("Dump of trace from %d to %d:\n", low, high);
1283 display_trace (low, high);
1285 printf_filtered ("End of trace dump.\n");
1286 gdb_flush (gdb_stdout);
1290 display_trace (low, high)
1293 int i, count, trace_show_source, first, suppress;
1294 CORE_ADDR next_address;
1296 trace_show_source = default_trace_show_source;
1297 if (!have_full_symbols () && !have_partial_symbols())
1299 trace_show_source = 0;
1300 printf_filtered ("No symbol table is loaded. Use the \"file\" command.\n");
1301 printf_filtered ("Trace will not display any source.\n");
1306 for (i = low; i < high; ++i)
1308 next_address = trace_data.addrs[i];
1309 count = trace_data.counts[i];
1313 if (trace_show_source)
1315 struct symtab_and_line sal, sal_prev;
1317 sal_prev = find_pc_line (next_address - 4, 0);
1318 sal = find_pc_line (next_address, 0);
1322 if (first || sal.line != sal_prev.line)
1323 print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
1329 /* FIXME-32x64--assumes sal.pc fits in long. */
1330 printf_filtered ("No source file for address %s.\n",
1331 local_hex_string((unsigned long) sal.pc));
1336 print_address (next_address, gdb_stdout);
1337 printf_filtered (":");
1338 printf_filtered ("\t");
1340 next_address = next_address + print_insn (next_address, gdb_stdout);
1341 printf_filtered ("\n");
1342 gdb_flush (gdb_stdout);
1347 extern void (*target_resume_hook) PARAMS ((void));
1348 extern void (*target_wait_loop_hook) PARAMS ((void));
1351 _initialize_d30v_tdep ()
1353 tm_print_insn = print_insn_d30v;
1355 target_resume_hook = d30v_eva_prepare_to_trace;
1356 target_wait_loop_hook = d30v_eva_get_trace_data;
1358 add_info ("flags", print_flags_command, "Print d30v flags.");
1360 add_com ("trace", class_support, trace_command,
1361 "Enable tracing of instruction execution.");
1363 add_com ("untrace", class_support, untrace_command,
1364 "Disable tracing of instruction execution.");
1366 add_com ("tdisassemble", class_vars, tdisassemble_command,
1367 "Disassemble the trace buffer.\n\
1368 Two optional arguments specify a range of trace buffer entries\n\
1369 as reported by info trace (NOT addresses!).");
1371 add_info ("trace", trace_info,
1372 "Display info about the trace data buffer.");
1374 add_show_from_set (add_set_cmd ("tracedisplay", no_class,
1375 var_integer, (char *)&trace_display,
1376 "Set automatic display of trace.\n", &setlist),
1378 add_show_from_set (add_set_cmd ("tracesource", no_class,
1379 var_integer, (char *)&default_trace_show_source,
1380 "Set display of source code with trace.\n", &setlist),