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
));
34 /* Discard from the stack the innermost frame,
35 restoring all saved registers. */
40 struct frame_info
*frame
= get_current_frame ();
43 struct frame_saved_regs fsr
;
46 fp
= FRAME_FP (frame
);
47 /* fill out fsr with the address of where each */
48 /* register was stored in the frame */
49 get_frame_saved_regs (frame
, &fsr
);
51 /* now update the current registers with the old values */
52 for (regnum
= A0_REGNUM
; regnum
< A0_REGNUM
+2 ; regnum
++)
56 read_memory (fsr
.regs
[regnum
], raw_buffer
, 8);
57 write_register_bytes (REGISTER_BYTE (regnum
), raw_buffer
, 8);
60 for (regnum
= 0; regnum
< SP_REGNUM
; regnum
++)
64 write_register (regnum
, read_memory_unsigned_integer (fsr
.regs
[regnum
], 2));
67 if (fsr
.regs
[PSW_REGNUM
])
69 write_register (PSW_REGNUM
, read_memory_unsigned_integer (fsr
.regs
[PSW_REGNUM
], 2));
72 write_register (PC_REGNUM
, read_register(13));
73 write_register (SP_REGNUM
, fp
+ frame
->size
);
74 target_store_registers (-1);
75 flush_cached_frames ();
83 if ((op
& 0x7E1F) == 0x6C1F)
87 if ((op
& 0x7E3F) == 0x6E1F)
91 if ((op
& 0x7FE1) == 0x01E1)
103 if ((op
& 0x7E1F) == 0x681E)
107 if ((op
& 0x7E3F) == 0x3A1E)
114 d10v_skip_prologue (pc
)
118 unsigned short op1
, op2
;
120 if (target_read_memory (pc
, (char *)&op
, 4))
121 return pc
; /* Can't access it -- assume no prologue. */
125 op
= (unsigned long)read_memory_integer (pc
, 4);
126 if ((op
& 0xC0000000) == 0xC0000000)
128 /* long instruction */
129 if ( ((op
& 0x3FFF0000) != 0x01FF0000) && /* add3 sp,sp,n */
130 ((op
& 0x3F0F0000) != 0x340F0000) && /* st rn, @(offset,sp) */
131 ((op
& 0x3F1F0000) != 0x350F0000)) /* st2w rn, @(offset,sp) */
136 /* short instructions */
137 op1
= (op
& 0x3FFF8000) >> 15;
139 if (!check_prologue(op1
) || !check_prologue(op2
))
147 /* Given a GDB frame, determine the address of the calling function's frame.
148 This will be used to create a new GDB frame struct, and then
149 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
153 d10v_frame_chain (frame
)
154 struct frame_info
*frame
;
156 struct frame_saved_regs fsr
;
158 if (inside_entry_file (frame
->pc
))
161 d10v_frame_find_saved_regs (frame
, &fsr
);
163 if (!fsr
.regs
[FP_REGNUM
])
165 return (CORE_ADDR
)fsr
.regs
[SP_REGNUM
];
167 return read_memory_unsigned_integer(fsr
.regs
[FP_REGNUM
],2);
170 static int next_addr
;
173 prologue_find_regs (op
, fsr
, addr
)
175 struct frame_saved_regs
*fsr
;
181 if ((op
& 0x7E1F) == 0x6C1F)
183 n
= (op
& 0x1E0) >> 5;
185 fsr
->regs
[n
] = next_addr
;
190 else if ((op
& 0x7E3F) == 0x6E1F)
192 n
= (op
& 0x1E0) >> 5;
194 fsr
->regs
[n
] = next_addr
;
195 fsr
->regs
[n
+1] = next_addr
+2;
200 if ((op
& 0x7FE1) == 0x01E1)
202 n
= (op
& 0x1E) >> 1;
218 if ((op
& 0x7E1F) == 0x681E)
220 n
= (op
& 0x1E0) >> 5;
221 fsr
->regs
[n
] = next_addr
;
226 if ((op
& 0x7E3F) == 0x3A1E)
228 n
= (op
& 0x1E0) >> 5;
229 fsr
->regs
[n
] = next_addr
;
230 fsr
->regs
[n
+1] = next_addr
+2;
237 /* Put here the code to store, into a struct frame_saved_regs, the
238 addresses of the saved registers of frame described by FRAME_INFO.
239 This includes special registers such as pc and fp saved in special
240 ways in the stack frame. sp is even more special: the address we
241 return for it IS the sp for the next frame. */
243 d10v_frame_find_saved_regs (fi
, fsr
)
244 struct frame_info
*fi
;
245 struct frame_saved_regs
*fsr
;
249 unsigned short op1
, op2
;
253 memset (fsr
, 0, sizeof (*fsr
));
256 pc
= get_pc_function_start (fi
->pc
);
260 op
= (unsigned long)read_memory_integer (pc
, 4);
261 if ((op
& 0xC0000000) == 0xC0000000)
263 /* long instruction */
264 if ((op
& 0x3FFF0000) == 0x01FF0000)
267 short n
= op
& 0xFFFF;
270 else if ((op
& 0x3F0F0000) == 0x340F0000)
272 /* st rn, @(offset,sp) */
273 short offset
= op
& 0xFFFF;
274 short n
= (op
>> 20) & 0xF;
275 fsr
->regs
[n
] = next_addr
+ offset
;
277 else if ((op
& 0x3F1F0000) == 0x350F0000)
279 /* st2w rn, @(offset,sp) */
280 short offset
= op
& 0xFFFF;
281 short n
= (op
>> 20) & 0xF;
282 fsr
->regs
[n
] = next_addr
+ offset
;
283 fsr
->regs
[n
+1] = next_addr
+ offset
+ 2;
290 /* short instructions */
291 op1
= (op
& 0x3FFF8000) >> 15;
293 if (!prologue_find_regs(op1
,fsr
,pc
) || !prologue_find_regs(op2
,fsr
,pc
))
299 fi
->size
= -next_addr
;
301 for (i
=0; i
<NUM_REGS
-1; i
++)
304 fsr
->regs
[i
] = fp
- (next_addr
- fsr
->regs
[i
]);
308 fi
->return_pc
= (read_memory_unsigned_integer(fsr
->regs
[13],2)-1) << 2;
310 fi
->return_pc
= (read_register(13) - 1) << 2;
312 /* th SP is not normally (ever?) saved, but check anyway */
313 if (!fsr
->regs
[SP_REGNUM
])
315 /* if the FP was saved, that means the current FP is valid, */
316 /* otherwise, it isn't being used, so we use the SP instead */
317 if (fsr
->regs
[FP_REGNUM
])
318 fsr
->regs
[SP_REGNUM
] = read_register(FP_REGNUM
) + fi
->size
;
320 fsr
->regs
[SP_REGNUM
] = read_register(SP_REGNUM
) + fi
->size
;
325 d10v_init_extra_frame_info (fromleaf
, fi
)
327 struct frame_info
*fi
;
329 struct frame_saved_regs dummy
;
331 if (fi
->next
&& (fi
->pc
== 0))
332 fi
->pc
= fi
->next
->return_pc
;
334 d10v_frame_find_saved_regs (fi
, &dummy
);
335 if (!dummy
.regs
[FP_REGNUM
])
337 fi
->frame
= dummy
.regs
[SP_REGNUM
] - fi
->size
;
338 d10v_frame_find_saved_regs (fi
, &dummy
);
343 show_regs (args
, from_tty
)
347 long long num1
, num2
;
348 printf_filtered ("PC=%04x (0x%x) PSW=%04x RPT_S=%04x RPT_E=%04x RPT_C=%04x\n",
349 read_register (PC_REGNUM
), read_register (PC_REGNUM
) << 2,
350 read_register (PSW_REGNUM
),
354 printf_filtered ("R0-R7 %04x %04x %04x %04x %04x %04x %04x %04x\n",
363 printf_filtered ("R8-R15 %04x %04x %04x %04x %04x %04x %04x %04x\n",
372 read_register_gen (A0_REGNUM
, (char *)&num1
);
373 read_register_gen (A0_REGNUM
+1, (char *)&num2
);
374 printf_filtered ("A0-A1 %010llx %010llx\n",num1
, num2
);
378 _initialize_d10v_tdep ()
380 tm_print_insn
= print_insn_d10v
;
381 add_com ("regs", class_vars
, show_regs
, "Print all registers");
385 d10v_read_register_pid (regno
, pid
)
391 if (pid
== inferior_pid
)
392 return (read_register(regno
)) << 2;
394 save_pid
= inferior_pid
;
396 retval
= read_register (regno
);
397 inferior_pid
= save_pid
;
398 return (retval
<< 2);
402 d10v_write_register_pid (regno
, val
, pid
)
411 if (pid
== inferior_pid
)
413 write_register (regno
, val
);
417 save_pid
= inferior_pid
;
419 write_register (regno
, val
);
420 inferior_pid
= save_pid
;
425 d10v_fix_call_dummy (dummyname
, start_sp
, fun
, nargs
, args
, type
, gcc_p
)
436 char buffer
[MAX_REGISTER_RAW_SIZE
];
439 for (regnum
= 0; regnum
< NUM_REGS
-1; regnum
++)
441 store_address (buffer
, REGISTER_RAW_SIZE(regnum
), read_register(regnum
));
442 write_memory (sp
, buffer
, REGISTER_RAW_SIZE(regnum
));
443 sp
-= REGISTER_RAW_SIZE(regnum
);
445 write_register (SP_REGNUM
, (LONGEST
)sp
);
446 /* now we need to load PC with the return address */
447 write_register (PC_REGNUM
, (LONGEST
)d10v_call_dummy_address()>>2);
448 write_register (LR_REGNUM
, (LONGEST
)d10v_call_dummy_address()>>2);
449 target_store_registers (-1);
450 flush_cached_frames ();
454 d10v_push_arguments (nargs
, args
, sp
, struct_return
, struct_addr
)
459 CORE_ADDR struct_addr
;
461 int i
, len
, regnum
=2;
464 for (i
= 0; i
< nargs
; i
++)
466 value_ptr arg
= args
[i
];
467 struct type
*arg_type
= check_typedef (VALUE_TYPE (arg
));
468 switch (TYPE_CODE (arg_type
))
473 case TYPE_CODE_RANGE
:
479 len
= TYPE_LENGTH (arg_type
);
480 contents
= VALUE_CONTENTS(arg
);
484 write_register (regnum
++, (LONGEST
)(*contents
));
487 write_register (regnum
++, (LONGEST
)(*(short *)contents
));
491 LONGEST val
= *(long *)contents
;
492 write_register (regnum
++, val
>> 16 );
493 write_register (regnum
++, val
& 0xFFFF );
502 d10v_call_dummy_address ()
504 CORE_ADDR entry
, retval
;
505 struct minimal_symbol
*sym
;
507 entry
= entry_point_address ();
514 sym
= lookup_minimal_symbol ("_start", NULL
, symfile_objfile
);
516 if (!sym
|| MSYMBOL_TYPE (sym
) != mst_text
)
519 retval
= SYMBOL_VALUE_ADDRESS (sym
);
523 /* Given a return value in `regbuf' with a type `valtype',
524 extract and copy its value into `valbuf'. */
527 d10v_extract_return_value (valtype
, regbuf
, valbuf
)
528 struct type
*valtype
;
529 char regbuf
[REGISTER_BYTES
];
532 memcpy (valbuf
, regbuf
+ REGISTER_BYTE (2), TYPE_LENGTH (valtype
));