1 /* Target-dependent code for MItsubishi D10V, for GDB.
2 Copyright (C) 1996 Free Software Foundation, Inc.
3 This file is part of GDB.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12 You should have received a copy of the GNU General Public License
13 along with this program; if not, write to the Free Software
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
16 /* Contributed by Martin Hunt, hunt@cygnus.com */
25 #include "gdb_string.h"
32 void d10v_frame_find_saved_regs
PARAMS ((struct frame_info
*fi
, struct frame_saved_regs
*fsr
));
33 static void d10v_pop_dummy_frame
PARAMS ((struct frame_info
*fi
));
35 /* Discard from the stack the innermost frame,
36 restoring all saved registers. */
41 struct frame_info
*frame
= get_current_frame ();
44 struct frame_saved_regs fsr
;
47 fp
= FRAME_FP (frame
);
50 d10v_pop_dummy_frame(frame
);
54 /* fill out fsr with the address of where each */
55 /* register was stored in the frame */
56 get_frame_saved_regs (frame
, &fsr
);
58 /* now update the current registers with the old values */
59 for (regnum
= A0_REGNUM
; regnum
< A0_REGNUM
+2 ; regnum
++)
63 read_memory (fsr
.regs
[regnum
], raw_buffer
, 8);
64 write_register_bytes (REGISTER_BYTE (regnum
), raw_buffer
, 8);
67 for (regnum
= 0; regnum
< SP_REGNUM
; regnum
++)
71 write_register (regnum
, read_memory_unsigned_integer (fsr
.regs
[regnum
], 2));
74 if (fsr
.regs
[PSW_REGNUM
])
76 write_register (PSW_REGNUM
, read_memory_unsigned_integer (fsr
.regs
[PSW_REGNUM
], 2));
79 write_register (PC_REGNUM
, read_register(13));
80 write_register (SP_REGNUM
, fp
+ frame
->size
);
81 target_store_registers (-1);
82 flush_cached_frames ();
90 if ((op
& 0x7E1F) == 0x6C1F)
94 if ((op
& 0x7E3F) == 0x6E1F)
98 if ((op
& 0x7FE1) == 0x01E1)
110 if ((op
& 0x7E1F) == 0x681E)
114 if ((op
& 0x7E3F) == 0x3A1E)
121 d10v_skip_prologue (pc
)
125 unsigned short op1
, op2
;
126 CORE_ADDR func_addr
, func_end
;
127 struct symtab_and_line sal
;
129 /* If we have line debugging information, then the end of the */
130 /* prologue should the first assembly instruction of the first source line */
131 if (find_pc_partial_function (pc
, NULL
, &func_addr
, &func_end
))
133 sal
= find_pc_line (func_addr
, 0);
134 if (sal
.end
< func_end
)
138 if (target_read_memory (pc
, (char *)&op
, 4))
139 return pc
; /* Can't access it -- assume no prologue. */
143 op
= (unsigned long)read_memory_integer (pc
, 4);
144 if ((op
& 0xC0000000) == 0xC0000000)
146 /* long instruction */
147 if ( ((op
& 0x3FFF0000) != 0x01FF0000) && /* add3 sp,sp,n */
148 ((op
& 0x3F0F0000) != 0x340F0000) && /* st rn, @(offset,sp) */
149 ((op
& 0x3F1F0000) != 0x350F0000)) /* st2w rn, @(offset,sp) */
154 /* short instructions */
155 if ((op
& 0xC0000000) == 0x80000000)
157 op2
= (op
& 0x3FFF8000) >> 15;
162 op1
= (op
& 0x3FFF8000) >> 15;
165 if (check_prologue(op1
))
167 if (!check_prologue(op2
))
169 /* if the previous opcode was really part of the prologue */
170 /* and not just a NOP, then we want to break after both instructions */
184 /* Given a GDB frame, determine the address of the calling function's frame.
185 This will be used to create a new GDB frame struct, and then
186 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
190 d10v_frame_chain (frame
)
191 struct frame_info
*frame
;
193 struct frame_saved_regs fsr
;
195 d10v_frame_find_saved_regs (frame
, &fsr
);
197 if (frame
->return_pc
== IMEM_START
)
200 if (!fsr
.regs
[FP_REGNUM
])
202 if (!fsr
.regs
[SP_REGNUM
] || fsr
.regs
[SP_REGNUM
] == STACK_START
)
205 return fsr
.regs
[SP_REGNUM
];
208 if (!read_memory_unsigned_integer(fsr
.regs
[FP_REGNUM
],2))
211 return read_memory_unsigned_integer(fsr
.regs
[FP_REGNUM
],2)| DMEM_START
;
214 static int next_addr
, uses_frame
;
217 prologue_find_regs (op
, fsr
, addr
)
219 struct frame_saved_regs
*fsr
;
225 if ((op
& 0x7E1F) == 0x6C1F)
227 n
= (op
& 0x1E0) >> 5;
229 fsr
->regs
[n
] = next_addr
;
234 else if ((op
& 0x7E3F) == 0x6E1F)
236 n
= (op
& 0x1E0) >> 5;
238 fsr
->regs
[n
] = next_addr
;
239 fsr
->regs
[n
+1] = next_addr
+2;
244 if ((op
& 0x7FE1) == 0x01E1)
246 n
= (op
& 0x1E) >> 1;
265 if ((op
& 0x7E1F) == 0x681E)
267 n
= (op
& 0x1E0) >> 5;
268 fsr
->regs
[n
] = next_addr
;
273 if ((op
& 0x7E3F) == 0x3A1E)
275 n
= (op
& 0x1E0) >> 5;
276 fsr
->regs
[n
] = next_addr
;
277 fsr
->regs
[n
+1] = next_addr
+2;
284 /* Put here the code to store, into a struct frame_saved_regs, the
285 addresses of the saved registers of frame described by FRAME_INFO.
286 This includes special registers such as pc and fp saved in special
287 ways in the stack frame. sp is even more special: the address we
288 return for it IS the sp for the next frame. */
290 d10v_frame_find_saved_regs (fi
, fsr
)
291 struct frame_info
*fi
;
292 struct frame_saved_regs
*fsr
;
296 unsigned short op1
, op2
;
300 memset (fsr
, 0, sizeof (*fsr
));
303 pc
= get_pc_function_start (fi
->pc
);
308 op
= (unsigned long)read_memory_integer (pc
, 4);
309 if ((op
& 0xC0000000) == 0xC0000000)
311 /* long instruction */
312 if ((op
& 0x3FFF0000) == 0x01FF0000)
315 short n
= op
& 0xFFFF;
318 else if ((op
& 0x3F0F0000) == 0x340F0000)
320 /* st rn, @(offset,sp) */
321 short offset
= op
& 0xFFFF;
322 short n
= (op
>> 20) & 0xF;
323 fsr
->regs
[n
] = next_addr
+ offset
;
325 else if ((op
& 0x3F1F0000) == 0x350F0000)
327 /* st2w rn, @(offset,sp) */
328 short offset
= op
& 0xFFFF;
329 short n
= (op
>> 20) & 0xF;
330 fsr
->regs
[n
] = next_addr
+ offset
;
331 fsr
->regs
[n
+1] = next_addr
+ offset
+ 2;
338 /* short instructions */
339 if ((op
& 0xC0000000) == 0x80000000)
341 op2
= (op
& 0x3FFF8000) >> 15;
346 op1
= (op
& 0x3FFF8000) >> 15;
349 if (!prologue_find_regs(op1
,fsr
,pc
) || !prologue_find_regs(op2
,fsr
,pc
))
355 fi
->size
= -next_addr
;
358 fp
= read_register(SP_REGNUM
) | DMEM_START
;
360 for (i
=0; i
<NUM_REGS
-1; i
++)
363 fsr
->regs
[i
] = fp
- (next_addr
- fsr
->regs
[i
]);
366 if (fsr
->regs
[LR_REGNUM
])
367 fi
->return_pc
= ((read_memory_unsigned_integer(fsr
->regs
[LR_REGNUM
],2) - 1) << 2) | IMEM_START
;
369 fi
->return_pc
= ((read_register(LR_REGNUM
) - 1) << 2) | IMEM_START
;
371 /* th SP is not normally (ever?) saved, but check anyway */
372 if (!fsr
->regs
[SP_REGNUM
])
374 /* if the FP was saved, that means the current FP is valid, */
375 /* otherwise, it isn't being used, so we use the SP instead */
377 fsr
->regs
[SP_REGNUM
] = read_register(FP_REGNUM
) + fi
->size
;
380 fsr
->regs
[SP_REGNUM
] = fp
+ fi
->size
;
382 fsr
->regs
[FP_REGNUM
] = 0;
388 d10v_init_extra_frame_info (fromleaf
, fi
)
390 struct frame_info
*fi
;
392 struct frame_saved_regs dummy
;
394 if (fi
->next
&& ((fi
->pc
& 0xffff) == 0))
395 fi
->pc
= fi
->next
->return_pc
;
397 d10v_frame_find_saved_regs (fi
, &dummy
);
401 show_regs (args
, from_tty
)
405 long long num1
, num2
;
406 printf_filtered ("PC=%04x (0x%x) PSW=%04x RPT_S=%04x RPT_E=%04x RPT_C=%04x\n",
407 read_register (PC_REGNUM
), (read_register (PC_REGNUM
) << 2) + IMEM_START
,
408 read_register (PSW_REGNUM
),
412 printf_filtered ("R0-R7 %04x %04x %04x %04x %04x %04x %04x %04x\n",
421 printf_filtered ("R8-R15 %04x %04x %04x %04x %04x %04x %04x %04x\n",
430 printf_filtered ("IMAP0 %04x IMAP1 %04x DMAP %04x\n",
431 read_register (IMAP0_REGNUM
),
432 read_register (IMAP1_REGNUM
),
433 read_register (DMAP_REGNUM
));
434 read_register_gen (A0_REGNUM
, (char *)&num1
);
435 read_register_gen (A0_REGNUM
+1, (char *)&num2
);
436 printf_filtered ("A0-A1 %010llx %010llx\n",num1
, num2
);
440 _initialize_d10v_tdep ()
442 tm_print_insn
= print_insn_d10v
;
443 add_com ("regs", class_vars
, show_regs
, "Print all registers");
447 d10v_xlate_addr (addr
)
453 imap
= (int)read_register(IMAP0_REGNUM
);
455 imap
= (int)read_register(IMAP1_REGNUM
);
458 return (CORE_ADDR
)(addr
+ 0x1000000);
459 return (CORE_ADDR
)(addr
+ (imap
& 0xff)*0x20000);
467 int save_pid
, retval
;
469 save_pid
= inferior_pid
;
471 retval
= (int)read_register (PC_REGNUM
);
472 inferior_pid
= save_pid
;
473 return d10v_xlate_addr(retval
<< 2);
477 d10v_write_pc (val
, pid
)
483 save_pid
= inferior_pid
;
485 write_register (PC_REGNUM
, (val
& 0x3ffff) >> 2);
486 inferior_pid
= save_pid
;
492 return (read_register(SP_REGNUM
) | DMEM_START
);
499 write_register (SP_REGNUM
, (LONGEST
)(val
& 0xffff));
503 d10v_fix_call_dummy (dummyname
, start_sp
, fun
, nargs
, args
, type
, gcc_p
)
514 char buffer
[MAX_REGISTER_RAW_SIZE
];
515 struct frame_info
*frame
= get_current_frame ();
516 frame
->dummy
= start_sp
;
517 start_sp
|= DMEM_START
;
520 for (regnum
= 0; regnum
< NUM_REGS
; regnum
++)
522 sp
-= REGISTER_RAW_SIZE(regnum
);
523 store_address (buffer
, REGISTER_RAW_SIZE(regnum
), read_register(regnum
));
524 write_memory (sp
, buffer
, REGISTER_RAW_SIZE(regnum
));
526 write_register (SP_REGNUM
, (LONGEST
)(sp
& 0xffff));
527 /* now we need to load LR with the return address */
528 write_register (LR_REGNUM
, (LONGEST
)(d10v_call_dummy_address() & 0xffff) >> 2);
533 d10v_pop_dummy_frame (fi
)
534 struct frame_info
*fi
;
536 CORE_ADDR sp
= fi
->dummy
;
539 for (regnum
= 0; regnum
< NUM_REGS
; regnum
++)
541 sp
-= REGISTER_RAW_SIZE(regnum
);
542 write_register(regnum
, read_memory_unsigned_integer (sp
, REGISTER_RAW_SIZE(regnum
)));
544 flush_cached_frames (); /* needed? */
549 d10v_push_arguments (nargs
, args
, sp
, struct_return
, struct_addr
)
554 CORE_ADDR struct_addr
;
556 int i
, len
, index
=0, regnum
=2;
557 char buffer
[4], *contents
;
561 /* Pass 1. Put all large args on stack */
562 for (i
= 0; i
< nargs
; i
++)
564 value_ptr arg
= args
[i
];
565 struct type
*arg_type
= check_typedef (VALUE_TYPE (arg
));
566 len
= TYPE_LENGTH (arg_type
);
567 contents
= VALUE_CONTENTS(arg
);
568 val
= extract_signed_integer (contents
, len
);
571 /* put on stack and pass pointers */
573 write_memory (sp
, contents
, len
);
580 for (i
= 0; i
< nargs
; i
++)
582 value_ptr arg
= args
[i
];
583 struct type
*arg_type
= check_typedef (VALUE_TYPE (arg
));
584 len
= TYPE_LENGTH (arg_type
);
585 contents
= VALUE_CONTENTS(arg
);
586 val
= extract_signed_integer (contents
, len
);
589 /* use a pointer to previously saved data */
591 write_register (regnum
++, ptrs
[index
++]);
594 /* no more registers available. put it on the stack */
596 store_address (buffer
, 2, ptrs
[index
++]);
597 write_memory (sp
, buffer
, 2);
605 write_register (regnum
++, val
>>16);
606 write_register (regnum
++, val
& 0xffff);
611 store_address (buffer
, len
, val
);
612 write_memory (sp
, buffer
, len
);
620 /* pick an out-of-the-way place to set the return value */
621 /* for an inferior function call. The link register is set to this */
622 /* value and a momentary breakpoint is set there. When the breakpoint */
623 /* is hit, the dummy frame is popped and the previous environment is */
627 d10v_call_dummy_address ()
630 struct minimal_symbol
*sym
;
632 entry
= entry_point_address ();
637 sym
= lookup_minimal_symbol ("_start", NULL
, symfile_objfile
);
639 if (!sym
|| MSYMBOL_TYPE (sym
) != mst_text
)
642 return SYMBOL_VALUE_ADDRESS (sym
);
645 /* Given a return value in `regbuf' with a type `valtype',
646 extract and copy its value into `valbuf'. */
649 d10v_extract_return_value (valtype
, regbuf
, valbuf
)
650 struct type
*valtype
;
651 char regbuf
[REGISTER_BYTES
];
654 memcpy (valbuf
, regbuf
+ REGISTER_BYTE (2), TYPE_LENGTH (valtype
));