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)
52 /* Skip any prologue before the guts of a function */
55 sh_skip_prologue (start_pc
)
61 w
= read_memory_integer (start_pc
, 2);
67 w
= read_memory_integer (start_pc
, 2);
73 /* Disassemble an instruction */
76 print_insn (memaddr
, stream
)
80 disassemble_info info
;
81 GDB_INIT_DISASSEMBLE_INFO (info
, stream
);
82 return print_insn_sh (memaddr
, &info
);
85 /* Given a GDB frame, determine the address of the calling function's frame.
86 This will be used to create a new GDB frame struct, and then
87 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
89 For us, the frame address is its stack pointer value, so we look up
90 the function prologue to determine the caller's sp value, and return it. */
93 sh_frame_chain (thisframe
)
96 if (!inside_entry_file (thisframe
->pc
))
97 return (read_memory_integer (FRAME_FP (thisframe
), 4));
102 /* Put here the code to store, into a struct frame_saved_regs,
103 the addresses of the saved registers of frame described by FRAME_INFO.
104 This includes special registers such as pc and fp saved in special
105 ways in the stack frame. sp is even more special:
106 the address we return for it IS the sp for the next frame. */
110 frame_find_saved_regs (fi
, fsr
)
111 struct frame_info
*fi
;
112 struct frame_saved_regs
*fsr
;
122 opc
= pc
= get_pc_function_start (fi
->pc
);
124 insn
= read_memory_integer (pc
, 2);
126 for (rn
= 0; rn
< NUM_REGS
; rn
++)
131 /* Loop around examining the prologue insns, but give up
132 after 15 of them, since we're getting silly then */
133 while (pc
< opc
+ 15 * 2)
135 /* See where the registers will be saved to */
139 rn
= GET_PUSHED_REG (insn
);
141 insn
= read_memory_integer (pc
, 2);
144 else if (IS_STS (insn
))
147 where
[PR_REGNUM
] = depth
;
148 insn
= read_memory_integer (pc
, 2);
151 else if (IS_ADD_SP (insn
))
154 depth
+= -((char) (insn
& 0xff));
155 insn
= read_memory_integer (pc
, 2);
161 /* Now we know how deep things are, we can work out their addresses */
163 for (rn
= 0; rn
< NUM_REGS
; rn
++)
170 fsr
->regs
[rn
] = fi
->frame
- where
[rn
] + depth
- 4;
180 fsr
->regs
[SP_REGNUM
] = read_memory_integer (fsr
->regs
[FP_REGNUM
], 4);
184 fsr
->regs
[SP_REGNUM
] = fi
->frame
- 4;
188 /* Work out the return pc - either from the saved pr or the pr
191 if (fsr
->regs
[PR_REGNUM
])
193 fi
->return_pc
= read_memory_integer (fsr
->regs
[PR_REGNUM
], 4) + 4;
197 fi
->return_pc
= read_register (PR_REGNUM
) + 4;
201 /* initialize the extra info saved in a FRAME */
204 init_extra_frame_info (fromleaf
, fi
)
206 struct frame_info
*fi
;
208 struct frame_saved_regs dummy
;
209 frame_find_saved_regs (fi
, &dummy
);
213 /* Discard from the stack the innermost frame,
214 restoring all saved registers. */
219 register FRAME frame
= get_current_frame ();
220 register CORE_ADDR fp
;
222 struct frame_saved_regs fsr
;
223 struct frame_info
*fi
;
225 fi
= get_frame_info (frame
);
227 get_frame_saved_regs (fi
, &fsr
);
229 /* Copy regs from where they were saved in the frame */
230 for (regnum
= 0; regnum
< NUM_REGS
; regnum
++)
232 if (fsr
.regs
[regnum
])
234 write_register (regnum
, read_memory_integer (fsr
.regs
[regnum
], 4));
238 write_register (PC_REGNUM
, fi
->return_pc
);
239 write_register (SP_REGNUM
, fp
+ 4);
240 flush_cached_frames ();
241 set_current_frame (create_new_frame (read_register (FP_REGNUM
),
245 /* Print the registers in a form similar to the E7000 */
247 show_regs (args
, from_tty
)
251 printf_filtered("PC=%08x SR=%08x PR=%08x MACH=%08x MACHL=%08x\n",
252 read_register(PC_REGNUM
),
253 read_register(SR_REGNUM
),
254 read_register(PR_REGNUM
),
255 read_register(MACH_REGNUM
),
256 read_register(MACL_REGNUM
));
258 printf_filtered("R0-R7 %08x %08x %08x %08x %08x %08x %08x %08x\n",
267 printf_filtered("R8-R15 %08x %08x %08x %08x %08x %08x %08x %08x\n",
280 _initialize_sh_tdep ()
282 extern int sim_memory_size
;
283 /* FIXME, there should be a way to make a CORE_ADDR variable settable. */
285 (add_set_cmd ("memory_size", class_support
, var_uinteger
,
286 (char *) &sim_memory_size
,
287 "Set simulated memory size of simulator target.", &setlist
),
290 add_com("regs", class_vars
, show_regs
, "Print all registers");
This page took 0.035721 seconds and 4 git commands to generate.