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
;
127 if (target_read_memory (pc
, (char *)&op
, 4))
128 return pc
; /* Can't access it -- assume no prologue. */
132 op
= (unsigned long)read_memory_integer (pc
, 4);
133 if ((op
& 0xC0000000) == 0xC0000000)
135 /* long instruction */
136 if ( ((op
& 0x3FFF0000) != 0x01FF0000) && /* add3 sp,sp,n */
137 ((op
& 0x3F0F0000) != 0x340F0000) && /* st rn, @(offset,sp) */
138 ((op
& 0x3F1F0000) != 0x350F0000)) /* st2w rn, @(offset,sp) */
143 /* short instructions */
144 if ((op
& 0xC0000000) == 0x80000000)
146 op2
= (op
& 0x3FFF8000) >> 15;
151 op1
= (op
& 0x3FFF8000) >> 15;
154 if (check_prologue(op1
))
156 if (!check_prologue(op2
))
158 /* if the previous opcode was really part of the prologue */
159 /* and not just a NOP, then we want to break after both instructions */
173 /* Given a GDB frame, determine the address of the calling function's frame.
174 This will be used to create a new GDB frame struct, and then
175 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
179 d10v_frame_chain (frame
)
180 struct frame_info
*frame
;
182 struct frame_saved_regs fsr
;
184 d10v_frame_find_saved_regs (frame
, &fsr
);
186 if (frame
->return_pc
== IMEM_START
)
189 if (!fsr
.regs
[FP_REGNUM
])
191 if (!fsr
.regs
[SP_REGNUM
] || fsr
.regs
[SP_REGNUM
] == STACK_START
)
194 return fsr
.regs
[SP_REGNUM
];
197 if (!read_memory_unsigned_integer(fsr
.regs
[FP_REGNUM
],2))
200 return read_memory_unsigned_integer(fsr
.regs
[FP_REGNUM
],2)| DMEM_START
;
203 static int next_addr
, uses_frame
;
206 prologue_find_regs (op
, fsr
, addr
)
208 struct frame_saved_regs
*fsr
;
214 if ((op
& 0x7E1F) == 0x6C1F)
216 n
= (op
& 0x1E0) >> 5;
218 fsr
->regs
[n
] = next_addr
;
223 else if ((op
& 0x7E3F) == 0x6E1F)
225 n
= (op
& 0x1E0) >> 5;
227 fsr
->regs
[n
] = next_addr
;
228 fsr
->regs
[n
+1] = next_addr
+2;
233 if ((op
& 0x7FE1) == 0x01E1)
235 n
= (op
& 0x1E) >> 1;
254 if ((op
& 0x7E1F) == 0x681E)
256 n
= (op
& 0x1E0) >> 5;
257 fsr
->regs
[n
] = next_addr
;
262 if ((op
& 0x7E3F) == 0x3A1E)
264 n
= (op
& 0x1E0) >> 5;
265 fsr
->regs
[n
] = next_addr
;
266 fsr
->regs
[n
+1] = next_addr
+2;
273 /* Put here the code to store, into a struct frame_saved_regs, the
274 addresses of the saved registers of frame described by FRAME_INFO.
275 This includes special registers such as pc and fp saved in special
276 ways in the stack frame. sp is even more special: the address we
277 return for it IS the sp for the next frame. */
279 d10v_frame_find_saved_regs (fi
, fsr
)
280 struct frame_info
*fi
;
281 struct frame_saved_regs
*fsr
;
285 unsigned short op1
, op2
;
289 memset (fsr
, 0, sizeof (*fsr
));
292 pc
= get_pc_function_start (fi
->pc
);
297 op
= (unsigned long)read_memory_integer (pc
, 4);
298 if ((op
& 0xC0000000) == 0xC0000000)
300 /* long instruction */
301 if ((op
& 0x3FFF0000) == 0x01FF0000)
304 short n
= op
& 0xFFFF;
307 else if ((op
& 0x3F0F0000) == 0x340F0000)
309 /* st rn, @(offset,sp) */
310 short offset
= op
& 0xFFFF;
311 short n
= (op
>> 20) & 0xF;
312 fsr
->regs
[n
] = next_addr
+ offset
;
314 else if ((op
& 0x3F1F0000) == 0x350F0000)
316 /* st2w rn, @(offset,sp) */
317 short offset
= op
& 0xFFFF;
318 short n
= (op
>> 20) & 0xF;
319 fsr
->regs
[n
] = next_addr
+ offset
;
320 fsr
->regs
[n
+1] = next_addr
+ offset
+ 2;
327 /* short instructions */
328 if ((op
& 0xC0000000) == 0x80000000)
330 op2
= (op
& 0x3FFF8000) >> 15;
335 op1
= (op
& 0x3FFF8000) >> 15;
338 if (!prologue_find_regs(op1
,fsr
,pc
) || !prologue_find_regs(op2
,fsr
,pc
))
344 fi
->size
= -next_addr
;
347 fp
= read_register(SP_REGNUM
) | DMEM_START
;
349 for (i
=0; i
<NUM_REGS
-1; i
++)
352 fsr
->regs
[i
] = fp
- (next_addr
- fsr
->regs
[i
]);
355 if (fsr
->regs
[LR_REGNUM
])
356 fi
->return_pc
= ((read_memory_unsigned_integer(fsr
->regs
[LR_REGNUM
],2) - 1) << 2) | IMEM_START
;
358 fi
->return_pc
= ((read_register(LR_REGNUM
) - 1) << 2) | IMEM_START
;
360 /* th SP is not normally (ever?) saved, but check anyway */
361 if (!fsr
->regs
[SP_REGNUM
])
363 /* if the FP was saved, that means the current FP is valid, */
364 /* otherwise, it isn't being used, so we use the SP instead */
366 fsr
->regs
[SP_REGNUM
] = read_register(FP_REGNUM
) + fi
->size
;
369 fsr
->regs
[SP_REGNUM
] = fp
+ fi
->size
;
371 fsr
->regs
[FP_REGNUM
] = 0;
377 d10v_init_extra_frame_info (fromleaf
, fi
)
379 struct frame_info
*fi
;
381 struct frame_saved_regs dummy
;
383 if (fi
->next
&& ((fi
->pc
& 0xffff) == 0))
384 fi
->pc
= fi
->next
->return_pc
;
386 d10v_frame_find_saved_regs (fi
, &dummy
);
390 show_regs (args
, from_tty
)
394 long long num1
, num2
;
395 printf_filtered ("PC=%04x (0x%x) PSW=%04x RPT_S=%04x RPT_E=%04x RPT_C=%04x\n",
396 read_register (PC_REGNUM
), (read_register (PC_REGNUM
) << 2) + IMEM_START
,
397 read_register (PSW_REGNUM
),
401 printf_filtered ("R0-R7 %04x %04x %04x %04x %04x %04x %04x %04x\n",
410 printf_filtered ("R8-R15 %04x %04x %04x %04x %04x %04x %04x %04x\n",
419 printf_filtered ("IMAP0 %04x IMAP1 %04x DMAP %04x\n",
420 read_register (IMAP0_REGNUM
),
421 read_register (IMAP1_REGNUM
),
422 read_register (DMAP_REGNUM
));
423 read_register_gen (A0_REGNUM
, (char *)&num1
);
424 read_register_gen (A0_REGNUM
+1, (char *)&num2
);
425 printf_filtered ("A0-A1 %010llx %010llx\n",num1
, num2
);
429 _initialize_d10v_tdep ()
431 tm_print_insn
= print_insn_d10v
;
432 add_com ("regs", class_vars
, show_regs
, "Print all registers");
436 d10v_xlate_addr (addr
)
442 imap
= (int)read_register(IMAP0_REGNUM
);
444 imap
= (int)read_register(IMAP1_REGNUM
);
447 return (CORE_ADDR
)(addr
+ 0x1000000);
448 return (CORE_ADDR
)(addr
+ (imap
& 0xff)*0x20000);
456 int save_pid
, retval
;
458 save_pid
= inferior_pid
;
460 retval
= (int)read_register (PC_REGNUM
);
461 inferior_pid
= save_pid
;
462 return d10v_xlate_addr(retval
<< 2);
466 d10v_write_pc (val
, pid
)
472 save_pid
= inferior_pid
;
474 write_register (PC_REGNUM
, (val
& 0x3ffff) >> 2);
475 inferior_pid
= save_pid
;
481 return (read_register(SP_REGNUM
) | DMEM_START
);
488 write_register (SP_REGNUM
, (LONGEST
)(val
& 0xffff));
492 d10v_fix_call_dummy (dummyname
, start_sp
, fun
, nargs
, args
, type
, gcc_p
)
503 char buffer
[MAX_REGISTER_RAW_SIZE
];
504 struct frame_info
*frame
= get_current_frame ();
505 frame
->dummy
= start_sp
;
506 start_sp
|= DMEM_START
;
509 for (regnum
= 0; regnum
< NUM_REGS
; regnum
++)
511 sp
-= REGISTER_RAW_SIZE(regnum
);
512 store_address (buffer
, REGISTER_RAW_SIZE(regnum
), read_register(regnum
));
513 write_memory (sp
, buffer
, REGISTER_RAW_SIZE(regnum
));
515 write_register (SP_REGNUM
, (LONGEST
)(sp
& 0xffff));
516 /* now we need to load LR with the return address */
517 write_register (LR_REGNUM
, (LONGEST
)(d10v_call_dummy_address() & 0xffff) >> 2);
522 d10v_pop_dummy_frame (fi
)
523 struct frame_info
*fi
;
525 CORE_ADDR sp
= fi
->dummy
;
528 for (regnum
= 0; regnum
< NUM_REGS
; regnum
++)
530 sp
-= REGISTER_RAW_SIZE(regnum
);
531 write_register(regnum
, read_memory_unsigned_integer (sp
, REGISTER_RAW_SIZE(regnum
)));
533 flush_cached_frames (); /* needed? */
538 d10v_push_arguments (nargs
, args
, sp
, struct_return
, struct_addr
)
543 CORE_ADDR struct_addr
;
545 int i
, len
, index
=0, regnum
=2;
546 char buffer
[4], *contents
;
550 /* Pass 1. Put all large args on stack */
551 for (i
= 0; i
< nargs
; i
++)
553 value_ptr arg
= args
[i
];
554 struct type
*arg_type
= check_typedef (VALUE_TYPE (arg
));
555 len
= TYPE_LENGTH (arg_type
);
556 contents
= VALUE_CONTENTS(arg
);
557 val
= extract_signed_integer (contents
, len
);
560 /* put on stack and pass pointers */
562 write_memory (sp
, contents
, len
);
569 for (i
= 0; i
< nargs
; i
++)
571 value_ptr arg
= args
[i
];
572 struct type
*arg_type
= check_typedef (VALUE_TYPE (arg
));
573 len
= TYPE_LENGTH (arg_type
);
574 contents
= VALUE_CONTENTS(arg
);
575 val
= extract_signed_integer (contents
, len
);
578 /* use a pointer to previously saved data */
580 write_register (regnum
++, ptrs
[index
++]);
583 /* no more registers available. put it on the stack */
585 store_address (buffer
, 2, ptrs
[index
++]);
586 write_memory (sp
, buffer
, 2);
594 write_register (regnum
++, val
>>16);
595 write_register (regnum
++, val
& 0xffff);
600 store_address (buffer
, len
, val
);
601 write_memory (sp
, buffer
, len
);
609 /* pick an out-of-the-way place to set the return value */
610 /* for an inferior function call. The link register is set to this */
611 /* value and a momentary breakpoint is set there. When the breakpoint */
612 /* is hit, the dummy frame is popped and the previous environment is */
616 d10v_call_dummy_address ()
619 struct minimal_symbol
*sym
;
621 entry
= entry_point_address ();
626 sym
= lookup_minimal_symbol ("_start", NULL
, symfile_objfile
);
628 if (!sym
|| MSYMBOL_TYPE (sym
) != mst_text
)
631 return SYMBOL_VALUE_ADDRESS (sym
);
634 /* Given a return value in `regbuf' with a type `valtype',
635 extract and copy its value into `valbuf'. */
638 d10v_extract_return_value (valtype
, regbuf
, valbuf
)
639 struct type
*valtype
;
640 char regbuf
[REGISTER_BYTES
];
643 memcpy (valbuf
, regbuf
+ REGISTER_BYTE (2), TYPE_LENGTH (valtype
));