1 /* Target-dependent code for Hitachi Super-H, for GDB.
2 Copyright (C) 1993, 1994, 1995 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
21 Contributed by Steve Chamberlain
35 /* Prologue looks like
36 [mov.l <regs>,@-r15]...
42 #define IS_STS(x) ((x) == 0x4f22)
43 #define IS_PUSH(x) (((x) & 0xff0f) == 0x2f06)
44 #define GET_PUSHED_REG(x) (((x) >> 4) & 0xf)
45 #define IS_MOV_SP_FP(x) ((x) == 0x6ef3)
46 #define IS_ADD_SP(x) (((x) & 0xff00) == 0x7f00)
47 #define IS_MOV_R3(x) (((x) & 0xff00) == 0x1a00)
48 #define IS_SHLL_R3(x) ((x) == 0x4300)
49 #define IS_ADD_R3SP(x) ((x) == 0x3f3c)
51 /* Skip any prologue before the guts of a function */
54 sh_skip_prologue (start_pc
)
59 w
= read_memory_integer (start_pc
, 2);
69 w
= read_memory_integer (start_pc
, 2);
75 /* Disassemble an instruction. */
78 gdb_print_insn_sh (memaddr
, info
)
80 disassemble_info
*info
;
82 if (TARGET_BYTE_ORDER
== BIG_ENDIAN
)
83 return print_insn_sh (memaddr
, info
);
85 return print_insn_shl (memaddr
, info
);
88 /* Given a GDB frame, determine the address of the calling function's frame.
89 This will be used to create a new GDB frame struct, and then
90 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
92 For us, the frame address is its stack pointer value, so we look up
93 the function prologue to determine the caller's sp value, and return it. */
96 sh_frame_chain (frame
)
97 struct frame_info
*frame
;
99 if (!inside_entry_file (frame
->pc
))
100 return read_memory_integer (FRAME_FP (frame
) + frame
->f_offset
, 4);
105 /* Put here the code to store, into a struct frame_saved_regs, the
106 addresses of the saved registers of frame described by FRAME_INFO.
107 This includes special registers such as pc and fp saved in special
108 ways in the stack frame. sp is even more special: the address we
109 return for it IS the sp for the next frame. */
112 frame_find_saved_regs (fi
, fsr
)
113 struct frame_info
*fi
;
114 struct frame_saved_regs
*fsr
;
125 opc
= pc
= get_pc_function_start (fi
->pc
);
127 insn
= read_memory_integer (pc
, 2);
129 fi
->leaf_function
= 1;
132 for (rn
= 0; rn
< NUM_REGS
; rn
++)
137 /* Loop around examining the prologue insns, but give up
138 after 15 of them, since we're getting silly then */
139 while (pc
< opc
+ 15 * 2)
141 /* See where the registers will be saved to */
145 rn
= GET_PUSHED_REG (insn
);
147 insn
= read_memory_integer (pc
, 2);
150 else if (IS_STS (insn
))
153 where
[PR_REGNUM
] = depth
;
154 insn
= read_memory_integer (pc
, 2);
155 /* If we're storing the pr then this isn't a leaf */
156 fi
->leaf_function
= 0;
159 else if (IS_MOV_R3 (insn
))
161 r3_val
= (char) (insn
& 0xff);
163 insn
= read_memory_integer (pc
, 2);
165 else if (IS_SHLL_R3 (insn
))
169 insn
= read_memory_integer (pc
, 2);
171 else if (IS_ADD_R3SP (insn
))
175 insn
= read_memory_integer (pc
, 2);
177 else if (IS_ADD_SP (insn
))
180 depth
+= -((char) (insn
& 0xff));
181 insn
= read_memory_integer (pc
, 2);
187 /* Now we know how deep things are, we can work out their addresses */
189 for (rn
= 0; rn
< NUM_REGS
; rn
++)
196 fsr
->regs
[rn
] = fi
->frame
- where
[rn
] + depth
- 4;
206 fsr
->regs
[SP_REGNUM
] = read_memory_integer (fsr
->regs
[FP_REGNUM
], 4);
210 fsr
->regs
[SP_REGNUM
] = fi
->frame
- 4;
213 fi
->f_offset
= depth
- where
[FP_REGNUM
] - 4;
214 /* Work out the return pc - either from the saved pr or the pr
216 /* Just called, so dig out the real return */
217 if (fi
->return_pc
== 0)
219 fi
->return_pc
= read_register (PR_REGNUM
) + 4;
224 if (fsr
->regs
[PR_REGNUM
])
226 fi
->return_pc
= read_memory_integer (fsr
->regs
[PR_REGNUM
], 4) + 4;
230 fi
->return_pc
= read_register (PR_REGNUM
) + 4;
235 /* initialize the extra info saved in a FRAME */
238 init_extra_frame_info (fromleaf
, fi
)
240 struct frame_info
*fi
;
242 struct frame_saved_regs dummy
;
244 frame_find_saved_regs (fi
, &dummy
);
248 /* Discard from the stack the innermost frame,
249 restoring all saved registers. */
254 register struct frame_info
*frame
= get_current_frame ();
255 register CORE_ADDR fp
;
257 struct frame_saved_regs fsr
;
259 fp
= FRAME_FP (frame
);
260 get_frame_saved_regs (frame
, &fsr
);
262 /* Copy regs from where they were saved in the frame */
263 for (regnum
= 0; regnum
< NUM_REGS
; regnum
++)
265 if (fsr
.regs
[regnum
])
267 write_register (regnum
, read_memory_integer (fsr
.regs
[regnum
], 4));
271 write_register (PC_REGNUM
, frame
->return_pc
);
272 write_register (SP_REGNUM
, fp
+ 4);
273 flush_cached_frames ();
276 /* Print the registers in a form similar to the E7000 */
279 show_regs (args
, from_tty
)
283 printf_filtered ("PC=%08x SR=%08x PR=%08x MACH=%08x MACHL=%08x\n",
284 read_register (PC_REGNUM
),
285 read_register (SR_REGNUM
),
286 read_register (PR_REGNUM
),
287 read_register (MACH_REGNUM
),
288 read_register (MACL_REGNUM
));
290 printf_filtered ("R0-R7 %08x %08x %08x %08x %08x %08x %08x %08x\n",
299 printf_filtered ("R8-R15 %08x %08x %08x %08x %08x %08x %08x %08x\n",
311 _initialize_sh_tdep ()
313 tm_print_insn
= gdb_print_insn_sh
;
315 add_com ("regs", class_vars
, show_regs
, "Print all registers");
This page took 0.068004 seconds and 4 git commands to generate.