xref: /openbsd-src/gnu/usr.bin/binutils/gdb/mn10300-tdep.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
1b725ae77Skettenis /* Target-dependent code for the Matsushita MN10300 for GDB, the GNU debugger.
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
4b725ae77Skettenis    Software Foundation, Inc.
5b725ae77Skettenis 
6b725ae77Skettenis    This file is part of GDB.
7b725ae77Skettenis 
8b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
9b725ae77Skettenis    it under the terms of the GNU General Public License as published by
10b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
11b725ae77Skettenis    (at your option) any later version.
12b725ae77Skettenis 
13b725ae77Skettenis    This program is distributed in the hope that it will be useful,
14b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
15b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16b725ae77Skettenis    GNU General Public License for more details.
17b725ae77Skettenis 
18b725ae77Skettenis    You should have received a copy of the GNU General Public License
19b725ae77Skettenis    along with this program; if not, write to the Free Software
20b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
22b725ae77Skettenis 
23b725ae77Skettenis #include "defs.h"
24b725ae77Skettenis #include "frame.h"
25b725ae77Skettenis #include "inferior.h"
26b725ae77Skettenis #include "target.h"
27b725ae77Skettenis #include "value.h"
28b725ae77Skettenis #include "bfd.h"
29b725ae77Skettenis #include "gdb_string.h"
30b725ae77Skettenis #include "gdbcore.h"
31b725ae77Skettenis #include "objfiles.h"
32b725ae77Skettenis #include "regcache.h"
33b725ae77Skettenis #include "arch-utils.h"
34b725ae77Skettenis #include "gdb_assert.h"
35b725ae77Skettenis #include "dis-asm.h"
36b725ae77Skettenis 
37b725ae77Skettenis #define D0_REGNUM 0
38b725ae77Skettenis #define D2_REGNUM 2
39b725ae77Skettenis #define D3_REGNUM 3
40b725ae77Skettenis #define A0_REGNUM 4
41b725ae77Skettenis #define A2_REGNUM 6
42b725ae77Skettenis #define A3_REGNUM 7
43b725ae77Skettenis #define MDR_REGNUM 10
44b725ae77Skettenis #define PSW_REGNUM 11
45b725ae77Skettenis #define LIR_REGNUM 12
46b725ae77Skettenis #define LAR_REGNUM 13
47b725ae77Skettenis #define MDRQ_REGNUM 14
48b725ae77Skettenis #define E0_REGNUM 15
49b725ae77Skettenis #define MCRH_REGNUM 26
50b725ae77Skettenis #define MCRL_REGNUM 27
51b725ae77Skettenis #define MCVF_REGNUM 28
52b725ae77Skettenis 
53b725ae77Skettenis enum movm_register_bits {
54b725ae77Skettenis   movm_exother_bit = 0x01,
55b725ae77Skettenis   movm_exreg1_bit  = 0x02,
56b725ae77Skettenis   movm_exreg0_bit  = 0x04,
57b725ae77Skettenis   movm_other_bit   = 0x08,
58b725ae77Skettenis   movm_a3_bit      = 0x10,
59b725ae77Skettenis   movm_a2_bit      = 0x20,
60b725ae77Skettenis   movm_d3_bit      = 0x40,
61b725ae77Skettenis   movm_d2_bit      = 0x80
62b725ae77Skettenis };
63b725ae77Skettenis 
64b725ae77Skettenis extern void _initialize_mn10300_tdep (void);
65b725ae77Skettenis static CORE_ADDR mn10300_analyze_prologue (struct frame_info *fi,
66b725ae77Skettenis 					   CORE_ADDR pc);
67b725ae77Skettenis 
68b725ae77Skettenis /* mn10300 private data */
69b725ae77Skettenis struct gdbarch_tdep
70b725ae77Skettenis {
71b725ae77Skettenis   int am33_mode;
72b725ae77Skettenis #define AM33_MODE (gdbarch_tdep (current_gdbarch)->am33_mode)
73b725ae77Skettenis };
74b725ae77Skettenis 
75b725ae77Skettenis /* Additional info used by the frame */
76b725ae77Skettenis 
77b725ae77Skettenis struct frame_extra_info
78b725ae77Skettenis   {
79b725ae77Skettenis     int status;
80b725ae77Skettenis     int stack_size;
81b725ae77Skettenis   };
82b725ae77Skettenis 
83b725ae77Skettenis 
84b725ae77Skettenis static char *
register_name(int reg,char ** regs,long sizeof_regs)85b725ae77Skettenis register_name (int reg, char **regs, long sizeof_regs)
86b725ae77Skettenis {
87b725ae77Skettenis   if (reg < 0 || reg >= sizeof_regs / sizeof (regs[0]))
88b725ae77Skettenis     return NULL;
89b725ae77Skettenis   else
90b725ae77Skettenis     return regs[reg];
91b725ae77Skettenis }
92b725ae77Skettenis 
93b725ae77Skettenis static const char *
mn10300_generic_register_name(int reg)94b725ae77Skettenis mn10300_generic_register_name (int reg)
95b725ae77Skettenis {
96b725ae77Skettenis   static char *regs[] =
97b725ae77Skettenis   { "d0", "d1", "d2", "d3", "a0", "a1", "a2", "a3",
98b725ae77Skettenis     "sp", "pc", "mdr", "psw", "lir", "lar", "", "",
99b725ae77Skettenis     "", "", "", "", "", "", "", "",
100b725ae77Skettenis     "", "", "", "", "", "", "", "fp"
101b725ae77Skettenis   };
102b725ae77Skettenis   return register_name (reg, regs, sizeof regs);
103b725ae77Skettenis }
104b725ae77Skettenis 
105b725ae77Skettenis 
106b725ae77Skettenis static const char *
am33_register_name(int reg)107b725ae77Skettenis am33_register_name (int reg)
108b725ae77Skettenis {
109b725ae77Skettenis   static char *regs[] =
110b725ae77Skettenis   { "d0", "d1", "d2", "d3", "a0", "a1", "a2", "a3",
111b725ae77Skettenis     "sp", "pc", "mdr", "psw", "lir", "lar", "",
112b725ae77Skettenis     "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
113b725ae77Skettenis     "ssp", "msp", "usp", "mcrh", "mcrl", "mcvf", "", "", ""
114b725ae77Skettenis   };
115b725ae77Skettenis   return register_name (reg, regs, sizeof regs);
116b725ae77Skettenis }
117b725ae77Skettenis 
118b725ae77Skettenis static CORE_ADDR
mn10300_saved_pc_after_call(struct frame_info * fi)119b725ae77Skettenis mn10300_saved_pc_after_call (struct frame_info *fi)
120b725ae77Skettenis {
121b725ae77Skettenis   return read_memory_integer (read_register (SP_REGNUM), 4);
122b725ae77Skettenis }
123b725ae77Skettenis 
124b725ae77Skettenis static void
mn10300_extract_return_value(struct gdbarch * gdbarch,struct type * type,struct regcache * regcache,void * valbuf)125*11efff7fSkettenis mn10300_extract_return_value (struct gdbarch *gdbarch, struct type *type,
126*11efff7fSkettenis 			      struct regcache *regcache, void *valbuf)
127b725ae77Skettenis {
128*11efff7fSkettenis   char buf[MAX_REGISTER_SIZE];
129*11efff7fSkettenis   int len = TYPE_LENGTH (type);
130*11efff7fSkettenis   int reg, regsz;
131*11efff7fSkettenis 
132b725ae77Skettenis   if (TYPE_CODE (type) == TYPE_CODE_PTR)
133*11efff7fSkettenis     reg = 4;
134b725ae77Skettenis   else
135*11efff7fSkettenis     reg = 0;
136*11efff7fSkettenis 
137*11efff7fSkettenis   regsz = register_size (gdbarch, reg);
138*11efff7fSkettenis   if (len <= regsz)
139*11efff7fSkettenis     {
140*11efff7fSkettenis       regcache_raw_read (regcache, reg, buf);
141*11efff7fSkettenis       memcpy (valbuf, buf, len);
142*11efff7fSkettenis     }
143*11efff7fSkettenis   else if (len <= 2 * regsz)
144*11efff7fSkettenis     {
145*11efff7fSkettenis       regcache_raw_read (regcache, reg, buf);
146*11efff7fSkettenis       memcpy (valbuf, buf, regsz);
147*11efff7fSkettenis       gdb_assert (regsz == register_size (gdbarch, reg + 1));
148*11efff7fSkettenis       regcache_raw_read (regcache, reg + 1, buf);
149*11efff7fSkettenis       memcpy ((char *) valbuf + regsz, buf, len - regsz);
150*11efff7fSkettenis     }
151*11efff7fSkettenis   else
152*11efff7fSkettenis     internal_error (__FILE__, __LINE__,
153*11efff7fSkettenis 		    "Cannot extract return value %d bytes long.", len);
154b725ae77Skettenis }
155b725ae77Skettenis 
156b725ae77Skettenis static void
mn10300_store_return_value(struct gdbarch * gdbarch,struct type * type,struct regcache * regcache,const void * valbuf)157*11efff7fSkettenis mn10300_store_return_value (struct gdbarch *gdbarch, struct type *type,
158*11efff7fSkettenis 			    struct regcache *regcache, const void *valbuf)
159b725ae77Skettenis {
160*11efff7fSkettenis   int len = TYPE_LENGTH (type);
161*11efff7fSkettenis   int reg, regsz;
162*11efff7fSkettenis 
163b725ae77Skettenis   if (TYPE_CODE (type) == TYPE_CODE_PTR)
164*11efff7fSkettenis     reg = 4;
165b725ae77Skettenis   else
166*11efff7fSkettenis     reg = 0;
167*11efff7fSkettenis 
168*11efff7fSkettenis   regsz = register_size (gdbarch, reg);
169*11efff7fSkettenis 
170*11efff7fSkettenis   if (len <= regsz)
171*11efff7fSkettenis     regcache_raw_write_part (regcache, reg, 0, len, valbuf);
172*11efff7fSkettenis   else if (len <= 2 * regsz)
173*11efff7fSkettenis     {
174*11efff7fSkettenis       regcache_raw_write (regcache, reg, valbuf);
175*11efff7fSkettenis       gdb_assert (regsz == register_size (gdbarch, reg + 1));
176*11efff7fSkettenis       regcache_raw_write_part (regcache, reg+1, 0,
177*11efff7fSkettenis 			       len - regsz, (char *) valbuf + regsz);
178*11efff7fSkettenis     }
179*11efff7fSkettenis   else
180*11efff7fSkettenis     internal_error (__FILE__, __LINE__,
181*11efff7fSkettenis 		    "Cannot store return value %d bytes long.", len);
182b725ae77Skettenis }
183b725ae77Skettenis 
184b725ae77Skettenis static struct frame_info *analyze_dummy_frame (CORE_ADDR, CORE_ADDR);
185b725ae77Skettenis static struct frame_info *
analyze_dummy_frame(CORE_ADDR pc,CORE_ADDR frame)186b725ae77Skettenis analyze_dummy_frame (CORE_ADDR pc, CORE_ADDR frame)
187b725ae77Skettenis {
188b725ae77Skettenis   struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
189b725ae77Skettenis   struct frame_info *dummy
190b725ae77Skettenis     = deprecated_frame_xmalloc_with_cleanup (SIZEOF_FRAME_SAVED_REGS,
191b725ae77Skettenis 					     sizeof (struct frame_extra_info));
192b725ae77Skettenis   deprecated_update_frame_pc_hack (dummy, pc);
193b725ae77Skettenis   deprecated_update_frame_base_hack (dummy, frame);
194b725ae77Skettenis   get_frame_extra_info (dummy)->status = 0;
195b725ae77Skettenis   get_frame_extra_info (dummy)->stack_size = 0;
196b725ae77Skettenis   mn10300_analyze_prologue (dummy, pc);
197b725ae77Skettenis   do_cleanups (old_chain);
198b725ae77Skettenis   return dummy;
199b725ae77Skettenis }
200b725ae77Skettenis 
201b725ae77Skettenis /* Values for frame_info.status */
202b725ae77Skettenis 
203b725ae77Skettenis #define MY_FRAME_IN_SP 0x1
204b725ae77Skettenis #define MY_FRAME_IN_FP 0x2
205b725ae77Skettenis #define NO_MORE_FRAMES 0x4
206b725ae77Skettenis 
207*11efff7fSkettenis /* Compute the alignment required by a type.  */
208*11efff7fSkettenis 
209*11efff7fSkettenis static int
mn10300_type_align(struct type * type)210*11efff7fSkettenis mn10300_type_align (struct type *type)
211*11efff7fSkettenis {
212*11efff7fSkettenis   int i, align = 1;
213*11efff7fSkettenis 
214*11efff7fSkettenis   switch (TYPE_CODE (type))
215*11efff7fSkettenis     {
216*11efff7fSkettenis     case TYPE_CODE_INT:
217*11efff7fSkettenis     case TYPE_CODE_ENUM:
218*11efff7fSkettenis     case TYPE_CODE_SET:
219*11efff7fSkettenis     case TYPE_CODE_RANGE:
220*11efff7fSkettenis     case TYPE_CODE_CHAR:
221*11efff7fSkettenis     case TYPE_CODE_BOOL:
222*11efff7fSkettenis     case TYPE_CODE_FLT:
223*11efff7fSkettenis     case TYPE_CODE_PTR:
224*11efff7fSkettenis     case TYPE_CODE_REF:
225*11efff7fSkettenis       return TYPE_LENGTH (type);
226*11efff7fSkettenis 
227*11efff7fSkettenis     case TYPE_CODE_COMPLEX:
228*11efff7fSkettenis       return TYPE_LENGTH (type) / 2;
229*11efff7fSkettenis 
230*11efff7fSkettenis     case TYPE_CODE_STRUCT:
231*11efff7fSkettenis     case TYPE_CODE_UNION:
232*11efff7fSkettenis       for (i = 0; i < TYPE_NFIELDS (type); i++)
233*11efff7fSkettenis 	{
234*11efff7fSkettenis 	  int falign = mn10300_type_align (TYPE_FIELD_TYPE (type, i));
235*11efff7fSkettenis 	  while (align < falign)
236*11efff7fSkettenis 	    align <<= 1;
237*11efff7fSkettenis 	}
238*11efff7fSkettenis       return align;
239*11efff7fSkettenis 
240*11efff7fSkettenis     case TYPE_CODE_ARRAY:
241*11efff7fSkettenis       /* HACK!  Structures containing arrays, even small ones, are not
242*11efff7fSkettenis 	 elligible for returning in registers.  */
243*11efff7fSkettenis       return 256;
244*11efff7fSkettenis 
245*11efff7fSkettenis     case TYPE_CODE_TYPEDEF:
246*11efff7fSkettenis       return mn10300_type_align (check_typedef (type));
247*11efff7fSkettenis 
248*11efff7fSkettenis     default:
249*11efff7fSkettenis       internal_error (__FILE__, __LINE__, "bad switch");
250*11efff7fSkettenis     }
251*11efff7fSkettenis }
252b725ae77Skettenis 
253b725ae77Skettenis /* Should call_function allocate stack space for a struct return?  */
254b725ae77Skettenis static int
mn10300_use_struct_convention(struct type * type)255*11efff7fSkettenis mn10300_use_struct_convention (struct type *type)
256b725ae77Skettenis {
257*11efff7fSkettenis   /* Structures bigger than a pair of words can't be returned in
258*11efff7fSkettenis      registers.  */
259*11efff7fSkettenis   if (TYPE_LENGTH (type) > 8)
260*11efff7fSkettenis     return 1;
261*11efff7fSkettenis 
262*11efff7fSkettenis   switch (TYPE_CODE (type))
263*11efff7fSkettenis     {
264*11efff7fSkettenis     case TYPE_CODE_STRUCT:
265*11efff7fSkettenis     case TYPE_CODE_UNION:
266*11efff7fSkettenis       /* Structures with a single field are handled as the field
267*11efff7fSkettenis 	 itself.  */
268*11efff7fSkettenis       if (TYPE_NFIELDS (type) == 1)
269*11efff7fSkettenis 	return mn10300_use_struct_convention (TYPE_FIELD_TYPE (type, 0));
270*11efff7fSkettenis 
271*11efff7fSkettenis       /* Structures with word or double-word size are passed in memory, as
272*11efff7fSkettenis 	 long as they require at least word alignment.  */
273*11efff7fSkettenis       if (mn10300_type_align (type) >= 4)
274*11efff7fSkettenis 	return 0;
275*11efff7fSkettenis 
276*11efff7fSkettenis       return 1;
277*11efff7fSkettenis 
278*11efff7fSkettenis       /* Arrays are addressable, so they're never returned in
279*11efff7fSkettenis 	 registers.  This condition can only hold when the array is
280*11efff7fSkettenis 	 the only field of a struct or union.  */
281*11efff7fSkettenis     case TYPE_CODE_ARRAY:
282*11efff7fSkettenis       return 1;
283*11efff7fSkettenis 
284*11efff7fSkettenis     case TYPE_CODE_TYPEDEF:
285*11efff7fSkettenis       return mn10300_use_struct_convention (check_typedef (type));
286*11efff7fSkettenis 
287*11efff7fSkettenis     default:
288*11efff7fSkettenis       return 0;
289*11efff7fSkettenis     }
290*11efff7fSkettenis }
291*11efff7fSkettenis 
292*11efff7fSkettenis /* Determine, for architecture GDBARCH, how a return value of TYPE
293*11efff7fSkettenis    should be returned.  If it is supposed to be returned in registers,
294*11efff7fSkettenis    and READBUF is non-zero, read the appropriate value from REGCACHE,
295*11efff7fSkettenis    and copy it into READBUF.  If WRITEBUF is non-zero, write the value
296*11efff7fSkettenis    from WRITEBUF into REGCACHE.  */
297*11efff7fSkettenis 
298*11efff7fSkettenis static enum return_value_convention
mn10300_return_value(struct gdbarch * gdbarch,struct type * type,struct regcache * regcache,void * readbuf,const void * writebuf)299*11efff7fSkettenis mn10300_return_value (struct gdbarch *gdbarch, struct type *type,
300*11efff7fSkettenis 		      struct regcache *regcache, void *readbuf,
301*11efff7fSkettenis 		      const void *writebuf)
302*11efff7fSkettenis {
303*11efff7fSkettenis   if (mn10300_use_struct_convention (type))
304*11efff7fSkettenis     return RETURN_VALUE_STRUCT_CONVENTION;
305*11efff7fSkettenis 
306*11efff7fSkettenis   if (readbuf)
307*11efff7fSkettenis     mn10300_extract_return_value (gdbarch, type, regcache, readbuf);
308*11efff7fSkettenis   if (writebuf)
309*11efff7fSkettenis     mn10300_store_return_value (gdbarch, type, regcache, writebuf);
310*11efff7fSkettenis 
311*11efff7fSkettenis   return RETURN_VALUE_REGISTER_CONVENTION;
312b725ae77Skettenis }
313b725ae77Skettenis 
314b725ae77Skettenis /* The breakpoint instruction must be the same size as the smallest
315b725ae77Skettenis    instruction in the instruction set.
316b725ae77Skettenis 
317b725ae77Skettenis    The Matsushita mn10x00 processors have single byte instructions
318b725ae77Skettenis    so we need a single byte breakpoint.  Matsushita hasn't defined
319b725ae77Skettenis    one, so we defined it ourselves.  */
320b725ae77Skettenis 
321b725ae77Skettenis const static unsigned char *
mn10300_breakpoint_from_pc(CORE_ADDR * bp_addr,int * bp_size)322b725ae77Skettenis mn10300_breakpoint_from_pc (CORE_ADDR *bp_addr, int *bp_size)
323b725ae77Skettenis {
324b725ae77Skettenis   static char breakpoint[] =
325b725ae77Skettenis   {0xff};
326b725ae77Skettenis   *bp_size = 1;
327b725ae77Skettenis   return breakpoint;
328b725ae77Skettenis }
329b725ae77Skettenis 
330b725ae77Skettenis 
331b725ae77Skettenis /* Fix fi->frame if it's bogus at this point.  This is a helper
332b725ae77Skettenis    function for mn10300_analyze_prologue. */
333b725ae77Skettenis 
334b725ae77Skettenis static void
fix_frame_pointer(struct frame_info * fi,int stack_size)335b725ae77Skettenis fix_frame_pointer (struct frame_info *fi, int stack_size)
336b725ae77Skettenis {
337b725ae77Skettenis   if (fi && get_next_frame (fi) == NULL)
338b725ae77Skettenis     {
339b725ae77Skettenis       if (get_frame_extra_info (fi)->status & MY_FRAME_IN_SP)
340b725ae77Skettenis 	deprecated_update_frame_base_hack (fi, read_sp () - stack_size);
341b725ae77Skettenis       else if (get_frame_extra_info (fi)->status & MY_FRAME_IN_FP)
342b725ae77Skettenis 	deprecated_update_frame_base_hack (fi, read_register (A3_REGNUM));
343b725ae77Skettenis     }
344b725ae77Skettenis }
345b725ae77Skettenis 
346b725ae77Skettenis 
347b725ae77Skettenis /* Set offsets of registers saved by movm instruction.
348b725ae77Skettenis    This is a helper function for mn10300_analyze_prologue.  */
349b725ae77Skettenis 
350b725ae77Skettenis static void
set_movm_offsets(struct frame_info * fi,int movm_args)351b725ae77Skettenis set_movm_offsets (struct frame_info *fi, int movm_args)
352b725ae77Skettenis {
353b725ae77Skettenis   int offset = 0;
354b725ae77Skettenis 
355b725ae77Skettenis   if (fi == NULL || movm_args == 0)
356b725ae77Skettenis     return;
357b725ae77Skettenis 
358b725ae77Skettenis   if (movm_args & movm_other_bit)
359b725ae77Skettenis     {
360b725ae77Skettenis       /* The `other' bit leaves a blank area of four bytes at the
361b725ae77Skettenis          beginning of its block of saved registers, making it 32 bytes
362b725ae77Skettenis          long in total.  */
363b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[LAR_REGNUM]    = get_frame_base (fi) + offset + 4;
364b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[LIR_REGNUM]    = get_frame_base (fi) + offset + 8;
365b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[MDR_REGNUM]    = get_frame_base (fi) + offset + 12;
366b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[A0_REGNUM + 1] = get_frame_base (fi) + offset + 16;
367b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[A0_REGNUM]     = get_frame_base (fi) + offset + 20;
368b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[D0_REGNUM + 1] = get_frame_base (fi) + offset + 24;
369b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[D0_REGNUM]     = get_frame_base (fi) + offset + 28;
370b725ae77Skettenis       offset += 32;
371b725ae77Skettenis     }
372b725ae77Skettenis   if (movm_args & movm_a3_bit)
373b725ae77Skettenis     {
374b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[A3_REGNUM] = get_frame_base (fi) + offset;
375b725ae77Skettenis       offset += 4;
376b725ae77Skettenis     }
377b725ae77Skettenis   if (movm_args & movm_a2_bit)
378b725ae77Skettenis     {
379b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[A2_REGNUM] = get_frame_base (fi) + offset;
380b725ae77Skettenis       offset += 4;
381b725ae77Skettenis     }
382b725ae77Skettenis   if (movm_args & movm_d3_bit)
383b725ae77Skettenis     {
384b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[D3_REGNUM] = get_frame_base (fi) + offset;
385b725ae77Skettenis       offset += 4;
386b725ae77Skettenis     }
387b725ae77Skettenis   if (movm_args & movm_d2_bit)
388b725ae77Skettenis     {
389b725ae77Skettenis       deprecated_get_frame_saved_regs (fi)[D2_REGNUM] = get_frame_base (fi) + offset;
390b725ae77Skettenis       offset += 4;
391b725ae77Skettenis     }
392b725ae77Skettenis   if (AM33_MODE)
393b725ae77Skettenis     {
394b725ae77Skettenis       if (movm_args & movm_exother_bit)
395b725ae77Skettenis         {
396b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[MCVF_REGNUM]   = get_frame_base (fi) + offset;
397b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[MCRL_REGNUM]   = get_frame_base (fi) + offset + 4;
398b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[MCRH_REGNUM]   = get_frame_base (fi) + offset + 8;
399b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[MDRQ_REGNUM]   = get_frame_base (fi) + offset + 12;
400b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 1] = get_frame_base (fi) + offset + 16;
401b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 0] = get_frame_base (fi) + offset + 20;
402b725ae77Skettenis           offset += 24;
403b725ae77Skettenis         }
404b725ae77Skettenis       if (movm_args & movm_exreg1_bit)
405b725ae77Skettenis         {
406b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 7] = get_frame_base (fi) + offset;
407b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 6] = get_frame_base (fi) + offset + 4;
408b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 5] = get_frame_base (fi) + offset + 8;
409b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 4] = get_frame_base (fi) + offset + 12;
410b725ae77Skettenis           offset += 16;
411b725ae77Skettenis         }
412b725ae77Skettenis       if (movm_args & movm_exreg0_bit)
413b725ae77Skettenis         {
414b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 3] = get_frame_base (fi) + offset;
415b725ae77Skettenis           deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 2] = get_frame_base (fi) + offset + 4;
416b725ae77Skettenis           offset += 8;
417b725ae77Skettenis         }
418b725ae77Skettenis     }
419b725ae77Skettenis }
420b725ae77Skettenis 
421b725ae77Skettenis 
422b725ae77Skettenis /* The main purpose of this file is dealing with prologues to extract
423b725ae77Skettenis    information about stack frames and saved registers.
424b725ae77Skettenis 
425b725ae77Skettenis    In gcc/config/mn13000/mn10300.c, the expand_prologue prologue
426b725ae77Skettenis    function is pretty readable, and has a nice explanation of how the
427b725ae77Skettenis    prologue is generated.  The prologues generated by that code will
428b725ae77Skettenis    have the following form (NOTE: the current code doesn't handle all
429b725ae77Skettenis    this!):
430b725ae77Skettenis 
431b725ae77Skettenis    + If this is an old-style varargs function, then its arguments
432b725ae77Skettenis      need to be flushed back to the stack:
433b725ae77Skettenis 
434b725ae77Skettenis         mov d0,(4,sp)
435b725ae77Skettenis         mov d1,(4,sp)
436b725ae77Skettenis 
437b725ae77Skettenis    + If we use any of the callee-saved registers, save them now.
438b725ae77Skettenis 
439b725ae77Skettenis         movm [some callee-saved registers],(sp)
440b725ae77Skettenis 
441b725ae77Skettenis    + If we have any floating-point registers to save:
442b725ae77Skettenis 
443b725ae77Skettenis      - Decrement the stack pointer to reserve space for the registers.
444b725ae77Skettenis        If the function doesn't need a frame pointer, we may combine
445b725ae77Skettenis        this with the adjustment that reserves space for the frame.
446b725ae77Skettenis 
447b725ae77Skettenis         add -SIZE, sp
448b725ae77Skettenis 
449b725ae77Skettenis      - Save the floating-point registers.  We have two possible
450b725ae77Skettenis        strategies:
451b725ae77Skettenis 
452b725ae77Skettenis        . Save them at fixed offset from the SP:
453b725ae77Skettenis 
454b725ae77Skettenis         fmov fsN,(OFFSETN,sp)
455b725ae77Skettenis         fmov fsM,(OFFSETM,sp)
456b725ae77Skettenis         ...
457b725ae77Skettenis 
458b725ae77Skettenis        Note that, if OFFSETN happens to be zero, you'll get the
459b725ae77Skettenis        different opcode: fmov fsN,(sp)
460b725ae77Skettenis 
461b725ae77Skettenis        . Or, set a0 to the start of the save area, and then use
462b725ae77Skettenis        post-increment addressing to save the FP registers.
463b725ae77Skettenis 
464b725ae77Skettenis         mov sp, a0
465b725ae77Skettenis         add SIZE, a0
466b725ae77Skettenis         fmov fsN,(a0+)
467b725ae77Skettenis         fmov fsM,(a0+)
468b725ae77Skettenis         ...
469b725ae77Skettenis 
470b725ae77Skettenis    + If the function needs a frame pointer, we set it here.
471b725ae77Skettenis 
472b725ae77Skettenis         mov sp, a3
473b725ae77Skettenis 
474b725ae77Skettenis    + Now we reserve space for the stack frame proper.  This could be
475b725ae77Skettenis      merged into the `add -SIZE, sp' instruction for FP saves up
476b725ae77Skettenis      above, unless we needed to set the frame pointer in the previous
477b725ae77Skettenis      step, or the frame is so large that allocating the whole thing at
478b725ae77Skettenis      once would put the FP register save slots out of reach of the
479b725ae77Skettenis      addressing mode (128 bytes).
480b725ae77Skettenis 
481b725ae77Skettenis         add -SIZE, sp
482b725ae77Skettenis 
483b725ae77Skettenis    One day we might keep the stack pointer constant, that won't
484b725ae77Skettenis    change the code for prologues, but it will make the frame
485b725ae77Skettenis    pointerless case much more common.  */
486b725ae77Skettenis 
487b725ae77Skettenis /* Analyze the prologue to determine where registers are saved,
488b725ae77Skettenis    the end of the prologue, etc etc.  Return the end of the prologue
489b725ae77Skettenis    scanned.
490b725ae77Skettenis 
491b725ae77Skettenis    We store into FI (if non-null) several tidbits of information:
492b725ae77Skettenis 
493b725ae77Skettenis    * stack_size -- size of this stack frame.  Note that if we stop in
494b725ae77Skettenis    certain parts of the prologue/epilogue we may claim the size of the
495b725ae77Skettenis    current frame is zero.  This happens when the current frame has
496b725ae77Skettenis    not been allocated yet or has already been deallocated.
497b725ae77Skettenis 
498b725ae77Skettenis    * fsr -- Addresses of registers saved in the stack by this frame.
499b725ae77Skettenis 
500b725ae77Skettenis    * status -- A (relatively) generic status indicator.  It's a bitmask
501b725ae77Skettenis    with the following bits:
502b725ae77Skettenis 
503b725ae77Skettenis    MY_FRAME_IN_SP: The base of the current frame is actually in
504b725ae77Skettenis    the stack pointer.  This can happen for frame pointerless
505b725ae77Skettenis    functions, or cases where we're stopped in the prologue/epilogue
506b725ae77Skettenis    itself.  For these cases mn10300_analyze_prologue will need up
507b725ae77Skettenis    update fi->frame before returning or analyzing the register
508b725ae77Skettenis    save instructions.
509b725ae77Skettenis 
510b725ae77Skettenis    MY_FRAME_IN_FP: The base of the current frame is in the
511b725ae77Skettenis    frame pointer register ($a3).
512b725ae77Skettenis 
513b725ae77Skettenis    NO_MORE_FRAMES: Set this if the current frame is "start" or
514b725ae77Skettenis    if the first instruction looks like mov <imm>,sp.  This tells
515b725ae77Skettenis    frame chain to not bother trying to unwind past this frame.  */
516b725ae77Skettenis 
517b725ae77Skettenis static CORE_ADDR
mn10300_analyze_prologue(struct frame_info * fi,CORE_ADDR pc)518b725ae77Skettenis mn10300_analyze_prologue (struct frame_info *fi, CORE_ADDR pc)
519b725ae77Skettenis {
520b725ae77Skettenis   CORE_ADDR func_addr, func_end, addr, stop;
521b725ae77Skettenis   CORE_ADDR stack_size;
522b725ae77Skettenis   int imm_size;
523b725ae77Skettenis   unsigned char buf[4];
524b725ae77Skettenis   int status, movm_args = 0;
525b725ae77Skettenis   char *name;
526b725ae77Skettenis 
527b725ae77Skettenis   /* Use the PC in the frame if it's provided to look up the
528b725ae77Skettenis      start of this function.
529b725ae77Skettenis 
530b725ae77Skettenis      Note: kevinb/2003-07-16: We used to do the following here:
531b725ae77Skettenis 	pc = (fi ? get_frame_pc (fi) : pc);
532b725ae77Skettenis      But this is (now) badly broken when called from analyze_dummy_frame().
533b725ae77Skettenis   */
534b725ae77Skettenis   pc = (pc ? pc : get_frame_pc (fi));
535b725ae77Skettenis 
536b725ae77Skettenis   /* Find the start of this function.  */
537b725ae77Skettenis   status = find_pc_partial_function (pc, &name, &func_addr, &func_end);
538b725ae77Skettenis 
539b725ae77Skettenis   /* Do nothing if we couldn't find the start of this function or if we're
540b725ae77Skettenis      stopped at the first instruction in the prologue.  */
541b725ae77Skettenis   if (status == 0)
542b725ae77Skettenis     {
543b725ae77Skettenis       return pc;
544b725ae77Skettenis     }
545b725ae77Skettenis 
546b725ae77Skettenis   /* If we're in start, then give up.  */
547b725ae77Skettenis   if (strcmp (name, "start") == 0)
548b725ae77Skettenis     {
549b725ae77Skettenis       if (fi != NULL)
550b725ae77Skettenis 	get_frame_extra_info (fi)->status = NO_MORE_FRAMES;
551b725ae77Skettenis       return pc;
552b725ae77Skettenis     }
553b725ae77Skettenis 
554b725ae77Skettenis   /* At the start of a function our frame is in the stack pointer.  */
555b725ae77Skettenis   if (fi)
556b725ae77Skettenis     get_frame_extra_info (fi)->status = MY_FRAME_IN_SP;
557b725ae77Skettenis 
558b725ae77Skettenis   /* Get the next two bytes into buf, we need two because rets is a two
559b725ae77Skettenis      byte insn and the first isn't enough to uniquely identify it.  */
560*11efff7fSkettenis   status = deprecated_read_memory_nobpt (pc, buf, 2);
561b725ae77Skettenis   if (status != 0)
562b725ae77Skettenis     return pc;
563b725ae77Skettenis 
564b725ae77Skettenis #if 0
565b725ae77Skettenis   /* Note: kevinb/2003-07-16: We shouldn't be making these sorts of
566b725ae77Skettenis      changes to the frame in prologue examination code.  */
567b725ae77Skettenis   /* If we're physically on an "rets" instruction, then our frame has
568b725ae77Skettenis      already been deallocated.  Note this can also be true for retf
569b725ae77Skettenis      and ret if they specify a size of zero.
570b725ae77Skettenis 
571b725ae77Skettenis      In this case fi->frame is bogus, we need to fix it.  */
572b725ae77Skettenis   if (fi && buf[0] == 0xf0 && buf[1] == 0xfc)
573b725ae77Skettenis     {
574b725ae77Skettenis       if (get_next_frame (fi) == NULL)
575b725ae77Skettenis 	deprecated_update_frame_base_hack (fi, read_sp ());
576b725ae77Skettenis       return get_frame_pc (fi);
577b725ae77Skettenis     }
578b725ae77Skettenis 
579b725ae77Skettenis   /* Similarly if we're stopped on the first insn of a prologue as our
580b725ae77Skettenis      frame hasn't been allocated yet.  */
581b725ae77Skettenis   if (fi && get_frame_pc (fi) == func_addr)
582b725ae77Skettenis     {
583b725ae77Skettenis       if (get_next_frame (fi) == NULL)
584b725ae77Skettenis 	deprecated_update_frame_base_hack (fi, read_sp ());
585b725ae77Skettenis       return get_frame_pc (fi);
586b725ae77Skettenis     }
587b725ae77Skettenis #endif
588b725ae77Skettenis 
589b725ae77Skettenis   /* Figure out where to stop scanning.  */
590b725ae77Skettenis   stop = fi ? pc : func_end;
591b725ae77Skettenis 
592b725ae77Skettenis   /* Don't walk off the end of the function.  */
593b725ae77Skettenis   stop = stop > func_end ? func_end : stop;
594b725ae77Skettenis 
595b725ae77Skettenis   /* Start scanning on the first instruction of this function.  */
596b725ae77Skettenis   addr = func_addr;
597b725ae77Skettenis 
598b725ae77Skettenis   /* Suck in two bytes.  */
599*11efff7fSkettenis   if (addr + 2 >= stop
600*11efff7fSkettenis       || (status = deprecated_read_memory_nobpt (addr, buf, 2)) != 0)
601b725ae77Skettenis     {
602b725ae77Skettenis       fix_frame_pointer (fi, 0);
603b725ae77Skettenis       return addr;
604b725ae77Skettenis     }
605b725ae77Skettenis 
606b725ae77Skettenis   /* First see if this insn sets the stack pointer from a register; if
607b725ae77Skettenis      so, it's probably the initialization of the stack pointer in _start,
608b725ae77Skettenis      so mark this as the bottom-most frame.  */
609b725ae77Skettenis   if (buf[0] == 0xf2 && (buf[1] & 0xf3) == 0xf0)
610b725ae77Skettenis     {
611b725ae77Skettenis       if (fi)
612b725ae77Skettenis 	get_frame_extra_info (fi)->status = NO_MORE_FRAMES;
613b725ae77Skettenis       return addr;
614b725ae77Skettenis     }
615b725ae77Skettenis 
616b725ae77Skettenis   /* Now look for movm [regs],sp, which saves the callee saved registers.
617b725ae77Skettenis 
618b725ae77Skettenis      At this time we don't know if fi->frame is valid, so we only note
619b725ae77Skettenis      that we encountered a movm instruction.  Later, we'll set the entries
620b725ae77Skettenis      in fsr.regs as needed.  */
621b725ae77Skettenis   if (buf[0] == 0xcf)
622b725ae77Skettenis     {
623b725ae77Skettenis       /* Extract the register list for the movm instruction.  */
624*11efff7fSkettenis       status = deprecated_read_memory_nobpt (addr + 1, buf, 1);
625b725ae77Skettenis       movm_args = *buf;
626b725ae77Skettenis 
627b725ae77Skettenis       addr += 2;
628b725ae77Skettenis 
629b725ae77Skettenis       /* Quit now if we're beyond the stop point.  */
630b725ae77Skettenis       if (addr >= stop)
631b725ae77Skettenis 	{
632b725ae77Skettenis 	  /* Fix fi->frame since it's bogus at this point.  */
633b725ae77Skettenis 	  if (fi && get_next_frame (fi) == NULL)
634b725ae77Skettenis 	    deprecated_update_frame_base_hack (fi, read_sp ());
635b725ae77Skettenis 
636b725ae77Skettenis 	  /* Note if/where callee saved registers were saved.  */
637b725ae77Skettenis 	  set_movm_offsets (fi, movm_args);
638b725ae77Skettenis 	  return addr;
639b725ae77Skettenis 	}
640b725ae77Skettenis 
641b725ae77Skettenis       /* Get the next two bytes so the prologue scan can continue.  */
642*11efff7fSkettenis       status = deprecated_read_memory_nobpt (addr, buf, 2);
643b725ae77Skettenis       if (status != 0)
644b725ae77Skettenis 	{
645b725ae77Skettenis 	  /* Fix fi->frame since it's bogus at this point.  */
646b725ae77Skettenis 	  if (fi && get_next_frame (fi) == NULL)
647b725ae77Skettenis 	    deprecated_update_frame_base_hack (fi, read_sp ());
648b725ae77Skettenis 
649b725ae77Skettenis 	  /* Note if/where callee saved registers were saved.  */
650b725ae77Skettenis 	  set_movm_offsets (fi, movm_args);
651b725ae77Skettenis 	  return addr;
652b725ae77Skettenis 	}
653b725ae77Skettenis     }
654b725ae77Skettenis 
655b725ae77Skettenis   /* Now see if we set up a frame pointer via "mov sp,a3" */
656b725ae77Skettenis   if (buf[0] == 0x3f)
657b725ae77Skettenis     {
658b725ae77Skettenis       addr += 1;
659b725ae77Skettenis 
660b725ae77Skettenis       /* The frame pointer is now valid.  */
661b725ae77Skettenis       if (fi)
662b725ae77Skettenis 	{
663b725ae77Skettenis 	  get_frame_extra_info (fi)->status |= MY_FRAME_IN_FP;
664b725ae77Skettenis 	  get_frame_extra_info (fi)->status &= ~MY_FRAME_IN_SP;
665b725ae77Skettenis 	}
666b725ae77Skettenis 
667b725ae77Skettenis       /* Quit now if we're beyond the stop point.  */
668b725ae77Skettenis       if (addr >= stop)
669b725ae77Skettenis 	{
670b725ae77Skettenis 	  /* Fix fi->frame if it's bogus at this point.  */
671b725ae77Skettenis 	  fix_frame_pointer (fi, 0);
672b725ae77Skettenis 
673b725ae77Skettenis 	  /* Note if/where callee saved registers were saved.  */
674b725ae77Skettenis 	  set_movm_offsets (fi, movm_args);
675b725ae77Skettenis 	  return addr;
676b725ae77Skettenis 	}
677b725ae77Skettenis 
678b725ae77Skettenis       /* Get two more bytes so scanning can continue.  */
679*11efff7fSkettenis       status = deprecated_read_memory_nobpt (addr, buf, 2);
680b725ae77Skettenis       if (status != 0)
681b725ae77Skettenis 	{
682b725ae77Skettenis 	  /* Fix fi->frame if it's bogus at this point.  */
683b725ae77Skettenis 	  fix_frame_pointer (fi, 0);
684b725ae77Skettenis 
685b725ae77Skettenis 	  /* Note if/where callee saved registers were saved.  */
686b725ae77Skettenis 	  set_movm_offsets (fi, movm_args);
687b725ae77Skettenis 	  return addr;
688b725ae77Skettenis 	}
689b725ae77Skettenis     }
690b725ae77Skettenis 
691b725ae77Skettenis   /* Next we should allocate the local frame.  No more prologue insns
692b725ae77Skettenis      are found after allocating the local frame.
693b725ae77Skettenis 
694b725ae77Skettenis      Search for add imm8,sp (0xf8feXX)
695b725ae77Skettenis      or add imm16,sp (0xfafeXXXX)
696b725ae77Skettenis      or add imm32,sp (0xfcfeXXXXXXXX).
697b725ae77Skettenis 
698b725ae77Skettenis      If none of the above was found, then this prologue has no
699b725ae77Skettenis      additional stack.  */
700b725ae77Skettenis 
701*11efff7fSkettenis   status = deprecated_read_memory_nobpt (addr, buf, 2);
702b725ae77Skettenis   if (status != 0)
703b725ae77Skettenis     {
704b725ae77Skettenis       /* Fix fi->frame if it's bogus at this point.  */
705b725ae77Skettenis       fix_frame_pointer (fi, 0);
706b725ae77Skettenis 
707b725ae77Skettenis       /* Note if/where callee saved registers were saved.  */
708b725ae77Skettenis       set_movm_offsets (fi, movm_args);
709b725ae77Skettenis       return addr;
710b725ae77Skettenis     }
711b725ae77Skettenis 
712b725ae77Skettenis   imm_size = 0;
713b725ae77Skettenis   if (buf[0] == 0xf8 && buf[1] == 0xfe)
714b725ae77Skettenis     imm_size = 1;
715b725ae77Skettenis   else if (buf[0] == 0xfa && buf[1] == 0xfe)
716b725ae77Skettenis     imm_size = 2;
717b725ae77Skettenis   else if (buf[0] == 0xfc && buf[1] == 0xfe)
718b725ae77Skettenis     imm_size = 4;
719b725ae77Skettenis 
720b725ae77Skettenis   if (imm_size != 0)
721b725ae77Skettenis     {
722b725ae77Skettenis       /* Suck in imm_size more bytes, they'll hold the size of the
723b725ae77Skettenis          current frame.  */
724*11efff7fSkettenis       status = deprecated_read_memory_nobpt (addr + 2, buf, imm_size);
725b725ae77Skettenis       if (status != 0)
726b725ae77Skettenis 	{
727b725ae77Skettenis 	  /* Fix fi->frame if it's bogus at this point.  */
728b725ae77Skettenis 	  fix_frame_pointer (fi, 0);
729b725ae77Skettenis 
730b725ae77Skettenis 	  /* Note if/where callee saved registers were saved.  */
731b725ae77Skettenis 	  set_movm_offsets (fi, movm_args);
732b725ae77Skettenis 	  return addr;
733b725ae77Skettenis 	}
734b725ae77Skettenis 
735b725ae77Skettenis       /* Note the size of the stack in the frame info structure.  */
736b725ae77Skettenis       stack_size = extract_signed_integer (buf, imm_size);
737b725ae77Skettenis       if (fi)
738b725ae77Skettenis 	get_frame_extra_info (fi)->stack_size = stack_size;
739b725ae77Skettenis 
740b725ae77Skettenis       /* We just consumed 2 + imm_size bytes.  */
741b725ae77Skettenis       addr += 2 + imm_size;
742b725ae77Skettenis 
743b725ae77Skettenis       /* No more prologue insns follow, so begin preparation to return.  */
744b725ae77Skettenis       /* Fix fi->frame if it's bogus at this point.  */
745b725ae77Skettenis       fix_frame_pointer (fi, stack_size);
746b725ae77Skettenis 
747b725ae77Skettenis       /* Note if/where callee saved registers were saved.  */
748b725ae77Skettenis       set_movm_offsets (fi, movm_args);
749b725ae77Skettenis       return addr;
750b725ae77Skettenis     }
751b725ae77Skettenis 
752b725ae77Skettenis   /* We never found an insn which allocates local stack space, regardless
753b725ae77Skettenis      this is the end of the prologue.  */
754b725ae77Skettenis   /* Fix fi->frame if it's bogus at this point.  */
755b725ae77Skettenis   fix_frame_pointer (fi, 0);
756b725ae77Skettenis 
757b725ae77Skettenis   /* Note if/where callee saved registers were saved.  */
758b725ae77Skettenis   set_movm_offsets (fi, movm_args);
759b725ae77Skettenis   return addr;
760b725ae77Skettenis }
761b725ae77Skettenis 
762b725ae77Skettenis 
763b725ae77Skettenis /* Function: saved_regs_size
764b725ae77Skettenis    Return the size in bytes of the register save area, based on the
765b725ae77Skettenis    saved_regs array in FI.  */
766b725ae77Skettenis static int
saved_regs_size(struct frame_info * fi)767b725ae77Skettenis saved_regs_size (struct frame_info *fi)
768b725ae77Skettenis {
769b725ae77Skettenis   int adjust = 0;
770b725ae77Skettenis   int i;
771b725ae77Skettenis 
772b725ae77Skettenis   /* Reserve four bytes for every register saved.  */
773b725ae77Skettenis   for (i = 0; i < NUM_REGS; i++)
774b725ae77Skettenis     if (deprecated_get_frame_saved_regs (fi)[i])
775b725ae77Skettenis       adjust += 4;
776b725ae77Skettenis 
777b725ae77Skettenis   /* If we saved LIR, then it's most likely we used a `movm'
778b725ae77Skettenis      instruction with the `other' bit set, in which case the SP is
779b725ae77Skettenis      decremented by an extra four bytes, "to simplify calculation
780b725ae77Skettenis      of the transfer area", according to the processor manual.  */
781b725ae77Skettenis   if (deprecated_get_frame_saved_regs (fi)[LIR_REGNUM])
782b725ae77Skettenis     adjust += 4;
783b725ae77Skettenis 
784b725ae77Skettenis   return adjust;
785b725ae77Skettenis }
786b725ae77Skettenis 
787b725ae77Skettenis 
788b725ae77Skettenis /* Function: frame_chain
789b725ae77Skettenis    Figure out and return the caller's frame pointer given current
790b725ae77Skettenis    frame_info struct.
791b725ae77Skettenis 
792b725ae77Skettenis    We don't handle dummy frames yet but we would probably just return the
793b725ae77Skettenis    stack pointer that was in use at the time the function call was made?  */
794b725ae77Skettenis 
795b725ae77Skettenis static CORE_ADDR
mn10300_frame_chain(struct frame_info * fi)796b725ae77Skettenis mn10300_frame_chain (struct frame_info *fi)
797b725ae77Skettenis {
798b725ae77Skettenis   struct frame_info *dummy;
799b725ae77Skettenis   /* Walk through the prologue to determine the stack size,
800b725ae77Skettenis      location of saved registers, end of the prologue, etc.  */
801b725ae77Skettenis   if (get_frame_extra_info (fi)->status == 0)
802b725ae77Skettenis     mn10300_analyze_prologue (fi, (CORE_ADDR) 0);
803b725ae77Skettenis 
804b725ae77Skettenis   /* Quit now if mn10300_analyze_prologue set NO_MORE_FRAMES.  */
805b725ae77Skettenis   if (get_frame_extra_info (fi)->status & NO_MORE_FRAMES)
806b725ae77Skettenis     return 0;
807b725ae77Skettenis 
808b725ae77Skettenis   /* Now that we've analyzed our prologue, determine the frame
809b725ae77Skettenis      pointer for our caller.
810b725ae77Skettenis 
811b725ae77Skettenis      If our caller has a frame pointer, then we need to
812b725ae77Skettenis      find the entry value of $a3 to our function.
813b725ae77Skettenis 
814b725ae77Skettenis      If fsr.regs[A3_REGNUM] is nonzero, then it's at the memory
815b725ae77Skettenis      location pointed to by fsr.regs[A3_REGNUM].
816b725ae77Skettenis 
817b725ae77Skettenis      Else it's still in $a3.
818b725ae77Skettenis 
819b725ae77Skettenis      If our caller does not have a frame pointer, then his
820b725ae77Skettenis      frame base is fi->frame + -caller's stack size.  */
821b725ae77Skettenis 
822b725ae77Skettenis   /* The easiest way to get that info is to analyze our caller's frame.
823b725ae77Skettenis      So we set up a dummy frame and call mn10300_analyze_prologue to
824b725ae77Skettenis      find stuff for us.  */
825b725ae77Skettenis   dummy = analyze_dummy_frame (DEPRECATED_FRAME_SAVED_PC (fi), get_frame_base (fi));
826b725ae77Skettenis 
827b725ae77Skettenis   if (get_frame_extra_info (dummy)->status & MY_FRAME_IN_FP)
828b725ae77Skettenis     {
829b725ae77Skettenis       /* Our caller has a frame pointer.  So find the frame in $a3 or
830b725ae77Skettenis          in the stack.  */
831b725ae77Skettenis       if (deprecated_get_frame_saved_regs (fi)[A3_REGNUM])
832b725ae77Skettenis 	return (read_memory_integer (deprecated_get_frame_saved_regs (fi)[A3_REGNUM],
833b725ae77Skettenis 				     DEPRECATED_REGISTER_SIZE));
834b725ae77Skettenis       else
835b725ae77Skettenis 	return read_register (A3_REGNUM);
836b725ae77Skettenis     }
837b725ae77Skettenis   else
838b725ae77Skettenis     {
839b725ae77Skettenis       int adjust = saved_regs_size (fi);
840b725ae77Skettenis 
841b725ae77Skettenis       /* Our caller does not have a frame pointer.  So his frame starts
842b725ae77Skettenis          at the base of our frame (fi->frame) + register save space
843b725ae77Skettenis          + <his size>.  */
844b725ae77Skettenis       return get_frame_base (fi) + adjust + -get_frame_extra_info (dummy)->stack_size;
845b725ae77Skettenis     }
846b725ae77Skettenis }
847b725ae77Skettenis 
848b725ae77Skettenis /* Function: skip_prologue
849b725ae77Skettenis    Return the address of the first inst past the prologue of the function.  */
850b725ae77Skettenis 
851b725ae77Skettenis static CORE_ADDR
mn10300_skip_prologue(CORE_ADDR pc)852b725ae77Skettenis mn10300_skip_prologue (CORE_ADDR pc)
853b725ae77Skettenis {
854b725ae77Skettenis   /* We used to check the debug symbols, but that can lose if
855b725ae77Skettenis      we have a null prologue.  */
856b725ae77Skettenis   return mn10300_analyze_prologue (NULL, pc);
857b725ae77Skettenis }
858b725ae77Skettenis 
859b725ae77Skettenis /* generic_pop_current_frame calls this function if the current
860b725ae77Skettenis    frame isn't a dummy frame.  */
861b725ae77Skettenis static void
mn10300_pop_frame_regular(struct frame_info * frame)862b725ae77Skettenis mn10300_pop_frame_regular (struct frame_info *frame)
863b725ae77Skettenis {
864b725ae77Skettenis   int regnum;
865b725ae77Skettenis 
866b725ae77Skettenis   write_register (PC_REGNUM, DEPRECATED_FRAME_SAVED_PC (frame));
867b725ae77Skettenis 
868b725ae77Skettenis   /* Restore any saved registers.  */
869b725ae77Skettenis   for (regnum = 0; regnum < NUM_REGS; regnum++)
870b725ae77Skettenis     if (deprecated_get_frame_saved_regs (frame)[regnum] != 0)
871b725ae77Skettenis       {
872b725ae77Skettenis         ULONGEST value;
873b725ae77Skettenis 
874b725ae77Skettenis         value = read_memory_unsigned_integer (deprecated_get_frame_saved_regs (frame)[regnum],
875*11efff7fSkettenis                                               register_size (current_gdbarch, regnum));
876b725ae77Skettenis         write_register (regnum, value);
877b725ae77Skettenis       }
878b725ae77Skettenis 
879*11efff7fSkettenis   /* Actually cut back the stack, adjusted by the saved registers like
880*11efff7fSkettenis      ret would.  */
881*11efff7fSkettenis   write_register (SP_REGNUM, get_frame_base (frame) + saved_regs_size (frame));
882b725ae77Skettenis }
883b725ae77Skettenis 
884b725ae77Skettenis /* Function: pop_frame
885b725ae77Skettenis    This routine gets called when either the user uses the `return'
886b725ae77Skettenis    command, or the call dummy breakpoint gets hit.  */
887b725ae77Skettenis static void
mn10300_pop_frame(void)888b725ae77Skettenis mn10300_pop_frame (void)
889b725ae77Skettenis {
890*11efff7fSkettenis   struct frame_info *frame = get_current_frame ();
891*11efff7fSkettenis   if (get_frame_type (frame) == DUMMY_FRAME)
892*11efff7fSkettenis     /* NOTE: cagney/2002-22-23: Does this ever occure?  Surely a dummy
893*11efff7fSkettenis        frame will have already been poped by the "infrun.c" code.  */
894*11efff7fSkettenis     deprecated_pop_dummy_frame ();
895*11efff7fSkettenis   else
896*11efff7fSkettenis     mn10300_pop_frame_regular (frame);
897b725ae77Skettenis   /* Throw away any cached frame information.  */
898b725ae77Skettenis   flush_cached_frames ();
899b725ae77Skettenis }
900b725ae77Skettenis 
901b725ae77Skettenis /* Function: push_arguments
902b725ae77Skettenis    Setup arguments for a call to the target.  Arguments go in
903b725ae77Skettenis    order on the stack.  */
904b725ae77Skettenis 
905b725ae77Skettenis static CORE_ADDR
mn10300_push_arguments(int nargs,struct value ** args,CORE_ADDR sp,int struct_return,CORE_ADDR struct_addr)906b725ae77Skettenis mn10300_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
907b725ae77Skettenis 			int struct_return, CORE_ADDR struct_addr)
908b725ae77Skettenis {
909b725ae77Skettenis   int argnum = 0;
910b725ae77Skettenis   int len = 0;
911b725ae77Skettenis   int stack_offset = 0;
912b725ae77Skettenis   int regsused = struct_return ? 1 : 0;
913b725ae77Skettenis 
914b725ae77Skettenis   /* This should be a nop, but align the stack just in case something
915b725ae77Skettenis      went wrong.  Stacks are four byte aligned on the mn10300.  */
916b725ae77Skettenis   sp &= ~3;
917b725ae77Skettenis 
918b725ae77Skettenis   /* Now make space on the stack for the args.
919b725ae77Skettenis 
920b725ae77Skettenis      XXX This doesn't appear to handle pass-by-invisible reference
921b725ae77Skettenis      arguments.  */
922b725ae77Skettenis   for (argnum = 0; argnum < nargs; argnum++)
923b725ae77Skettenis     {
924b725ae77Skettenis       int arg_length = (TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3;
925b725ae77Skettenis 
926b725ae77Skettenis       while (regsused < 2 && arg_length > 0)
927b725ae77Skettenis 	{
928b725ae77Skettenis 	  regsused++;
929b725ae77Skettenis 	  arg_length -= 4;
930b725ae77Skettenis 	}
931b725ae77Skettenis       len += arg_length;
932b725ae77Skettenis     }
933b725ae77Skettenis 
934b725ae77Skettenis   /* Allocate stack space.  */
935b725ae77Skettenis   sp -= len;
936b725ae77Skettenis 
937b725ae77Skettenis   regsused = struct_return ? 1 : 0;
938b725ae77Skettenis   /* Push all arguments onto the stack. */
939b725ae77Skettenis   for (argnum = 0; argnum < nargs; argnum++)
940b725ae77Skettenis     {
941b725ae77Skettenis       int len;
942b725ae77Skettenis       char *val;
943b725ae77Skettenis 
944b725ae77Skettenis       /* XXX Check this.  What about UNIONS?  */
945b725ae77Skettenis       if (TYPE_CODE (VALUE_TYPE (*args)) == TYPE_CODE_STRUCT
946b725ae77Skettenis 	  && TYPE_LENGTH (VALUE_TYPE (*args)) > 8)
947b725ae77Skettenis 	{
948b725ae77Skettenis 	  /* XXX Wrong, we want a pointer to this argument.  */
949b725ae77Skettenis 	  len = TYPE_LENGTH (VALUE_TYPE (*args));
950b725ae77Skettenis 	  val = (char *) VALUE_CONTENTS (*args);
951b725ae77Skettenis 	}
952b725ae77Skettenis       else
953b725ae77Skettenis 	{
954b725ae77Skettenis 	  len = TYPE_LENGTH (VALUE_TYPE (*args));
955b725ae77Skettenis 	  val = (char *) VALUE_CONTENTS (*args);
956b725ae77Skettenis 	}
957b725ae77Skettenis 
958b725ae77Skettenis       while (regsused < 2 && len > 0)
959b725ae77Skettenis 	{
960b725ae77Skettenis 	  write_register (regsused, extract_unsigned_integer (val, 4));
961b725ae77Skettenis 	  val += 4;
962b725ae77Skettenis 	  len -= 4;
963b725ae77Skettenis 	  regsused++;
964b725ae77Skettenis 	}
965b725ae77Skettenis 
966b725ae77Skettenis       while (len > 0)
967b725ae77Skettenis 	{
968b725ae77Skettenis 	  write_memory (sp + stack_offset, val, 4);
969b725ae77Skettenis 	  len -= 4;
970b725ae77Skettenis 	  val += 4;
971b725ae77Skettenis 	  stack_offset += 4;
972b725ae77Skettenis 	}
973b725ae77Skettenis 
974b725ae77Skettenis       args++;
975b725ae77Skettenis     }
976b725ae77Skettenis 
977b725ae77Skettenis   /* Make space for the flushback area.  */
978b725ae77Skettenis   sp -= 8;
979b725ae77Skettenis   return sp;
980b725ae77Skettenis }
981b725ae77Skettenis 
982b725ae77Skettenis /* Function: push_return_address (pc)
983b725ae77Skettenis    Set up the return address for the inferior function call.
984b725ae77Skettenis    Needed for targets where we don't actually execute a JSR/BSR instruction */
985b725ae77Skettenis 
986b725ae77Skettenis static CORE_ADDR
mn10300_push_return_address(CORE_ADDR pc,CORE_ADDR sp)987b725ae77Skettenis mn10300_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
988b725ae77Skettenis {
989b725ae77Skettenis   unsigned char buf[4];
990b725ae77Skettenis 
991b725ae77Skettenis   store_unsigned_integer (buf, 4, entry_point_address ());
992b725ae77Skettenis   write_memory (sp - 4, buf, 4);
993b725ae77Skettenis   return sp - 4;
994b725ae77Skettenis }
995b725ae77Skettenis 
996b725ae77Skettenis /* Function: store_struct_return (addr,sp)
997b725ae77Skettenis    Store the structure value return address for an inferior function
998b725ae77Skettenis    call.  */
999b725ae77Skettenis 
1000b725ae77Skettenis static void
mn10300_store_struct_return(CORE_ADDR addr,CORE_ADDR sp)1001b725ae77Skettenis mn10300_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
1002b725ae77Skettenis {
1003b725ae77Skettenis   /* The structure return address is passed as the first argument.  */
1004b725ae77Skettenis   write_register (0, addr);
1005b725ae77Skettenis }
1006b725ae77Skettenis 
1007b725ae77Skettenis /* Function: frame_saved_pc
1008b725ae77Skettenis    Find the caller of this frame.  We do this by seeing if RP_REGNUM
1009b725ae77Skettenis    is saved in the stack anywhere, otherwise we get it from the
1010b725ae77Skettenis    registers.  If the inner frame is a dummy frame, return its PC
1011b725ae77Skettenis    instead of RP, because that's where "caller" of the dummy-frame
1012b725ae77Skettenis    will be found.  */
1013b725ae77Skettenis 
1014b725ae77Skettenis static CORE_ADDR
mn10300_frame_saved_pc(struct frame_info * fi)1015b725ae77Skettenis mn10300_frame_saved_pc (struct frame_info *fi)
1016b725ae77Skettenis {
1017b725ae77Skettenis   int adjust = saved_regs_size (fi);
1018b725ae77Skettenis 
1019b725ae77Skettenis   return (read_memory_integer (get_frame_base (fi) + adjust,
1020b725ae77Skettenis 			       DEPRECATED_REGISTER_SIZE));
1021b725ae77Skettenis }
1022b725ae77Skettenis 
1023b725ae77Skettenis /* Function: mn10300_init_extra_frame_info
1024b725ae77Skettenis    Setup the frame's frame pointer, pc, and frame addresses for saved
1025b725ae77Skettenis    registers.  Most of the work is done in mn10300_analyze_prologue().
1026b725ae77Skettenis 
1027b725ae77Skettenis    Note that when we are called for the last frame (currently active frame),
1028b725ae77Skettenis    that get_frame_pc (fi) and fi->frame will already be setup.  However, fi->frame will
1029b725ae77Skettenis    be valid only if this routine uses FP.  For previous frames, fi-frame will
1030b725ae77Skettenis    always be correct.  mn10300_analyze_prologue will fix fi->frame if
1031b725ae77Skettenis    it's not valid.
1032b725ae77Skettenis 
1033b725ae77Skettenis    We can be called with the PC in the call dummy under two
1034b725ae77Skettenis    circumstances.  First, during normal backtracing, second, while
1035b725ae77Skettenis    figuring out the frame pointer just prior to calling the target
1036b725ae77Skettenis    function (see call_function_by_hand).  */
1037b725ae77Skettenis 
1038b725ae77Skettenis static void
mn10300_init_extra_frame_info(int fromleaf,struct frame_info * fi)1039b725ae77Skettenis mn10300_init_extra_frame_info (int fromleaf, struct frame_info *fi)
1040b725ae77Skettenis {
1041b725ae77Skettenis   if (get_next_frame (fi))
1042b725ae77Skettenis     deprecated_update_frame_pc_hack (fi, DEPRECATED_FRAME_SAVED_PC (get_next_frame (fi)));
1043b725ae77Skettenis 
1044b725ae77Skettenis   frame_saved_regs_zalloc (fi);
1045b725ae77Skettenis   frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
1046b725ae77Skettenis 
1047b725ae77Skettenis   get_frame_extra_info (fi)->status = 0;
1048b725ae77Skettenis   get_frame_extra_info (fi)->stack_size = 0;
1049b725ae77Skettenis 
1050b725ae77Skettenis   mn10300_analyze_prologue (fi, 0);
1051b725ae77Skettenis }
1052b725ae77Skettenis 
1053b725ae77Skettenis 
1054b725ae77Skettenis /* This function's job is handled by init_extra_frame_info.  */
1055b725ae77Skettenis static void
mn10300_frame_init_saved_regs(struct frame_info * frame)1056b725ae77Skettenis mn10300_frame_init_saved_regs (struct frame_info *frame)
1057b725ae77Skettenis {
1058b725ae77Skettenis }
1059b725ae77Skettenis 
1060b725ae77Skettenis 
1061b725ae77Skettenis /* Function: mn10300_virtual_frame_pointer
1062b725ae77Skettenis    Return the register that the function uses for a frame pointer,
1063b725ae77Skettenis    plus any necessary offset to be applied to the register before
1064b725ae77Skettenis    any frame pointer offsets.  */
1065b725ae77Skettenis 
1066b725ae77Skettenis static void
mn10300_virtual_frame_pointer(CORE_ADDR pc,int * reg,LONGEST * offset)1067b725ae77Skettenis mn10300_virtual_frame_pointer (CORE_ADDR pc,
1068b725ae77Skettenis 			       int *reg,
1069b725ae77Skettenis 			       LONGEST *offset)
1070b725ae77Skettenis {
1071b725ae77Skettenis   struct frame_info *dummy = analyze_dummy_frame (pc, 0);
1072b725ae77Skettenis   /* Set up a dummy frame_info, Analyze the prolog and fill in the
1073b725ae77Skettenis      extra info.  */
1074b725ae77Skettenis   /* Results will tell us which type of frame it uses.  */
1075b725ae77Skettenis   if (get_frame_extra_info (dummy)->status & MY_FRAME_IN_SP)
1076b725ae77Skettenis     {
1077b725ae77Skettenis       *reg = SP_REGNUM;
1078b725ae77Skettenis       *offset = -(get_frame_extra_info (dummy)->stack_size);
1079b725ae77Skettenis     }
1080b725ae77Skettenis   else
1081b725ae77Skettenis     {
1082b725ae77Skettenis       *reg = A3_REGNUM;
1083b725ae77Skettenis       *offset = 0;
1084b725ae77Skettenis     }
1085b725ae77Skettenis }
1086b725ae77Skettenis 
1087b725ae77Skettenis static int
mn10300_reg_struct_has_addr(int gcc_p,struct type * type)1088b725ae77Skettenis mn10300_reg_struct_has_addr (int gcc_p, struct type *type)
1089b725ae77Skettenis {
1090b725ae77Skettenis   return (TYPE_LENGTH (type) > 8);
1091b725ae77Skettenis }
1092b725ae77Skettenis 
1093b725ae77Skettenis static struct type *
mn10300_register_virtual_type(int reg)1094b725ae77Skettenis mn10300_register_virtual_type (int reg)
1095b725ae77Skettenis {
1096b725ae77Skettenis   return builtin_type_int;
1097b725ae77Skettenis }
1098b725ae77Skettenis 
1099b725ae77Skettenis static int
mn10300_register_byte(int reg)1100b725ae77Skettenis mn10300_register_byte (int reg)
1101b725ae77Skettenis {
1102b725ae77Skettenis   return (reg * 4);
1103b725ae77Skettenis }
1104b725ae77Skettenis 
1105b725ae77Skettenis static int
mn10300_register_virtual_size(int reg)1106b725ae77Skettenis mn10300_register_virtual_size (int reg)
1107b725ae77Skettenis {
1108b725ae77Skettenis   return 4;
1109b725ae77Skettenis }
1110b725ae77Skettenis 
1111b725ae77Skettenis static int
mn10300_register_raw_size(int reg)1112b725ae77Skettenis mn10300_register_raw_size (int reg)
1113b725ae77Skettenis {
1114b725ae77Skettenis   return 4;
1115b725ae77Skettenis }
1116b725ae77Skettenis 
1117b725ae77Skettenis /* If DWARF2 is a register number appearing in Dwarf2 debug info, then
1118b725ae77Skettenis    mn10300_dwarf2_reg_to_regnum (DWARF2) is the corresponding GDB
1119b725ae77Skettenis    register number.  Why don't Dwarf2 and GDB use the same numbering?
1120b725ae77Skettenis    Who knows?  But since people have object files lying around with
1121b725ae77Skettenis    the existing Dwarf2 numbering, and other people have written stubs
1122b725ae77Skettenis    to work with the existing GDB, neither of them can change.  So we
1123b725ae77Skettenis    just have to cope.  */
1124b725ae77Skettenis static int
mn10300_dwarf2_reg_to_regnum(int dwarf2)1125b725ae77Skettenis mn10300_dwarf2_reg_to_regnum (int dwarf2)
1126b725ae77Skettenis {
1127b725ae77Skettenis   /* This table is supposed to be shaped like the REGISTER_NAMES
1128b725ae77Skettenis      initializer in gcc/config/mn10300/mn10300.h.  Registers which
1129b725ae77Skettenis      appear in GCC's numbering, but have no counterpart in GDB's
1130b725ae77Skettenis      world, are marked with a -1.  */
1131b725ae77Skettenis   static int dwarf2_to_gdb[] = {
1132b725ae77Skettenis     0,  1,  2,  3,  4,  5,  6,  7, -1, 8,
1133b725ae77Skettenis     15, 16, 17, 18, 19, 20, 21, 22
1134b725ae77Skettenis   };
1135b725ae77Skettenis   int gdb;
1136b725ae77Skettenis 
1137b725ae77Skettenis   if (dwarf2 < 0
1138b725ae77Skettenis       || dwarf2 >= (sizeof (dwarf2_to_gdb) / sizeof (dwarf2_to_gdb[0]))
1139b725ae77Skettenis       || dwarf2_to_gdb[dwarf2] == -1)
1140b725ae77Skettenis     internal_error (__FILE__, __LINE__,
1141b725ae77Skettenis                     "bogus register number in debug info: %d", dwarf2);
1142b725ae77Skettenis 
1143b725ae77Skettenis   return dwarf2_to_gdb[dwarf2];
1144b725ae77Skettenis }
1145b725ae77Skettenis 
1146b725ae77Skettenis static void
mn10300_print_register(const char * name,int regnum,int reg_width)1147b725ae77Skettenis mn10300_print_register (const char *name, int regnum, int reg_width)
1148b725ae77Skettenis {
1149b725ae77Skettenis   char raw_buffer[MAX_REGISTER_SIZE];
1150b725ae77Skettenis 
1151b725ae77Skettenis   if (reg_width)
1152b725ae77Skettenis     printf_filtered ("%*s: ", reg_width, name);
1153b725ae77Skettenis   else
1154b725ae77Skettenis     printf_filtered ("%s: ", name);
1155b725ae77Skettenis 
1156b725ae77Skettenis   /* Get the data */
1157b725ae77Skettenis   if (!frame_register_read (deprecated_selected_frame, regnum, raw_buffer))
1158b725ae77Skettenis     {
1159b725ae77Skettenis       printf_filtered ("[invalid]");
1160b725ae77Skettenis       return;
1161b725ae77Skettenis     }
1162b725ae77Skettenis   else
1163b725ae77Skettenis     {
1164b725ae77Skettenis       int byte;
1165b725ae77Skettenis       if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
1166b725ae77Skettenis 	{
1167*11efff7fSkettenis 	  for (byte = register_size (current_gdbarch, regnum) - DEPRECATED_REGISTER_VIRTUAL_SIZE (regnum);
1168*11efff7fSkettenis 	       byte < register_size (current_gdbarch, regnum);
1169b725ae77Skettenis 	       byte++)
1170b725ae77Skettenis 	    printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
1171b725ae77Skettenis 	}
1172b725ae77Skettenis       else
1173b725ae77Skettenis 	{
1174b725ae77Skettenis 	  for (byte = DEPRECATED_REGISTER_VIRTUAL_SIZE (regnum) - 1;
1175b725ae77Skettenis 	       byte >= 0;
1176b725ae77Skettenis 	       byte--)
1177b725ae77Skettenis 	    printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
1178b725ae77Skettenis 	}
1179b725ae77Skettenis     }
1180b725ae77Skettenis }
1181b725ae77Skettenis 
1182b725ae77Skettenis static void
mn10300_do_registers_info(int regnum,int fpregs)1183b725ae77Skettenis mn10300_do_registers_info (int regnum, int fpregs)
1184b725ae77Skettenis {
1185b725ae77Skettenis   if (regnum >= 0)
1186b725ae77Skettenis     {
1187b725ae77Skettenis       const char *name = REGISTER_NAME (regnum);
1188b725ae77Skettenis       if (name == NULL || name[0] == '\0')
1189b725ae77Skettenis 	error ("Not a valid register for the current processor type");
1190b725ae77Skettenis       mn10300_print_register (name, regnum, 0);
1191b725ae77Skettenis       printf_filtered ("\n");
1192b725ae77Skettenis     }
1193b725ae77Skettenis   else
1194b725ae77Skettenis     {
1195b725ae77Skettenis       /* print registers in an array 4x8 */
1196b725ae77Skettenis       int r;
1197b725ae77Skettenis       int reg;
1198b725ae77Skettenis       const int nr_in_row = 4;
1199b725ae77Skettenis       const int reg_width = 4;
1200b725ae77Skettenis       for (r = 0; r < NUM_REGS; r += nr_in_row)
1201b725ae77Skettenis 	{
1202b725ae77Skettenis 	  int c;
1203b725ae77Skettenis 	  int printing = 0;
1204b725ae77Skettenis 	  int padding = 0;
1205b725ae77Skettenis 	  for (c = r; c < r + nr_in_row; c++)
1206b725ae77Skettenis 	    {
1207b725ae77Skettenis 	      const char *name = REGISTER_NAME (c);
1208b725ae77Skettenis 	      if (name != NULL && *name != '\0')
1209b725ae77Skettenis 		{
1210b725ae77Skettenis 		  printing = 1;
1211b725ae77Skettenis 		  while (padding > 0)
1212b725ae77Skettenis 		    {
1213b725ae77Skettenis 		      printf_filtered (" ");
1214b725ae77Skettenis 		      padding--;
1215b725ae77Skettenis 		    }
1216b725ae77Skettenis 		  mn10300_print_register (name, c, reg_width);
1217b725ae77Skettenis 		  printf_filtered (" ");
1218b725ae77Skettenis 		}
1219b725ae77Skettenis 	      else
1220b725ae77Skettenis 		{
1221b725ae77Skettenis 		  padding += (reg_width + 2 + 8 + 1);
1222b725ae77Skettenis 		}
1223b725ae77Skettenis 	    }
1224b725ae77Skettenis 	  if (printing)
1225b725ae77Skettenis 	    printf_filtered ("\n");
1226b725ae77Skettenis 	}
1227b725ae77Skettenis     }
1228b725ae77Skettenis }
1229b725ae77Skettenis 
1230b725ae77Skettenis static CORE_ADDR
mn10300_read_fp(void)1231b725ae77Skettenis mn10300_read_fp (void)
1232b725ae77Skettenis {
1233b725ae77Skettenis   /* That's right, we're using the stack pointer as our frame pointer.  */
1234b725ae77Skettenis   gdb_assert (SP_REGNUM >= 0);
1235b725ae77Skettenis   return read_register (SP_REGNUM);
1236b725ae77Skettenis }
1237b725ae77Skettenis 
1238b725ae77Skettenis /* Dump out the mn10300 speciic architecture information. */
1239b725ae77Skettenis 
1240b725ae77Skettenis static void
mn10300_dump_tdep(struct gdbarch * current_gdbarch,struct ui_file * file)1241b725ae77Skettenis mn10300_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
1242b725ae77Skettenis {
1243b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1244b725ae77Skettenis   fprintf_unfiltered (file, "mn10300_dump_tdep: am33_mode = %d\n",
1245b725ae77Skettenis 		      tdep->am33_mode);
1246b725ae77Skettenis }
1247b725ae77Skettenis 
1248b725ae77Skettenis static struct gdbarch *
mn10300_gdbarch_init(struct gdbarch_info info,struct gdbarch_list * arches)1249b725ae77Skettenis mn10300_gdbarch_init (struct gdbarch_info info,
1250b725ae77Skettenis 		      struct gdbarch_list *arches)
1251b725ae77Skettenis {
1252b725ae77Skettenis   struct gdbarch *gdbarch;
1253b725ae77Skettenis   struct gdbarch_tdep *tdep = NULL;
1254b725ae77Skettenis   int am33_mode;
1255b725ae77Skettenis   gdbarch_register_name_ftype *register_name;
1256b725ae77Skettenis   int mach;
1257b725ae77Skettenis   int num_regs;
1258b725ae77Skettenis 
1259b725ae77Skettenis   arches = gdbarch_list_lookup_by_info (arches, &info);
1260b725ae77Skettenis   if (arches != NULL)
1261b725ae77Skettenis     return arches->gdbarch;
1262b725ae77Skettenis   tdep = xmalloc (sizeof (struct gdbarch_tdep));
1263b725ae77Skettenis   gdbarch = gdbarch_alloc (&info, tdep);
1264b725ae77Skettenis 
1265b725ae77Skettenis   if (info.bfd_arch_info != NULL
1266b725ae77Skettenis       && info.bfd_arch_info->arch == bfd_arch_mn10300)
1267b725ae77Skettenis     mach = info.bfd_arch_info->mach;
1268b725ae77Skettenis   else
1269b725ae77Skettenis     mach = 0;
1270b725ae77Skettenis   switch (mach)
1271b725ae77Skettenis     {
1272b725ae77Skettenis     case 0:
1273b725ae77Skettenis     case bfd_mach_mn10300:
1274b725ae77Skettenis       am33_mode = 0;
1275b725ae77Skettenis       register_name = mn10300_generic_register_name;
1276b725ae77Skettenis       num_regs = 32;
1277b725ae77Skettenis       break;
1278b725ae77Skettenis     case bfd_mach_am33:
1279b725ae77Skettenis       am33_mode = 1;
1280b725ae77Skettenis       register_name = am33_register_name;
1281b725ae77Skettenis       num_regs = 32;
1282b725ae77Skettenis       break;
1283b725ae77Skettenis     default:
1284b725ae77Skettenis       internal_error (__FILE__, __LINE__,
1285b725ae77Skettenis 		      "mn10300_gdbarch_init: Unknown mn10300 variant");
1286b725ae77Skettenis       return NULL; /* keep GCC happy. */
1287b725ae77Skettenis     }
1288b725ae77Skettenis 
1289b725ae77Skettenis   /* Registers.  */
1290b725ae77Skettenis   set_gdbarch_num_regs (gdbarch, num_regs);
1291b725ae77Skettenis   set_gdbarch_register_name (gdbarch, register_name);
1292b725ae77Skettenis   set_gdbarch_deprecated_register_size (gdbarch, 4);
1293b725ae77Skettenis   set_gdbarch_deprecated_register_raw_size (gdbarch, mn10300_register_raw_size);
1294b725ae77Skettenis   set_gdbarch_deprecated_register_byte (gdbarch, mn10300_register_byte);
1295b725ae77Skettenis   set_gdbarch_deprecated_register_virtual_size (gdbarch, mn10300_register_virtual_size);
1296b725ae77Skettenis   set_gdbarch_deprecated_register_virtual_type (gdbarch, mn10300_register_virtual_type);
1297b725ae77Skettenis   set_gdbarch_dwarf2_reg_to_regnum (gdbarch, mn10300_dwarf2_reg_to_regnum);
1298b725ae77Skettenis   set_gdbarch_deprecated_do_registers_info (gdbarch, mn10300_do_registers_info);
1299b725ae77Skettenis   set_gdbarch_sp_regnum (gdbarch, 8);
1300b725ae77Skettenis   set_gdbarch_pc_regnum (gdbarch, 9);
1301b725ae77Skettenis   set_gdbarch_deprecated_fp_regnum (gdbarch, 31);
1302b725ae77Skettenis   set_gdbarch_virtual_frame_pointer (gdbarch, mn10300_virtual_frame_pointer);
1303b725ae77Skettenis 
1304b725ae77Skettenis   /* Breakpoints.  */
1305b725ae77Skettenis   set_gdbarch_breakpoint_from_pc (gdbarch, mn10300_breakpoint_from_pc);
1306b725ae77Skettenis 
1307b725ae77Skettenis   /* Stack unwinding.  */
1308b725ae77Skettenis   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1309b725ae77Skettenis   set_gdbarch_deprecated_saved_pc_after_call (gdbarch, mn10300_saved_pc_after_call);
1310b725ae77Skettenis   set_gdbarch_deprecated_init_extra_frame_info (gdbarch, mn10300_init_extra_frame_info);
1311b725ae77Skettenis   set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, mn10300_frame_init_saved_regs);
1312b725ae77Skettenis   set_gdbarch_deprecated_frame_chain (gdbarch, mn10300_frame_chain);
1313b725ae77Skettenis   set_gdbarch_deprecated_frame_saved_pc (gdbarch, mn10300_frame_saved_pc);
1314*11efff7fSkettenis   set_gdbarch_return_value (gdbarch, mn10300_return_value);
1315b725ae77Skettenis   set_gdbarch_deprecated_store_struct_return (gdbarch, mn10300_store_struct_return);
1316b725ae77Skettenis   set_gdbarch_deprecated_pop_frame (gdbarch, mn10300_pop_frame);
1317b725ae77Skettenis   set_gdbarch_skip_prologue (gdbarch, mn10300_skip_prologue);
1318b725ae77Skettenis   /* That's right, we're using the stack pointer as our frame pointer.  */
1319b725ae77Skettenis   set_gdbarch_deprecated_target_read_fp (gdbarch, mn10300_read_fp);
1320b725ae77Skettenis 
1321b725ae77Skettenis   /* Calling functions in the inferior from GDB.  */
1322b725ae77Skettenis   set_gdbarch_deprecated_push_arguments (gdbarch, mn10300_push_arguments);
1323b725ae77Skettenis   set_gdbarch_deprecated_reg_struct_has_addr
1324b725ae77Skettenis     (gdbarch, mn10300_reg_struct_has_addr);
1325b725ae77Skettenis   set_gdbarch_deprecated_push_return_address (gdbarch, mn10300_push_return_address);
1326b725ae77Skettenis 
1327b725ae77Skettenis   tdep->am33_mode = am33_mode;
1328b725ae77Skettenis 
1329b725ae77Skettenis   /* Should be using push_dummy_call.  */
1330b725ae77Skettenis   set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp);
1331b725ae77Skettenis 
1332b725ae77Skettenis   set_gdbarch_print_insn (gdbarch, print_insn_mn10300);
1333b725ae77Skettenis 
1334b725ae77Skettenis   return gdbarch;
1335b725ae77Skettenis }
1336b725ae77Skettenis 
1337b725ae77Skettenis void
_initialize_mn10300_tdep(void)1338b725ae77Skettenis _initialize_mn10300_tdep (void)
1339b725ae77Skettenis {
1340b725ae77Skettenis /*  printf("_initialize_mn10300_tdep\n"); */
1341b725ae77Skettenis   gdbarch_register (bfd_arch_mn10300, mn10300_gdbarch_init, mn10300_dump_tdep);
1342b725ae77Skettenis }
1343