1 /* Target-machine dependent code for Hitachi Super-H, for GDB.
2 Copyright (C) 1993 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
33 #include "../opcodes/sh-opc.h"
38 /* Prologue looks like
39 [mov.l <regs>,@-r15]...
45 #define IS_STS(x) ((x) == 0x4f22)
46 #define IS_PUSH(x) (((x) & 0xff0f) == 0x2f06)
47 #define GET_PUSHED_REG(x) (((x) >> 4) & 0xf)
48 #define IS_MOV_SP_FP(x) ((x) == 0x6ef3)
49 #define IS_ADD_SP(x) (((x) & 0xff00) == 0x7f00)
50 #define IS_MOV_R3(x) (((x) & 0xff00) == 0x1a00)
51 #define IS_SHLL_R3(x) ((x) == 0x4300)
52 #define IS_ADD_R3SP(x) ((x) == 0x3f3c)
54 /* Skip any prologue before the guts of a function */
57 sh_skip_prologue (start_pc)
63 w = read_memory_integer (start_pc, 2);
73 w = read_memory_integer (start_pc, 2);
79 /* Disassemble an instruction */
82 print_insn (memaddr, stream)
86 disassemble_info info;
87 GDB_INIT_DISASSEMBLE_INFO (info, stream);
88 return print_insn_sh (memaddr, &info);
91 /* Given a GDB frame, determine the address of the calling function's frame.
92 This will be used to create a new GDB frame struct, and then
93 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
95 For us, the frame address is its stack pointer value, so we look up
96 the function prologue to determine the caller's sp value, and return it. */
99 sh_frame_chain (thisframe)
102 if (!inside_entry_file (thisframe->pc))
103 return (read_memory_integer (FRAME_FP (thisframe) + thisframe->f_offset, 4));
108 /* Put here the code to store, into a struct frame_saved_regs,
109 the addresses of the saved registers of frame described by FRAME_INFO.
110 This includes special registers such as pc and fp saved in special
111 ways in the stack frame. sp is even more special:
112 the address we return for it IS the sp for the next frame. */
116 frame_find_saved_regs (fi, fsr)
117 struct frame_info *fi;
118 struct frame_saved_regs *fsr;
130 opc = pc = get_pc_function_start (fi->pc);
132 insn = read_memory_integer (pc, 2);
134 fi->leaf_function = 1;
137 for (rn = 0; rn < NUM_REGS; rn++)
142 /* Loop around examining the prologue insns, but give up
143 after 15 of them, since we're getting silly then */
144 while (pc < opc + 15 * 2)
146 /* See where the registers will be saved to */
150 rn = GET_PUSHED_REG (insn);
152 insn = read_memory_integer (pc, 2);
155 else if (IS_STS (insn))
158 where[PR_REGNUM] = depth;
159 insn = read_memory_integer (pc, 2);
160 /* If we're storing the pr then this isn't a leaf */
161 fi->leaf_function = 0;
164 else if (IS_MOV_R3 (insn))
166 r3_val = (char)(insn & 0xff);
168 insn = read_memory_integer (pc, 2);
170 else if (IS_SHLL_R3 (insn))
174 insn = read_memory_integer (pc, 2);
176 else if (IS_ADD_R3SP (insn))
180 insn = read_memory_integer (pc, 2);
182 else if (IS_ADD_SP (insn))
185 depth += -((char) (insn & 0xff));
186 insn = read_memory_integer (pc, 2);
192 /* Now we know how deep things are, we can work out their addresses */
194 for (rn = 0; rn < NUM_REGS; rn++)
201 fsr->regs[rn] = fi->frame - where[rn] + depth - 4;
211 fsr->regs[SP_REGNUM] = read_memory_integer (fsr->regs[FP_REGNUM], 4);
215 fsr->regs[SP_REGNUM] = fi->frame - 4;
218 fi->f_offset = depth - where[FP_REGNUM] - 4;
219 /* Work out the return pc - either from the saved pr or the pr
221 /* Just called, so dig out the real return */
222 if (fi->return_pc == 0)
224 fi->return_pc = read_register (PR_REGNUM) + 4;
228 if (fsr->regs[PR_REGNUM])
230 fi->return_pc = read_memory_integer (fsr->regs[PR_REGNUM], 4) + 4;
234 fi->return_pc = read_register (PR_REGNUM) + 4;
239 /* initialize the extra info saved in a FRAME */
242 init_extra_frame_info (fromleaf, fi)
244 struct frame_info *fi;
246 struct frame_saved_regs dummy;
247 frame_find_saved_regs (fi, &dummy);
251 /* Discard from the stack the innermost frame,
252 restoring all saved registers. */
257 register FRAME frame = get_current_frame ();
258 register CORE_ADDR fp;
260 struct frame_saved_regs fsr;
261 struct frame_info *fi;
263 fi = get_frame_info (frame);
265 get_frame_saved_regs (fi, &fsr);
267 /* Copy regs from where they were saved in the frame */
268 for (regnum = 0; regnum < NUM_REGS; regnum++)
270 if (fsr.regs[regnum])
272 write_register (regnum, read_memory_integer (fsr.regs[regnum], 4));
276 write_register (PC_REGNUM, fi->return_pc);
277 write_register (SP_REGNUM, fp + 4);
278 flush_cached_frames ();
279 set_current_frame (create_new_frame (read_register (FP_REGNUM),
283 /* Print the registers in a form similar to the E7000 */
285 show_regs (args, from_tty)
289 printf_filtered("PC=%08x SR=%08x PR=%08x MACH=%08x MACHL=%08x\n",
290 read_register(PC_REGNUM),
291 read_register(SR_REGNUM),
292 read_register(PR_REGNUM),
293 read_register(MACH_REGNUM),
294 read_register(MACL_REGNUM));
296 printf_filtered("R0-R7 %08x %08x %08x %08x %08x %08x %08x %08x\n",
305 printf_filtered("R8-R15 %08x %08x %08x %08x %08x %08x %08x %08x\n",
318 _initialize_sh_tdep ()
320 extern int sim_memory_size;
321 /* FIXME, there should be a way to make a CORE_ADDR variable settable. */
323 (add_set_cmd ("memory_size", class_support, var_uinteger,
324 (char *) &sim_memory_size,
325 "Set simulated memory size of simulator target.", &setlist),
328 add_com("regs", class_vars, show_regs, "Print all registers");