xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/m68hc11-tdep.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1 /* Target-dependent code for Motorola 68HC11 & 68HC12
2 
3    Copyright (C) 1999-2023 Free Software Foundation, Inc.
4 
5    Contributed by Stephane Carrez, stcarrez@nerim.fr
6 
7    This file is part of GDB.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21 
22 
23 #include "defs.h"
24 #include "frame.h"
25 #include "frame-unwind.h"
26 #include "frame-base.h"
27 #include "dwarf2/frame.h"
28 #include "trad-frame.h"
29 #include "symtab.h"
30 #include "gdbtypes.h"
31 #include "gdbcmd.h"
32 #include "gdbcore.h"
33 #include "value.h"
34 #include "inferior.h"
35 #include "dis-asm.h"
36 #include "symfile.h"
37 #include "objfiles.h"
38 #include "arch-utils.h"
39 #include "regcache.h"
40 #include "reggroups.h"
41 #include "gdbarch.h"
42 
43 #include "target.h"
44 #include "opcode/m68hc11.h"
45 #include "elf/m68hc11.h"
46 #include "elf-bfd.h"
47 
48 /* Macros for setting and testing a bit in a minimal symbol.
49    For 68HC11/68HC12 we have two flags that tell which return
50    type the function is using.  This is used for prologue and frame
51    analysis to compute correct stack frame layout.
52 
53    The MSB of the minimal symbol's "info" field is used for this purpose.
54 
55    MSYMBOL_SET_RTC	Actually sets the "RTC" bit.
56    MSYMBOL_SET_RTI	Actually sets the "RTI" bit.
57    MSYMBOL_IS_RTC       Tests the "RTC" bit in a minimal symbol.
58    MSYMBOL_IS_RTI       Tests the "RTC" bit in a minimal symbol.  */
59 
60 #define MSYMBOL_SET_RTC(msym)                           \
61 	(msym)->set_target_flag_1 (true)
62 
63 #define MSYMBOL_SET_RTI(msym)                           \
64 	(msym)->set_target_flag_2 (true)
65 
66 #define MSYMBOL_IS_RTC(msym)				\
67 	(msym)->target_flag_1 ()
68 
69 #define MSYMBOL_IS_RTI(msym)				\
70 	(msym)->target_flag_2 ()
71 
72 enum insn_return_kind {
73   RETURN_RTS,
74   RETURN_RTC,
75   RETURN_RTI
76 };
77 
78 
79 /* Register numbers of various important registers.  */
80 
81 #define HARD_X_REGNUM 	0
82 #define HARD_D_REGNUM	1
83 #define HARD_Y_REGNUM   2
84 #define HARD_SP_REGNUM 	3
85 #define HARD_PC_REGNUM 	4
86 
87 #define HARD_A_REGNUM   5
88 #define HARD_B_REGNUM   6
89 #define HARD_CCR_REGNUM 7
90 
91 /* 68HC12 page number register.
92    Note: to keep a compatibility with gcc register naming, we must
93    not have to rename FP and other soft registers.  The page register
94    is a real hard register and must therefore be counted by gdbarch_num_regs.
95    For this it has the same number as Z register (which is not used).  */
96 #define HARD_PAGE_REGNUM 8
97 #define M68HC11_LAST_HARD_REG (HARD_PAGE_REGNUM)
98 
99 /* Z is replaced by X or Y by gcc during machine reorg.
100    ??? There is no way to get it and even know whether
101    it's in X or Y or in ZS.  */
102 #define SOFT_Z_REGNUM        8
103 
104 /* Soft registers.  These registers are special.  There are treated
105    like normal hard registers by gcc and gdb (ie, within dwarf2 info).
106    They are physically located in memory.  */
107 #define SOFT_FP_REGNUM       9
108 #define SOFT_TMP_REGNUM     10
109 #define SOFT_ZS_REGNUM      11
110 #define SOFT_XY_REGNUM      12
111 #define SOFT_UNUSED_REGNUM  13
112 #define SOFT_D1_REGNUM      14
113 #define SOFT_D32_REGNUM     (SOFT_D1_REGNUM+31)
114 #define M68HC11_MAX_SOFT_REGS 32
115 
116 #define M68HC11_NUM_REGS        (M68HC11_LAST_HARD_REG + 1)
117 #define M68HC11_NUM_PSEUDO_REGS (M68HC11_MAX_SOFT_REGS+5)
118 #define M68HC11_ALL_REGS        (M68HC11_NUM_REGS+M68HC11_NUM_PSEUDO_REGS)
119 
120 #define M68HC11_REG_SIZE    (2)
121 
122 #define M68HC12_NUM_REGS        (9)
123 #define M68HC12_NUM_PSEUDO_REGS ((M68HC11_MAX_SOFT_REGS+5)+1-1)
124 #define M68HC12_HARD_PC_REGNUM  (SOFT_D32_REGNUM+1)
125 
126 struct insn_sequence;
127 struct m68gc11_gdbarch_tdep : gdbarch_tdep_base
128   {
129     /* Stack pointer correction value.  For 68hc11, the stack pointer points
130        to the next push location.  An offset of 1 must be applied to obtain
131        the address where the last value is saved.  For 68hc12, the stack
132        pointer points to the last value pushed.  No offset is necessary.  */
133     int stack_correction = 0;
134 
135     /* Description of instructions in the prologue.  */
136     struct insn_sequence *prologue = nullptr;
137 
138     /* True if the page memory bank register is available
139        and must be used.  */
140     int use_page_register = 0;
141 
142     /* ELF flags for ABI.  */
143     int elf_flags = 0;
144   };
145 
146 static int
147 stack_correction (gdbarch *arch)
148 {
149   m68gc11_gdbarch_tdep *tdep = gdbarch_tdep<m68gc11_gdbarch_tdep> (arch);
150   return tdep->stack_correction;
151 }
152 
153 static int
154 use_page_register (gdbarch *arch)
155 {
156   m68gc11_gdbarch_tdep *tdep = gdbarch_tdep<m68gc11_gdbarch_tdep> (arch);
157   return tdep->stack_correction;
158 }
159 
160 struct m68hc11_unwind_cache
161 {
162   /* The previous frame's inner most stack address.  Used as this
163      frame ID's stack_addr.  */
164   CORE_ADDR prev_sp;
165   /* The frame's base, optionally used by the high-level debug info.  */
166   CORE_ADDR base;
167   CORE_ADDR pc;
168   int size;
169   int prologue_type;
170   CORE_ADDR return_pc;
171   CORE_ADDR sp_offset;
172   int frameless;
173   enum insn_return_kind return_kind;
174 
175   /* Table indicating the location of each and every register.  */
176   trad_frame_saved_reg *saved_regs;
177 };
178 
179 /* Table of registers for 68HC11.  This includes the hard registers
180    and the soft registers used by GCC.  */
181 static const char *
182 m68hc11_register_names[] =
183 {
184   "x",    "d",    "y",    "sp",   "pc",   "a",    "b",
185   "ccr",  "page", "frame","tmp",  "zs",   "xy",   0,
186   "d1",   "d2",   "d3",   "d4",   "d5",   "d6",   "d7",
187   "d8",   "d9",   "d10",  "d11",  "d12",  "d13",  "d14",
188   "d15",  "d16",  "d17",  "d18",  "d19",  "d20",  "d21",
189   "d22",  "d23",  "d24",  "d25",  "d26",  "d27",  "d28",
190   "d29",  "d30",  "d31",  "d32"
191 };
192 
193 struct m68hc11_soft_reg
194 {
195   const char *name;
196   CORE_ADDR   addr;
197 };
198 
199 static struct m68hc11_soft_reg soft_regs[M68HC11_ALL_REGS];
200 
201 #define M68HC11_FP_ADDR soft_regs[SOFT_FP_REGNUM].addr
202 
203 static int soft_min_addr;
204 static int soft_max_addr;
205 static int soft_reg_initialized = 0;
206 
207 /* Look in the symbol table for the address of a pseudo register
208    in memory.  If we don't find it, pretend the register is not used
209    and not available.  */
210 static void
211 m68hc11_get_register_info (struct m68hc11_soft_reg *reg, const char *name)
212 {
213   struct bound_minimal_symbol msymbol;
214 
215   msymbol = lookup_minimal_symbol (name, NULL, NULL);
216   if (msymbol.minsym)
217     {
218       reg->addr = msymbol.value_address ();
219       reg->name = xstrdup (name);
220 
221       /* Keep track of the address range for soft registers.  */
222       if (reg->addr < (CORE_ADDR) soft_min_addr)
223 	soft_min_addr = reg->addr;
224       if (reg->addr > (CORE_ADDR) soft_max_addr)
225 	soft_max_addr = reg->addr;
226     }
227   else
228     {
229       reg->name = 0;
230       reg->addr = 0;
231     }
232 }
233 
234 /* Initialize the table of soft register addresses according
235    to the symbol table.  */
236   static void
237 m68hc11_initialize_register_info (void)
238 {
239   int i;
240 
241   if (soft_reg_initialized)
242     return;
243 
244   soft_min_addr = INT_MAX;
245   soft_max_addr = 0;
246   for (i = 0; i < M68HC11_ALL_REGS; i++)
247     {
248       soft_regs[i].name = 0;
249     }
250 
251   m68hc11_get_register_info (&soft_regs[SOFT_FP_REGNUM], "_.frame");
252   m68hc11_get_register_info (&soft_regs[SOFT_TMP_REGNUM], "_.tmp");
253   m68hc11_get_register_info (&soft_regs[SOFT_ZS_REGNUM], "_.z");
254   soft_regs[SOFT_Z_REGNUM] = soft_regs[SOFT_ZS_REGNUM];
255   m68hc11_get_register_info (&soft_regs[SOFT_XY_REGNUM], "_.xy");
256 
257   for (i = SOFT_D1_REGNUM; i < M68HC11_MAX_SOFT_REGS; i++)
258     {
259       char buf[10];
260 
261       xsnprintf (buf, sizeof (buf), "_.d%d", i - SOFT_D1_REGNUM + 1);
262       m68hc11_get_register_info (&soft_regs[i], buf);
263     }
264 
265   if (soft_regs[SOFT_FP_REGNUM].name == 0)
266     warning (_("No frame soft register found in the symbol table.\n"
267 	       "Stack backtrace will not work."));
268   soft_reg_initialized = 1;
269 }
270 
271 /* Given an address in memory, return the soft register number if
272    that address corresponds to a soft register.  Returns -1 if not.  */
273 static int
274 m68hc11_which_soft_register (CORE_ADDR addr)
275 {
276   int i;
277 
278   if (addr < soft_min_addr || addr > soft_max_addr)
279     return -1;
280 
281   for (i = SOFT_FP_REGNUM; i < M68HC11_ALL_REGS; i++)
282     {
283       if (soft_regs[i].name && soft_regs[i].addr == addr)
284 	return i;
285     }
286   return -1;
287 }
288 
289 /* Fetch a pseudo register.  The 68hc11 soft registers are treated like
290    pseudo registers.  They are located in memory.  Translate the register
291    fetch into a memory read.  */
292 static enum register_status
293 m68hc11_pseudo_register_read (struct gdbarch *gdbarch,
294 			      readable_regcache *regcache,
295 			      int regno, gdb_byte *buf)
296 {
297   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
298 
299   /* The PC is a pseudo reg only for 68HC12 with the memory bank
300      addressing mode.  */
301   if (regno == M68HC12_HARD_PC_REGNUM)
302     {
303       ULONGEST pc;
304       const int regsize = 4;
305       enum register_status status;
306 
307       status = regcache->cooked_read (HARD_PC_REGNUM, &pc);
308       if (status != REG_VALID)
309 	return status;
310       if (pc >= 0x8000 && pc < 0xc000)
311 	{
312 	  ULONGEST page;
313 
314 	  regcache->cooked_read (HARD_PAGE_REGNUM, &page);
315 	  pc -= 0x8000;
316 	  pc += (page << 14);
317 	  pc += 0x1000000;
318 	}
319       store_unsigned_integer (buf, regsize, byte_order, pc);
320       return REG_VALID;
321     }
322 
323   m68hc11_initialize_register_info ();
324 
325   /* Fetch a soft register: translate into a memory read.  */
326   if (soft_regs[regno].name)
327     {
328       target_read_memory (soft_regs[regno].addr, buf, 2);
329     }
330   else
331     {
332       memset (buf, 0, 2);
333     }
334 
335   return REG_VALID;
336 }
337 
338 /* Store a pseudo register.  Translate the register store
339    into a memory write.  */
340 static void
341 m68hc11_pseudo_register_write (struct gdbarch *gdbarch,
342 			       struct regcache *regcache,
343 			       int regno, const gdb_byte *buf)
344 {
345   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
346 
347   /* The PC is a pseudo reg only for 68HC12 with the memory bank
348      addressing mode.  */
349   if (regno == M68HC12_HARD_PC_REGNUM)
350     {
351       const int regsize = 4;
352       gdb_byte *tmp = (gdb_byte *) alloca (regsize);
353       CORE_ADDR pc;
354 
355       memcpy (tmp, buf, regsize);
356       pc = extract_unsigned_integer (tmp, regsize, byte_order);
357       if (pc >= 0x1000000)
358 	{
359 	  pc -= 0x1000000;
360 	  regcache_cooked_write_unsigned (regcache, HARD_PAGE_REGNUM,
361 					  (pc >> 14) & 0x0ff);
362 	  pc &= 0x03fff;
363 	  regcache_cooked_write_unsigned (regcache, HARD_PC_REGNUM,
364 					  pc + 0x8000);
365 	}
366       else
367 	regcache_cooked_write_unsigned (regcache, HARD_PC_REGNUM, pc);
368       return;
369     }
370 
371   m68hc11_initialize_register_info ();
372 
373   /* Store a soft register: translate into a memory write.  */
374   if (soft_regs[regno].name)
375     {
376       const int regsize = 2;
377       gdb_byte *tmp = (gdb_byte *) alloca (regsize);
378       memcpy (tmp, buf, regsize);
379       target_write_memory (soft_regs[regno].addr, tmp, regsize);
380     }
381 }
382 
383 static const char *
384 m68hc11_register_name (struct gdbarch *gdbarch, int reg_nr)
385 {
386   if (reg_nr == M68HC12_HARD_PC_REGNUM && use_page_register (gdbarch))
387     return "pc";
388 
389   if (reg_nr == HARD_PC_REGNUM && use_page_register (gdbarch))
390     return "ppc";
391 
392   if (reg_nr >= M68HC11_ALL_REGS)
393     return "";
394 
395   m68hc11_initialize_register_info ();
396 
397   /* If we don't know the address of a soft register, pretend it
398      does not exist.  */
399   if (reg_nr > M68HC11_LAST_HARD_REG && soft_regs[reg_nr].name == 0)
400     return "";
401 
402   return m68hc11_register_names[reg_nr];
403 }
404 
405 constexpr gdb_byte m68hc11_break_insn[] = {0x0};
406 
407 typedef BP_MANIPULATION (m68hc11_break_insn) m68hc11_breakpoint;
408 
409 /* 68HC11 & 68HC12 prologue analysis.  */
410 
411 #define MAX_CODES 12
412 
413 /* 68HC11 opcodes.  */
414 #undef M6811_OP_PAGE2
415 #define M6811_OP_PAGE2   (0x18)
416 #define M6811_OP_LDX     (0xde)
417 #define M6811_OP_LDX_EXT (0xfe)
418 #define M6811_OP_PSHX    (0x3c)
419 #define M6811_OP_STS     (0x9f)
420 #define M6811_OP_STS_EXT (0xbf)
421 #define M6811_OP_TSX     (0x30)
422 #define M6811_OP_XGDX    (0x8f)
423 #define M6811_OP_ADDD    (0xc3)
424 #define M6811_OP_TXS     (0x35)
425 #define M6811_OP_DES     (0x34)
426 
427 /* 68HC12 opcodes.  */
428 #define M6812_OP_PAGE2   (0x18)
429 #define M6812_OP_MOVW    (0x01)
430 #define M6812_PB_PSHW    (0xae)
431 #define M6812_OP_STS     (0x5f)
432 #define M6812_OP_STS_EXT (0x7f)
433 #define M6812_OP_LEAS    (0x1b)
434 #define M6812_OP_PSHX    (0x34)
435 #define M6812_OP_PSHY    (0x35)
436 
437 /* Operand extraction.  */
438 #define OP_DIRECT      (0x100) /* 8-byte direct addressing.  */
439 #define OP_IMM_LOW     (0x200) /* Low part of 16-bit constant/address.  */
440 #define OP_IMM_HIGH    (0x300) /* High part of 16-bit constant/address.  */
441 #define OP_PBYTE       (0x400) /* 68HC12 indexed operand.  */
442 
443 /* Identification of the sequence.  */
444 enum m6811_seq_type
445 {
446   P_LAST = 0,
447   P_SAVE_REG,  /* Save a register on the stack.  */
448   P_SET_FRAME, /* Setup the frame pointer.  */
449   P_LOCAL_1,   /* Allocate 1 byte for locals.  */
450   P_LOCAL_2,   /* Allocate 2 bytes for locals.  */
451   P_LOCAL_N    /* Allocate N bytes for locals.  */
452 };
453 
454 struct insn_sequence {
455   enum m6811_seq_type type;
456   unsigned length;
457   unsigned short code[MAX_CODES];
458 };
459 
460 /* Sequence of instructions in the 68HC11 function prologue.  */
461 static struct insn_sequence m6811_prologue[] = {
462   /* Sequences to save a soft-register.  */
463   { P_SAVE_REG, 3, { M6811_OP_LDX, OP_DIRECT,
464 		     M6811_OP_PSHX } },
465   { P_SAVE_REG, 5, { M6811_OP_PAGE2, M6811_OP_LDX, OP_DIRECT,
466 		     M6811_OP_PAGE2, M6811_OP_PSHX } },
467   { P_SAVE_REG, 4, { M6811_OP_LDX_EXT, OP_IMM_HIGH, OP_IMM_LOW,
468 		     M6811_OP_PSHX } },
469   { P_SAVE_REG, 6, { M6811_OP_PAGE2, M6811_OP_LDX_EXT, OP_IMM_HIGH, OP_IMM_LOW,
470 		     M6811_OP_PAGE2, M6811_OP_PSHX } },
471 
472   /* Sequences to allocate local variables.  */
473   { P_LOCAL_N,  7, { M6811_OP_TSX,
474 		     M6811_OP_XGDX,
475 		     M6811_OP_ADDD, OP_IMM_HIGH, OP_IMM_LOW,
476 		     M6811_OP_XGDX,
477 		     M6811_OP_TXS } },
478   { P_LOCAL_N, 11, { M6811_OP_PAGE2, M6811_OP_TSX,
479 		     M6811_OP_PAGE2, M6811_OP_XGDX,
480 		     M6811_OP_ADDD, OP_IMM_HIGH, OP_IMM_LOW,
481 		     M6811_OP_PAGE2, M6811_OP_XGDX,
482 		     M6811_OP_PAGE2, M6811_OP_TXS } },
483   { P_LOCAL_1,  1, { M6811_OP_DES } },
484   { P_LOCAL_2,  1, { M6811_OP_PSHX } },
485   { P_LOCAL_2,  2, { M6811_OP_PAGE2, M6811_OP_PSHX } },
486 
487   /* Initialize the frame pointer.  */
488   { P_SET_FRAME, 2, { M6811_OP_STS, OP_DIRECT } },
489   { P_SET_FRAME, 3, { M6811_OP_STS_EXT, OP_IMM_HIGH, OP_IMM_LOW } },
490   { P_LAST, 0, { 0 } }
491 };
492 
493 
494 /* Sequence of instructions in the 68HC12 function prologue.  */
495 static struct insn_sequence m6812_prologue[] = {
496   { P_SAVE_REG,  5, { M6812_OP_PAGE2, M6812_OP_MOVW, M6812_PB_PSHW,
497 		      OP_IMM_HIGH, OP_IMM_LOW } },
498   { P_SET_FRAME, 2, { M6812_OP_STS, OP_DIRECT } },
499   { P_SET_FRAME, 3, { M6812_OP_STS_EXT, OP_IMM_HIGH, OP_IMM_LOW } },
500   { P_LOCAL_N,   2, { M6812_OP_LEAS, OP_PBYTE } },
501   { P_LOCAL_2,   1, { M6812_OP_PSHX } },
502   { P_LOCAL_2,   1, { M6812_OP_PSHY } },
503   { P_LAST, 0 }
504 };
505 
506 
507 /* Analyze the sequence of instructions starting at the given address.
508    Returns a pointer to the sequence when it is recognized and
509    the optional value (constant/address) associated with it.  */
510 static struct insn_sequence *
511 m68hc11_analyze_instruction (struct gdbarch *gdbarch,
512 			     struct insn_sequence *seq, CORE_ADDR pc,
513 			     CORE_ADDR *val)
514 {
515   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
516   unsigned char buffer[MAX_CODES];
517   unsigned bufsize;
518   unsigned j;
519   CORE_ADDR cur_val;
520   short v = 0;
521 
522   bufsize = 0;
523   for (; seq->type != P_LAST; seq++)
524     {
525       cur_val = 0;
526       for (j = 0; j < seq->length; j++)
527 	{
528 	  if (bufsize < j + 1)
529 	    {
530 	      buffer[bufsize] = read_memory_unsigned_integer (pc + bufsize,
531 							      1, byte_order);
532 	      bufsize++;
533 	    }
534 	  /* Continue while we match the opcode.  */
535 	  if (seq->code[j] == buffer[j])
536 	    continue;
537 
538 	  if ((seq->code[j] & 0xf00) == 0)
539 	    break;
540 
541 	  /* Extract a sequence parameter (address or constant).  */
542 	  switch (seq->code[j])
543 	    {
544 	    case OP_DIRECT:
545 	      cur_val = (CORE_ADDR) buffer[j];
546 	      break;
547 
548 	    case OP_IMM_HIGH:
549 	      cur_val = cur_val & 0x0ff;
550 	      cur_val |= (buffer[j] << 8);
551 	      break;
552 
553 	    case OP_IMM_LOW:
554 	      cur_val &= 0x0ff00;
555 	      cur_val |= buffer[j];
556 	      break;
557 
558 	    case OP_PBYTE:
559 	      if ((buffer[j] & 0xE0) == 0x80)
560 		{
561 		  v = buffer[j] & 0x1f;
562 		  if (v & 0x10)
563 		    v |= 0xfff0;
564 		}
565 	      else if ((buffer[j] & 0xfe) == 0xf0)
566 		{
567 		  v = read_memory_unsigned_integer (pc + j + 1, 1, byte_order);
568 		  if (buffer[j] & 1)
569 		    v |= 0xff00;
570 		}
571 	      else if (buffer[j] == 0xf2)
572 		{
573 		  v = read_memory_unsigned_integer (pc + j + 1, 2, byte_order);
574 		}
575 	      cur_val = v;
576 	      break;
577 	    }
578 	}
579 
580       /* We have a full match.  */
581       if (j == seq->length)
582 	{
583 	  *val = cur_val;
584 	  return seq;
585 	}
586     }
587   return 0;
588 }
589 
590 /* Return the instruction that the function at the PC is using.  */
591 static enum insn_return_kind
592 m68hc11_get_return_insn (CORE_ADDR pc)
593 {
594   struct bound_minimal_symbol sym;
595 
596   /* A flag indicating that this is a STO_M68HC12_FAR or STO_M68HC12_INTERRUPT
597      function is stored by elfread.c in the high bit of the info field.
598      Use this to decide which instruction the function uses to return.  */
599   sym = lookup_minimal_symbol_by_pc (pc);
600   if (sym.minsym == 0)
601     return RETURN_RTS;
602 
603   if (MSYMBOL_IS_RTC (sym.minsym))
604     return RETURN_RTC;
605   else if (MSYMBOL_IS_RTI (sym.minsym))
606     return RETURN_RTI;
607   else
608     return RETURN_RTS;
609 }
610 
611 /* Analyze the function prologue to find some information
612    about the function:
613     - the PC of the first line (for m68hc11_skip_prologue)
614     - the offset of the previous frame saved address (from current frame)
615     - the soft registers which are pushed.  */
616 static CORE_ADDR
617 m68hc11_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
618 		       CORE_ADDR current_pc, struct m68hc11_unwind_cache *info)
619 {
620   LONGEST save_addr;
621   CORE_ADDR func_end;
622   int size;
623   int found_frame_point;
624   int saved_reg;
625   int done = 0;
626   struct insn_sequence *seq_table;
627 
628   info->size = 0;
629   info->sp_offset = 0;
630   if (pc >= current_pc)
631     return current_pc;
632 
633   size = 0;
634 
635   m68hc11_initialize_register_info ();
636   if (pc == 0)
637     {
638       info->size = 0;
639       return pc;
640     }
641 
642   m68gc11_gdbarch_tdep *tdep = gdbarch_tdep<m68gc11_gdbarch_tdep> (gdbarch);
643   seq_table = tdep->prologue;
644 
645   /* The 68hc11 stack is as follows:
646 
647 
648      |           |
649      +-----------+
650      |           |
651      | args      |
652      |           |
653      +-----------+
654      | PC-return |
655      +-----------+
656      | Old frame |
657      +-----------+
658      |           |
659      | Locals    |
660      |           |
661      +-----------+ <--- current frame
662      |           |
663 
664      With most processors (like 68K) the previous frame can be computed
665      easily because it is always at a fixed offset (see link/unlink).
666      That is, locals are accessed with negative offsets, arguments are
667      accessed with positive ones.  Since 68hc11 only supports offsets
668      in the range [0..255], the frame is defined at the bottom of
669      locals (see picture).
670 
671      The purpose of the analysis made here is to find out the size
672      of locals in this function.  An alternative to this is to use
673      DWARF2 info.  This would be better but I don't know how to
674      access dwarf2 debug from this function.
675 
676      Walk from the function entry point to the point where we save
677      the frame.  While walking instructions, compute the size of bytes
678      which are pushed.  This gives us the index to access the previous
679      frame.
680 
681      We limit the search to 128 bytes so that the algorithm is bounded
682      in case of random and wrong code.  We also stop and abort if
683      we find an instruction which is not supposed to appear in the
684      prologue (as generated by gcc 2.95, 2.96).  */
685 
686   func_end = pc + 128;
687   found_frame_point = 0;
688   info->size = 0;
689   save_addr = 0;
690   while (!done && pc + 2 < func_end)
691     {
692       struct insn_sequence *seq;
693       CORE_ADDR val;
694 
695       seq = m68hc11_analyze_instruction (gdbarch, seq_table, pc, &val);
696       if (seq == 0)
697 	break;
698 
699       /* If we are within the instruction group, we can't advance the
700 	 pc nor the stack offset.  Otherwise the caller's stack computed
701 	 from the current stack can be wrong.  */
702       if (pc + seq->length > current_pc)
703 	break;
704 
705       pc = pc + seq->length;
706       if (seq->type == P_SAVE_REG)
707 	{
708 	  if (found_frame_point)
709 	    {
710 	      saved_reg = m68hc11_which_soft_register (val);
711 	      if (saved_reg < 0)
712 		break;
713 
714 	      save_addr -= 2;
715 	      if (info->saved_regs)
716 		info->saved_regs[saved_reg].set_addr (save_addr);
717 	    }
718 	  else
719 	    {
720 	      size += 2;
721 	    }
722 	}
723       else if (seq->type == P_SET_FRAME)
724 	{
725 	  found_frame_point = 1;
726 	  info->size = size;
727 	}
728       else if (seq->type == P_LOCAL_1)
729 	{
730 	  size += 1;
731 	}
732       else if (seq->type == P_LOCAL_2)
733 	{
734 	  size += 2;
735 	}
736       else if (seq->type == P_LOCAL_N)
737 	{
738 	  /* Stack pointer is decremented for the allocation.  */
739 	  if (val & 0x8000)
740 	    size -= (int) (val) | 0xffff0000;
741 	  else
742 	    size -= val;
743 	}
744     }
745   if (found_frame_point == 0)
746     info->sp_offset = size;
747   else
748     info->sp_offset = -1;
749   return pc;
750 }
751 
752 static CORE_ADDR
753 m68hc11_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
754 {
755   CORE_ADDR func_addr, func_end;
756   struct symtab_and_line sal;
757   struct m68hc11_unwind_cache tmp_cache = { 0 };
758 
759   /* If we have line debugging information, then the end of the
760      prologue should be the first assembly instruction of the
761      first source line.  */
762   if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
763     {
764       sal = find_pc_line (func_addr, 0);
765       if (sal.end && sal.end < func_end)
766 	return sal.end;
767     }
768 
769   pc = m68hc11_scan_prologue (gdbarch, pc, (CORE_ADDR) -1, &tmp_cache);
770   return pc;
771 }
772 
773 /* Put here the code to store, into fi->saved_regs, the addresses of
774    the saved registers of frame described by FRAME_INFO.  This
775    includes special registers such as pc and fp saved in special ways
776    in the stack frame.  sp is even more special: the address we return
777    for it IS the sp for the next frame.  */
778 
779 static struct m68hc11_unwind_cache *
780 m68hc11_frame_unwind_cache (frame_info_ptr this_frame,
781 			    void **this_prologue_cache)
782 {
783   struct gdbarch *gdbarch = get_frame_arch (this_frame);
784   ULONGEST prev_sp;
785   ULONGEST this_base;
786   struct m68hc11_unwind_cache *info;
787   CORE_ADDR current_pc;
788   int i;
789 
790   if ((*this_prologue_cache))
791     return (struct m68hc11_unwind_cache *) (*this_prologue_cache);
792 
793   info = FRAME_OBSTACK_ZALLOC (struct m68hc11_unwind_cache);
794   (*this_prologue_cache) = info;
795   info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
796 
797   info->pc = get_frame_func (this_frame);
798 
799   info->size = 0;
800   info->return_kind = m68hc11_get_return_insn (info->pc);
801 
802   /* The SP was moved to the FP.  This indicates that a new frame
803      was created.  Get THIS frame's FP value by unwinding it from
804      the next frame.  */
805   this_base = get_frame_register_unsigned (this_frame, SOFT_FP_REGNUM);
806   if (this_base == 0)
807     {
808       info->base = 0;
809       return info;
810     }
811 
812   current_pc = get_frame_pc (this_frame);
813   if (info->pc != 0)
814     m68hc11_scan_prologue (gdbarch, info->pc, current_pc, info);
815 
816   info->saved_regs[HARD_PC_REGNUM].set_addr (info->size);
817 
818   if (info->sp_offset != (CORE_ADDR) -1)
819     {
820       info->saved_regs[HARD_PC_REGNUM].set_addr (info->sp_offset);
821       this_base = get_frame_register_unsigned (this_frame, HARD_SP_REGNUM);
822       prev_sp = this_base + info->sp_offset + 2;
823       this_base += stack_correction (gdbarch);
824     }
825   else
826     {
827       /* The FP points at the last saved register.  Adjust the FP back
828 	 to before the first saved register giving the SP.  */
829       prev_sp = this_base + info->size + 2;
830 
831       this_base += stack_correction (gdbarch);
832       if (soft_regs[SOFT_FP_REGNUM].name)
833 	info->saved_regs[SOFT_FP_REGNUM].set_addr (info->size - 2);
834    }
835 
836   if (info->return_kind == RETURN_RTC)
837     {
838       prev_sp += 1;
839       info->saved_regs[HARD_PAGE_REGNUM].set_addr (info->size);
840       info->saved_regs[HARD_PC_REGNUM].set_addr (info->size + 1);
841     }
842   else if (info->return_kind == RETURN_RTI)
843     {
844       prev_sp += 7;
845       info->saved_regs[HARD_CCR_REGNUM].set_addr (info->size);
846       info->saved_regs[HARD_D_REGNUM].set_addr (info->size + 1);
847       info->saved_regs[HARD_X_REGNUM].set_addr (info->size + 3);
848       info->saved_regs[HARD_Y_REGNUM].set_addr (info->size + 5);
849       info->saved_regs[HARD_PC_REGNUM].set_addr (info->size + 7);
850     }
851 
852   /* Add 1 here to adjust for the post-decrement nature of the push
853      instruction.  */
854   info->prev_sp = prev_sp;
855 
856   info->base = this_base;
857 
858   /* Adjust all the saved registers so that they contain addresses and not
859      offsets.  */
860   for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
861     if (info->saved_regs[i].is_addr ())
862       {
863 	info->saved_regs[i].set_addr (info->saved_regs[i].addr () + this_base);
864       }
865 
866   /* The previous frame's SP needed to be computed.  Save the computed
867      value.  */
868   info->saved_regs[HARD_SP_REGNUM].set_value (info->prev_sp);
869 
870   return info;
871 }
872 
873 /* Given a GDB frame, determine the address of the calling function's
874    frame.  This will be used to create a new GDB frame struct.  */
875 
876 static void
877 m68hc11_frame_this_id (frame_info_ptr this_frame,
878 		       void **this_prologue_cache,
879 		       struct frame_id *this_id)
880 {
881   struct m68hc11_unwind_cache *info
882     = m68hc11_frame_unwind_cache (this_frame, this_prologue_cache);
883   CORE_ADDR base;
884   CORE_ADDR func;
885   struct frame_id id;
886 
887   /* The FUNC is easy.  */
888   func = get_frame_func (this_frame);
889 
890   /* Hopefully the prologue analysis either correctly determined the
891      frame's base (which is the SP from the previous frame), or set
892      that base to "NULL".  */
893   base = info->prev_sp;
894   if (base == 0)
895     return;
896 
897   id = frame_id_build (base, func);
898   (*this_id) = id;
899 }
900 
901 static struct value *
902 m68hc11_frame_prev_register (frame_info_ptr this_frame,
903 			     void **this_prologue_cache, int regnum)
904 {
905   struct value *value;
906   struct m68hc11_unwind_cache *info
907     = m68hc11_frame_unwind_cache (this_frame, this_prologue_cache);
908 
909   value = trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
910 
911   /* Take into account the 68HC12 specific call (PC + page).  */
912   if (regnum == HARD_PC_REGNUM
913       && info->return_kind == RETURN_RTC
914       && use_page_register (get_frame_arch (this_frame)))
915     {
916       CORE_ADDR pc = value_as_long (value);
917       if (pc >= 0x08000 && pc < 0x0c000)
918 	{
919 	  CORE_ADDR page;
920 
921 	  release_value (value);
922 
923 	  value = trad_frame_get_prev_register (this_frame, info->saved_regs,
924 						HARD_PAGE_REGNUM);
925 	  page = value_as_long (value);
926 	  release_value (value);
927 
928 	  pc -= 0x08000;
929 	  pc += ((page & 0x0ff) << 14);
930 	  pc += 0x1000000;
931 
932 	  return frame_unwind_got_constant (this_frame, regnum, pc);
933 	}
934     }
935 
936   return value;
937 }
938 
939 static const struct frame_unwind m68hc11_frame_unwind = {
940   "m68hc11 prologue",
941   NORMAL_FRAME,
942   default_frame_unwind_stop_reason,
943   m68hc11_frame_this_id,
944   m68hc11_frame_prev_register,
945   NULL,
946   default_frame_sniffer
947 };
948 
949 static CORE_ADDR
950 m68hc11_frame_base_address (frame_info_ptr this_frame, void **this_cache)
951 {
952   struct m68hc11_unwind_cache *info
953     = m68hc11_frame_unwind_cache (this_frame, this_cache);
954 
955   return info->base;
956 }
957 
958 static CORE_ADDR
959 m68hc11_frame_args_address (frame_info_ptr this_frame, void **this_cache)
960 {
961   CORE_ADDR addr;
962   struct m68hc11_unwind_cache *info
963     = m68hc11_frame_unwind_cache (this_frame, this_cache);
964 
965   addr = info->base + info->size;
966   if (info->return_kind == RETURN_RTC)
967     addr += 1;
968   else if (info->return_kind == RETURN_RTI)
969     addr += 7;
970 
971   return addr;
972 }
973 
974 static const struct frame_base m68hc11_frame_base = {
975   &m68hc11_frame_unwind,
976   m68hc11_frame_base_address,
977   m68hc11_frame_base_address,
978   m68hc11_frame_args_address
979 };
980 
981 /* Assuming THIS_FRAME is a dummy, return the frame ID of that dummy
982    frame.  The frame ID's base needs to match the TOS value saved by
983    save_dummy_frame_tos(), and the PC match the dummy frame's breakpoint.  */
984 
985 static struct frame_id
986 m68hc11_dummy_id (struct gdbarch *gdbarch, frame_info_ptr this_frame)
987 {
988   ULONGEST tos;
989   CORE_ADDR pc = get_frame_pc (this_frame);
990 
991   tos = get_frame_register_unsigned (this_frame, SOFT_FP_REGNUM);
992   tos += 2;
993   return frame_id_build (tos, pc);
994 }
995 
996 
997 /* Get and print the register from the given frame.  */
998 static void
999 m68hc11_print_register (struct gdbarch *gdbarch, struct ui_file *file,
1000 			frame_info_ptr frame, int regno)
1001 {
1002   LONGEST rval;
1003 
1004   if (regno == HARD_PC_REGNUM || regno == HARD_SP_REGNUM
1005       || regno == SOFT_FP_REGNUM || regno == M68HC12_HARD_PC_REGNUM)
1006     rval = get_frame_register_unsigned (frame, regno);
1007   else
1008     rval = get_frame_register_signed (frame, regno);
1009 
1010   if (regno == HARD_A_REGNUM || regno == HARD_B_REGNUM
1011       || regno == HARD_CCR_REGNUM || regno == HARD_PAGE_REGNUM)
1012     {
1013       gdb_printf (file, "0x%02x   ", (unsigned char) rval);
1014       if (regno != HARD_CCR_REGNUM)
1015 	print_longest (file, 'd', 1, rval);
1016     }
1017   else
1018     {
1019       m68gc11_gdbarch_tdep *tdep
1020 	= gdbarch_tdep<m68gc11_gdbarch_tdep> (gdbarch);
1021 
1022       if (regno == HARD_PC_REGNUM && tdep->use_page_register)
1023 	{
1024 	  ULONGEST page;
1025 
1026 	  page = get_frame_register_unsigned (frame, HARD_PAGE_REGNUM);
1027 	  gdb_printf (file, "0x%02x:%04x ", (unsigned) page,
1028 		      (unsigned) rval);
1029 	}
1030       else
1031 	{
1032 	  gdb_printf (file, "0x%04x ", (unsigned) rval);
1033 	  if (regno != HARD_PC_REGNUM && regno != HARD_SP_REGNUM
1034 	      && regno != SOFT_FP_REGNUM && regno != M68HC12_HARD_PC_REGNUM)
1035 	    print_longest (file, 'd', 1, rval);
1036 	}
1037     }
1038 
1039   if (regno == HARD_CCR_REGNUM)
1040     {
1041       /* CCR register */
1042       int C, Z, N, V;
1043       unsigned char l = rval & 0xff;
1044 
1045       gdb_printf (file, "%c%c%c%c%c%c%c%c   ",
1046 		  l & M6811_S_BIT ? 'S' : '-',
1047 		  l & M6811_X_BIT ? 'X' : '-',
1048 		  l & M6811_H_BIT ? 'H' : '-',
1049 		  l & M6811_I_BIT ? 'I' : '-',
1050 		  l & M6811_N_BIT ? 'N' : '-',
1051 		  l & M6811_Z_BIT ? 'Z' : '-',
1052 		  l & M6811_V_BIT ? 'V' : '-',
1053 		  l & M6811_C_BIT ? 'C' : '-');
1054       N = (l & M6811_N_BIT) != 0;
1055       Z = (l & M6811_Z_BIT) != 0;
1056       V = (l & M6811_V_BIT) != 0;
1057       C = (l & M6811_C_BIT) != 0;
1058 
1059       /* Print flags following the h8300.  */
1060       if ((C | Z) == 0)
1061 	gdb_printf (file, "u> ");
1062       else if ((C | Z) == 1)
1063 	gdb_printf (file, "u<= ");
1064       else if (C == 0)
1065 	gdb_printf (file, "u< ");
1066 
1067       if (Z == 0)
1068 	gdb_printf (file, "!= ");
1069       else
1070 	gdb_printf (file, "== ");
1071 
1072       if ((N ^ V) == 0)
1073 	gdb_printf (file, ">= ");
1074       else
1075 	gdb_printf (file, "< ");
1076 
1077       if ((Z | (N ^ V)) == 0)
1078 	gdb_printf (file, "> ");
1079       else
1080 	gdb_printf (file, "<= ");
1081     }
1082 }
1083 
1084 /* Same as 'info reg' but prints the registers in a different way.  */
1085 static void
1086 m68hc11_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
1087 			      frame_info_ptr frame, int regno, int cpregs)
1088 {
1089   if (regno >= 0)
1090     {
1091       const char *name = gdbarch_register_name (gdbarch, regno);
1092 
1093       if (*name == '\0')
1094 	return;
1095 
1096       gdb_printf (file, "%-10s ", name);
1097       m68hc11_print_register (gdbarch, file, frame, regno);
1098       gdb_printf (file, "\n");
1099     }
1100   else
1101     {
1102       int i, nr;
1103 
1104       gdb_printf (file, "PC=");
1105       m68hc11_print_register (gdbarch, file, frame, HARD_PC_REGNUM);
1106 
1107       gdb_printf (file, " SP=");
1108       m68hc11_print_register (gdbarch, file, frame, HARD_SP_REGNUM);
1109 
1110       gdb_printf (file, " FP=");
1111       m68hc11_print_register (gdbarch, file, frame, SOFT_FP_REGNUM);
1112 
1113       gdb_printf (file, "\nCCR=");
1114       m68hc11_print_register (gdbarch, file, frame, HARD_CCR_REGNUM);
1115 
1116       gdb_printf (file, "\nD=");
1117       m68hc11_print_register (gdbarch, file, frame, HARD_D_REGNUM);
1118 
1119       gdb_printf (file, " X=");
1120       m68hc11_print_register (gdbarch, file, frame, HARD_X_REGNUM);
1121 
1122       gdb_printf (file, " Y=");
1123       m68hc11_print_register (gdbarch, file, frame, HARD_Y_REGNUM);
1124 
1125       m68gc11_gdbarch_tdep *tdep = gdbarch_tdep<m68gc11_gdbarch_tdep> (gdbarch);
1126 
1127       if (tdep->use_page_register)
1128 	{
1129 	  gdb_printf (file, "\nPage=");
1130 	  m68hc11_print_register (gdbarch, file, frame, HARD_PAGE_REGNUM);
1131 	}
1132       gdb_printf (file, "\n");
1133 
1134       nr = 0;
1135       for (i = SOFT_D1_REGNUM; i < M68HC11_ALL_REGS; i++)
1136 	{
1137 	  /* Skip registers which are not defined in the symbol table.  */
1138 	  if (soft_regs[i].name == 0)
1139 	    continue;
1140 
1141 	  gdb_printf (file, "D%d=", i - SOFT_D1_REGNUM + 1);
1142 	  m68hc11_print_register (gdbarch, file, frame, i);
1143 	  nr++;
1144 	  if ((nr % 8) == 7)
1145 	    gdb_printf (file, "\n");
1146 	  else
1147 	    gdb_printf (file, " ");
1148 	}
1149       if (nr && (nr % 8) != 7)
1150 	gdb_printf (file, "\n");
1151     }
1152 }
1153 
1154 static CORE_ADDR
1155 m68hc11_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
1156 			 struct regcache *regcache, CORE_ADDR bp_addr,
1157 			 int nargs, struct value **args, CORE_ADDR sp,
1158 			 function_call_return_method return_method,
1159 			 CORE_ADDR struct_addr)
1160 {
1161   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1162   int argnum;
1163   int first_stack_argnum;
1164   struct type *type;
1165   const gdb_byte *val;
1166   gdb_byte buf[2];
1167 
1168   first_stack_argnum = 0;
1169   if (return_method == return_method_struct)
1170     regcache_cooked_write_unsigned (regcache, HARD_D_REGNUM, struct_addr);
1171   else if (nargs > 0)
1172     {
1173       type = value_type (args[0]);
1174 
1175       /* First argument is passed in D and X registers.  */
1176       if (type->length () <= 4)
1177 	{
1178 	  ULONGEST v;
1179 
1180 	  v = extract_unsigned_integer (value_contents (args[0]).data (),
1181 					type->length (), byte_order);
1182 	  first_stack_argnum = 1;
1183 
1184 	  regcache_cooked_write_unsigned (regcache, HARD_D_REGNUM, v);
1185 	  if (type->length () > 2)
1186 	    {
1187 	      v >>= 16;
1188 	      regcache_cooked_write_unsigned (regcache, HARD_X_REGNUM, v);
1189 	    }
1190 	}
1191     }
1192 
1193   for (argnum = nargs - 1; argnum >= first_stack_argnum; argnum--)
1194     {
1195       type = value_type (args[argnum]);
1196 
1197       if (type->length () & 1)
1198 	{
1199 	  static gdb_byte zero = 0;
1200 
1201 	  sp--;
1202 	  write_memory (sp, &zero, 1);
1203 	}
1204       val = value_contents (args[argnum]).data ();
1205       sp -= type->length ();
1206       write_memory (sp, val, type->length ());
1207     }
1208 
1209   /* Store return address.  */
1210   sp -= 2;
1211   store_unsigned_integer (buf, 2, byte_order, bp_addr);
1212   write_memory (sp, buf, 2);
1213 
1214   /* Finally, update the stack pointer...  */
1215   sp -= stack_correction (gdbarch);
1216   regcache_cooked_write_unsigned (regcache, HARD_SP_REGNUM, sp);
1217 
1218   /* ...and fake a frame pointer.  */
1219   regcache_cooked_write_unsigned (regcache, SOFT_FP_REGNUM, sp);
1220 
1221   /* DWARF2/GCC uses the stack address *before* the function call as a
1222      frame's CFA.  */
1223   return sp + 2;
1224 }
1225 
1226 
1227 /* Return the GDB type object for the "standard" data type
1228    of data in register N.  */
1229 
1230 static struct type *
1231 m68hc11_register_type (struct gdbarch *gdbarch, int reg_nr)
1232 {
1233   switch (reg_nr)
1234     {
1235     case HARD_PAGE_REGNUM:
1236     case HARD_A_REGNUM:
1237     case HARD_B_REGNUM:
1238     case HARD_CCR_REGNUM:
1239       return builtin_type (gdbarch)->builtin_uint8;
1240 
1241     case M68HC12_HARD_PC_REGNUM:
1242       return builtin_type (gdbarch)->builtin_uint32;
1243 
1244     default:
1245       return builtin_type (gdbarch)->builtin_uint16;
1246     }
1247 }
1248 
1249 static void
1250 m68hc11_store_return_value (struct type *type, struct regcache *regcache,
1251 			    const gdb_byte *valbuf)
1252 {
1253   int len;
1254 
1255   len = type->length ();
1256 
1257   /* First argument is passed in D and X registers.  */
1258   if (len <= 2)
1259     regcache->raw_write_part (HARD_D_REGNUM, 2 - len, len, valbuf);
1260   else if (len <= 4)
1261     {
1262       regcache->raw_write_part (HARD_X_REGNUM, 4 - len, len - 2, valbuf);
1263       regcache->raw_write (HARD_D_REGNUM, valbuf + (len - 2));
1264     }
1265   else
1266     error (_("return of value > 4 is not supported."));
1267 }
1268 
1269 
1270 /* Given a return value in `regcache' with a type `type',
1271    extract and copy its value into `valbuf'.  */
1272 
1273 static void
1274 m68hc11_extract_return_value (struct type *type, struct regcache *regcache,
1275 			      void *valbuf)
1276 {
1277   gdb_byte buf[M68HC11_REG_SIZE];
1278 
1279   regcache->raw_read (HARD_D_REGNUM, buf);
1280   switch (type->length ())
1281     {
1282     case 1:
1283       memcpy (valbuf, buf + 1, 1);
1284       break;
1285 
1286     case 2:
1287       memcpy (valbuf, buf, 2);
1288       break;
1289 
1290     case 3:
1291       memcpy ((char*) valbuf + 1, buf, 2);
1292       regcache->raw_read (HARD_X_REGNUM, buf);
1293       memcpy (valbuf, buf + 1, 1);
1294       break;
1295 
1296     case 4:
1297       memcpy ((char*) valbuf + 2, buf, 2);
1298       regcache->raw_read (HARD_X_REGNUM, buf);
1299       memcpy (valbuf, buf, 2);
1300       break;
1301 
1302     default:
1303       error (_("bad size for return value"));
1304     }
1305 }
1306 
1307 static enum return_value_convention
1308 m68hc11_return_value (struct gdbarch *gdbarch, struct value *function,
1309 		      struct type *valtype, struct regcache *regcache,
1310 		      gdb_byte *readbuf, const gdb_byte *writebuf)
1311 {
1312   if (valtype->code () == TYPE_CODE_STRUCT
1313       || valtype->code () == TYPE_CODE_UNION
1314       || valtype->code () == TYPE_CODE_ARRAY
1315       || valtype->length () > 4)
1316     return RETURN_VALUE_STRUCT_CONVENTION;
1317   else
1318     {
1319       if (readbuf != NULL)
1320 	m68hc11_extract_return_value (valtype, regcache, readbuf);
1321       if (writebuf != NULL)
1322 	m68hc11_store_return_value (valtype, regcache, writebuf);
1323       return RETURN_VALUE_REGISTER_CONVENTION;
1324     }
1325 }
1326 
1327 /* Test whether the ELF symbol corresponds to a function using rtc or
1328    rti to return.  */
1329 
1330 static void
1331 m68hc11_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
1332 {
1333   unsigned char flags;
1334 
1335   flags = ((elf_symbol_type *)sym)->internal_elf_sym.st_other;
1336   if (flags & STO_M68HC12_FAR)
1337     MSYMBOL_SET_RTC (msym);
1338   if (flags & STO_M68HC12_INTERRUPT)
1339     MSYMBOL_SET_RTI (msym);
1340 }
1341 
1342 
1343 /* 68HC11/68HC12 register groups.
1344    Identify real hard registers and soft registers used by gcc.  */
1345 
1346 static const reggroup *m68hc11_soft_reggroup;
1347 static const reggroup *m68hc11_hard_reggroup;
1348 
1349 static void
1350 m68hc11_init_reggroups (void)
1351 {
1352   m68hc11_hard_reggroup = reggroup_new ("hard", USER_REGGROUP);
1353   m68hc11_soft_reggroup = reggroup_new ("soft", USER_REGGROUP);
1354 }
1355 
1356 static void
1357 m68hc11_add_reggroups (struct gdbarch *gdbarch)
1358 {
1359   reggroup_add (gdbarch, m68hc11_hard_reggroup);
1360   reggroup_add (gdbarch, m68hc11_soft_reggroup);
1361 }
1362 
1363 static int
1364 m68hc11_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
1365 			     const struct reggroup *group)
1366 {
1367   /* We must save the real hard register as well as gcc
1368      soft registers including the frame pointer.  */
1369   if (group == save_reggroup || group == restore_reggroup)
1370     {
1371       return (regnum <= gdbarch_num_regs (gdbarch)
1372 	      || ((regnum == SOFT_FP_REGNUM
1373 		   || regnum == SOFT_TMP_REGNUM
1374 		   || regnum == SOFT_ZS_REGNUM
1375 		   || regnum == SOFT_XY_REGNUM)
1376 		  && m68hc11_register_name (gdbarch, regnum)));
1377     }
1378 
1379   /* Group to identify gcc soft registers (d1..dN).  */
1380   if (group == m68hc11_soft_reggroup)
1381     {
1382       return regnum >= SOFT_D1_REGNUM
1383 	     && m68hc11_register_name (gdbarch, regnum);
1384     }
1385 
1386   if (group == m68hc11_hard_reggroup)
1387     {
1388       return regnum == HARD_PC_REGNUM || regnum == HARD_SP_REGNUM
1389 	|| regnum == HARD_X_REGNUM || regnum == HARD_D_REGNUM
1390 	|| regnum == HARD_Y_REGNUM || regnum == HARD_CCR_REGNUM;
1391     }
1392   return default_register_reggroup_p (gdbarch, regnum, group);
1393 }
1394 
1395 static struct gdbarch *
1396 m68hc11_gdbarch_init (struct gdbarch_info info,
1397 		      struct gdbarch_list *arches)
1398 {
1399   struct gdbarch *gdbarch;
1400   int elf_flags;
1401 
1402   soft_reg_initialized = 0;
1403 
1404   /* Extract the elf_flags if available.  */
1405   if (info.abfd != NULL
1406       && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
1407     elf_flags = elf_elfheader (info.abfd)->e_flags;
1408   else
1409     elf_flags = 0;
1410 
1411   /* Try to find a pre-existing architecture.  */
1412   for (arches = gdbarch_list_lookup_by_info (arches, &info);
1413        arches != NULL;
1414        arches = gdbarch_list_lookup_by_info (arches->next, &info))
1415     {
1416       m68gc11_gdbarch_tdep *tdep
1417 	= gdbarch_tdep<m68gc11_gdbarch_tdep> (arches->gdbarch);
1418 
1419       if (tdep->elf_flags != elf_flags)
1420 	continue;
1421 
1422       return arches->gdbarch;
1423     }
1424 
1425   /* Need a new architecture.  Fill in a target specific vector.  */
1426   m68gc11_gdbarch_tdep *tdep = new m68gc11_gdbarch_tdep;
1427   gdbarch = gdbarch_alloc (&info, tdep);
1428   tdep->elf_flags = elf_flags;
1429 
1430   switch (info.bfd_arch_info->arch)
1431     {
1432     case bfd_arch_m68hc11:
1433       tdep->stack_correction = 1;
1434       tdep->use_page_register = 0;
1435       tdep->prologue = m6811_prologue;
1436       set_gdbarch_addr_bit (gdbarch, 16);
1437       set_gdbarch_num_pseudo_regs (gdbarch, M68HC11_NUM_PSEUDO_REGS);
1438       set_gdbarch_pc_regnum (gdbarch, HARD_PC_REGNUM);
1439       set_gdbarch_num_regs (gdbarch, M68HC11_NUM_REGS);
1440       break;
1441 
1442     case bfd_arch_m68hc12:
1443       tdep->stack_correction = 0;
1444       tdep->use_page_register = elf_flags & E_M68HC12_BANKS;
1445       tdep->prologue = m6812_prologue;
1446       set_gdbarch_addr_bit (gdbarch, elf_flags & E_M68HC12_BANKS ? 32 : 16);
1447       set_gdbarch_num_pseudo_regs (gdbarch,
1448 				   elf_flags & E_M68HC12_BANKS
1449 				   ? M68HC12_NUM_PSEUDO_REGS
1450 				   : M68HC11_NUM_PSEUDO_REGS);
1451       set_gdbarch_pc_regnum (gdbarch, elf_flags & E_M68HC12_BANKS
1452 			     ? M68HC12_HARD_PC_REGNUM : HARD_PC_REGNUM);
1453       set_gdbarch_num_regs (gdbarch, elf_flags & E_M68HC12_BANKS
1454 			    ? M68HC12_NUM_REGS : M68HC11_NUM_REGS);
1455       break;
1456 
1457     default:
1458       break;
1459     }
1460 
1461   /* Initially set everything according to the ABI.
1462      Use 16-bit integers since it will be the case for most
1463      programs.  The size of these types should normally be set
1464      according to the dwarf2 debug information.  */
1465   set_gdbarch_short_bit (gdbarch, 16);
1466   set_gdbarch_int_bit (gdbarch, elf_flags & E_M68HC11_I32 ? 32 : 16);
1467   set_gdbarch_float_bit (gdbarch, 32);
1468   if (elf_flags & E_M68HC11_F64)
1469     {
1470       set_gdbarch_double_bit (gdbarch, 64);
1471       set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
1472     }
1473   else
1474     {
1475       set_gdbarch_double_bit (gdbarch, 32);
1476       set_gdbarch_double_format (gdbarch, floatformats_ieee_single);
1477     }
1478   set_gdbarch_long_double_bit (gdbarch, 64);
1479   set_gdbarch_long_bit (gdbarch, 32);
1480   set_gdbarch_ptr_bit (gdbarch, 16);
1481   set_gdbarch_long_long_bit (gdbarch, 64);
1482 
1483   /* Characters are unsigned.  */
1484   set_gdbarch_char_signed (gdbarch, 0);
1485 
1486   /* Set register info.  */
1487   set_gdbarch_fp0_regnum (gdbarch, -1);
1488 
1489   set_gdbarch_sp_regnum (gdbarch, HARD_SP_REGNUM);
1490   set_gdbarch_register_name (gdbarch, m68hc11_register_name);
1491   set_gdbarch_register_type (gdbarch, m68hc11_register_type);
1492   set_gdbarch_pseudo_register_read (gdbarch, m68hc11_pseudo_register_read);
1493   set_gdbarch_pseudo_register_write (gdbarch, m68hc11_pseudo_register_write);
1494 
1495   set_gdbarch_push_dummy_call (gdbarch, m68hc11_push_dummy_call);
1496 
1497   set_gdbarch_return_value (gdbarch, m68hc11_return_value);
1498   set_gdbarch_skip_prologue (gdbarch, m68hc11_skip_prologue);
1499   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1500   set_gdbarch_breakpoint_kind_from_pc (gdbarch,
1501 				       m68hc11_breakpoint::kind_from_pc);
1502   set_gdbarch_sw_breakpoint_from_kind (gdbarch,
1503 				       m68hc11_breakpoint::bp_from_kind);
1504 
1505   m68hc11_add_reggroups (gdbarch);
1506   set_gdbarch_register_reggroup_p (gdbarch, m68hc11_register_reggroup_p);
1507   set_gdbarch_print_registers_info (gdbarch, m68hc11_print_registers_info);
1508 
1509   /* Hook in the DWARF CFI frame unwinder.  */
1510   dwarf2_append_unwinders (gdbarch);
1511 
1512   frame_unwind_append_unwinder (gdbarch, &m68hc11_frame_unwind);
1513   frame_base_set_default (gdbarch, &m68hc11_frame_base);
1514 
1515   /* Methods for saving / extracting a dummy frame's ID.  The ID's
1516      stack address must match the SP value returned by
1517      PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos.  */
1518   set_gdbarch_dummy_id (gdbarch, m68hc11_dummy_id);
1519 
1520   /* Minsymbol frobbing.  */
1521   set_gdbarch_elf_make_msymbol_special (gdbarch,
1522 					m68hc11_elf_make_msymbol_special);
1523 
1524   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
1525 
1526   return gdbarch;
1527 }
1528 
1529 void _initialize_m68hc11_tdep ();
1530 void
1531 _initialize_m68hc11_tdep ()
1532 {
1533   gdbarch_register (bfd_arch_m68hc11, m68hc11_gdbarch_init);
1534   gdbarch_register (bfd_arch_m68hc12, m68hc11_gdbarch_init);
1535   m68hc11_init_reggroups ();
1536 }
1537 
1538