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 */
29 void d10v_frame_find_saved_regs
PARAMS ((struct frame_info
*fi
, struct frame_saved_regs
*fsr
));
31 /* Discard from the stack the innermost frame,
32 restoring all saved registers. */
37 struct frame_info
*frame
= get_current_frame ();
40 struct frame_saved_regs fsr
;
43 fp
= FRAME_FP (frame
);
44 /* printf("pop_frame 0x%x\n",fp); */
46 /* fill out fsr with the address of where each */
47 /* register was stored in the frame */
48 get_frame_saved_regs (frame
, &fsr
);
50 /* r13 contains the old PC. save it. */
51 r13
= read_register (13);
53 /* now update the current registers with the old values */
54 for (regnum
= A0_REGNUM
; regnum
< A0_REGNUM
+2 ; regnum
++)
58 read_memory (fsr
.regs
[regnum
] & 0xFFFF, raw_buffer
, 8);
59 write_register_bytes (REGISTER_BYTE (regnum
), raw_buffer
, 8);
62 for (regnum
= 0; regnum
< SP_REGNUM
; regnum
++)
66 write_register (regnum
, read_memory_integer (fsr
.regs
[regnum
] & 0xFFFF, 2));
69 if (fsr
.regs
[PSW_REGNUM
])
71 write_register (PSW_REGNUM
, read_memory_integer (fsr
.regs
[PSW_REGNUM
] & 0xFFFF, 2));
74 /* PC is set to r13 */
75 write_register (PC_REGNUM
, r13
);
76 /* printf("setting stack to %x\n",fp - frame->size); */
77 write_register (SP_REGNUM
, fp
- frame
->size
);
78 flush_cached_frames ();
86 if ((op
& 0x7E1F) == 0x6C1F)
90 if ((op
& 0x7E3F) == 0x6E1F)
94 if ((op
& 0x7FE1) == 0x01E1)
106 if ((op
& 0x7E1F) == 0x681E)
110 if ((op
& 0x7E3F) == 0x3A1E)
118 d10v_skip_prologue (pc
)
122 unsigned short op1
, op2
;
124 if (target_read_memory (pc
, (char *)&op
, 4))
125 return pc
; /* Can't access it -- assume no prologue. */
129 op
= read_memory_integer (pc
, 4);
130 if ((op
& 0xC0000000) == 0xC0000000)
132 /* long instruction */
133 if ( ((op
& 0x3FFF0000) != 0x01FF0000) && /* add3 sp,sp,n */
134 ((op
& 0x3F0F0000) != 0x340F0000) && /* st rn, @(offset,sp) */
135 ((op
& 0x3F1F0000) != 0x350F0000)) /* st2w rn, @(offset,sp) */
140 /* short instructions */
141 op1
= (op
& 0x3FFF8000) >> 15;
143 if (!check_prologue(op1
) || !check_prologue(op2
))
151 /* Given a GDB frame, determine the address of the calling function's frame.
152 This will be used to create a new GDB frame struct, and then
153 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
155 For us, the frame address is its stack pointer value, so we look up
156 the function prologue to determine the caller's sp value, and return it. */
159 d10v_frame_chain (frame
)
160 struct frame_info
*frame
;
162 struct frame_saved_regs fsr
;
163 /* printf("frame_chain %x\n",frame->frame); */
164 d10v_frame_find_saved_regs (frame
, &fsr
);
165 /* printf("pc=%x\n",fsr.regs[PC_REGNUM]);
166 printf("fp=%x (%x)\n",fsr.regs[FP_REGNUM],read_memory_integer(fsr.regs[FP_REGNUM],2) & 0xffff); */
167 return read_memory_integer(fsr
.regs
[FP_REGNUM
],2) & 0xffff;
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
= 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
;
300 fi
->return_pc
= read_register (13);
302 for (i
=0; i
<NUM_REGS
; i
++)
305 fsr
->regs
[i
] = fp
- (next_addr
- fsr
->regs
[i
]);
306 /* printf("register %d = *(%x) = %x\n",i,fsr->regs[i],read_memory_integer((fsr->regs[i]) & 0xffff, 2)); */
311 d10v_init_extra_frame_info (fromleaf
, fi
)
313 struct frame_info
*fi
;
315 struct frame_saved_regs dummy
;
316 /* printf("extra init %x next=%x pc=%x\n",fi->frame,fi->next,fi->pc); */
318 /* fi->pc = fi->next->return_pc; */
319 d10v_frame_find_saved_regs (fi
, &dummy
);
320 /* printf(" %x next=%x pc=%x\n",fi->frame,fi->next,fi->pc); */
324 show_regs (args
, from_tty
)
328 long long num1
, num2
;
329 printf_filtered ("PC=%04x (0x%x) PSW=%04x RPT_S=%04x RPT_E=%04x RPT_C=%04x\n",
330 read_register (PC_REGNUM
), read_register (PC_REGNUM
) << 2,
331 read_register (PSW_REGNUM
),
335 printf_filtered ("R0-R7 %04x %04x %04x %04x %04x %04x %04x %04x\n",
344 printf_filtered ("R8-R15 %04x %04x %04x %04x %04x %04x %04x %04x\n",
353 read_register_gen (A0_REGNUM
, (char *)&num1
);
354 read_register_gen (A0_REGNUM
+1, (char *)&num2
);
355 printf_filtered ("A0-A1 %010llx %010llx\n",num1
, num2
);
359 _initialize_d10v_tdep ()
361 struct cmd_list_element
*c
;
362 tm_print_insn
= print_insn_d10v
;
363 add_com ("regs", class_vars
, show_regs
, "Print all registers");
367 d10v_read_register_pid (regno
, pid
)
373 if (pid
== inferior_pid
)
374 return (read_register(regno
)) << 2;
376 save_pid
= inferior_pid
;
378 retval
= read_register (regno
);
379 inferior_pid
= save_pid
;
380 return (retval
<< 2);
384 d10v_write_register_pid (regno
, val
, pid
)
393 if (pid
== inferior_pid
)
395 write_register (regno
, val
);
399 save_pid
= inferior_pid
;
401 write_register (regno
, val
);
402 inferior_pid
= save_pid
;