]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/m68hc11-tdep.c
gdb: remove TYPE_LENGTH
[thirdparty/binutils-gdb.git] / gdb / m68hc11-tdep.c
1 /* Target-dependent code for Motorola 68HC11 & 68HC12
2
3 Copyright (C) 1999-2022 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 < 0)
393 return NULL;
394
395 if (reg_nr >= M68HC11_ALL_REGS)
396 return NULL;
397
398 m68hc11_initialize_register_info ();
399
400 /* If we don't know the address of a soft register, pretend it
401 does not exist. */
402 if (reg_nr > M68HC11_LAST_HARD_REG && soft_regs[reg_nr].name == 0)
403 return NULL;
404
405 return m68hc11_register_names[reg_nr];
406 }
407
408 constexpr gdb_byte m68hc11_break_insn[] = {0x0};
409
410 typedef BP_MANIPULATION (m68hc11_break_insn) m68hc11_breakpoint;
411 \f
412 /* 68HC11 & 68HC12 prologue analysis. */
413
414 #define MAX_CODES 12
415
416 /* 68HC11 opcodes. */
417 #undef M6811_OP_PAGE2
418 #define M6811_OP_PAGE2 (0x18)
419 #define M6811_OP_LDX (0xde)
420 #define M6811_OP_LDX_EXT (0xfe)
421 #define M6811_OP_PSHX (0x3c)
422 #define M6811_OP_STS (0x9f)
423 #define M6811_OP_STS_EXT (0xbf)
424 #define M6811_OP_TSX (0x30)
425 #define M6811_OP_XGDX (0x8f)
426 #define M6811_OP_ADDD (0xc3)
427 #define M6811_OP_TXS (0x35)
428 #define M6811_OP_DES (0x34)
429
430 /* 68HC12 opcodes. */
431 #define M6812_OP_PAGE2 (0x18)
432 #define M6812_OP_MOVW (0x01)
433 #define M6812_PB_PSHW (0xae)
434 #define M6812_OP_STS (0x5f)
435 #define M6812_OP_STS_EXT (0x7f)
436 #define M6812_OP_LEAS (0x1b)
437 #define M6812_OP_PSHX (0x34)
438 #define M6812_OP_PSHY (0x35)
439
440 /* Operand extraction. */
441 #define OP_DIRECT (0x100) /* 8-byte direct addressing. */
442 #define OP_IMM_LOW (0x200) /* Low part of 16-bit constant/address. */
443 #define OP_IMM_HIGH (0x300) /* High part of 16-bit constant/address. */
444 #define OP_PBYTE (0x400) /* 68HC12 indexed operand. */
445
446 /* Identification of the sequence. */
447 enum m6811_seq_type
448 {
449 P_LAST = 0,
450 P_SAVE_REG, /* Save a register on the stack. */
451 P_SET_FRAME, /* Setup the frame pointer. */
452 P_LOCAL_1, /* Allocate 1 byte for locals. */
453 P_LOCAL_2, /* Allocate 2 bytes for locals. */
454 P_LOCAL_N /* Allocate N bytes for locals. */
455 };
456
457 struct insn_sequence {
458 enum m6811_seq_type type;
459 unsigned length;
460 unsigned short code[MAX_CODES];
461 };
462
463 /* Sequence of instructions in the 68HC11 function prologue. */
464 static struct insn_sequence m6811_prologue[] = {
465 /* Sequences to save a soft-register. */
466 { P_SAVE_REG, 3, { M6811_OP_LDX, OP_DIRECT,
467 M6811_OP_PSHX } },
468 { P_SAVE_REG, 5, { M6811_OP_PAGE2, M6811_OP_LDX, OP_DIRECT,
469 M6811_OP_PAGE2, M6811_OP_PSHX } },
470 { P_SAVE_REG, 4, { M6811_OP_LDX_EXT, OP_IMM_HIGH, OP_IMM_LOW,
471 M6811_OP_PSHX } },
472 { P_SAVE_REG, 6, { M6811_OP_PAGE2, M6811_OP_LDX_EXT, OP_IMM_HIGH, OP_IMM_LOW,
473 M6811_OP_PAGE2, M6811_OP_PSHX } },
474
475 /* Sequences to allocate local variables. */
476 { P_LOCAL_N, 7, { M6811_OP_TSX,
477 M6811_OP_XGDX,
478 M6811_OP_ADDD, OP_IMM_HIGH, OP_IMM_LOW,
479 M6811_OP_XGDX,
480 M6811_OP_TXS } },
481 { P_LOCAL_N, 11, { M6811_OP_PAGE2, M6811_OP_TSX,
482 M6811_OP_PAGE2, M6811_OP_XGDX,
483 M6811_OP_ADDD, OP_IMM_HIGH, OP_IMM_LOW,
484 M6811_OP_PAGE2, M6811_OP_XGDX,
485 M6811_OP_PAGE2, M6811_OP_TXS } },
486 { P_LOCAL_1, 1, { M6811_OP_DES } },
487 { P_LOCAL_2, 1, { M6811_OP_PSHX } },
488 { P_LOCAL_2, 2, { M6811_OP_PAGE2, M6811_OP_PSHX } },
489
490 /* Initialize the frame pointer. */
491 { P_SET_FRAME, 2, { M6811_OP_STS, OP_DIRECT } },
492 { P_SET_FRAME, 3, { M6811_OP_STS_EXT, OP_IMM_HIGH, OP_IMM_LOW } },
493 { P_LAST, 0, { 0 } }
494 };
495
496
497 /* Sequence of instructions in the 68HC12 function prologue. */
498 static struct insn_sequence m6812_prologue[] = {
499 { P_SAVE_REG, 5, { M6812_OP_PAGE2, M6812_OP_MOVW, M6812_PB_PSHW,
500 OP_IMM_HIGH, OP_IMM_LOW } },
501 { P_SET_FRAME, 2, { M6812_OP_STS, OP_DIRECT } },
502 { P_SET_FRAME, 3, { M6812_OP_STS_EXT, OP_IMM_HIGH, OP_IMM_LOW } },
503 { P_LOCAL_N, 2, { M6812_OP_LEAS, OP_PBYTE } },
504 { P_LOCAL_2, 1, { M6812_OP_PSHX } },
505 { P_LOCAL_2, 1, { M6812_OP_PSHY } },
506 { P_LAST, 0 }
507 };
508
509
510 /* Analyze the sequence of instructions starting at the given address.
511 Returns a pointer to the sequence when it is recognized and
512 the optional value (constant/address) associated with it. */
513 static struct insn_sequence *
514 m68hc11_analyze_instruction (struct gdbarch *gdbarch,
515 struct insn_sequence *seq, CORE_ADDR pc,
516 CORE_ADDR *val)
517 {
518 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
519 unsigned char buffer[MAX_CODES];
520 unsigned bufsize;
521 unsigned j;
522 CORE_ADDR cur_val;
523 short v = 0;
524
525 bufsize = 0;
526 for (; seq->type != P_LAST; seq++)
527 {
528 cur_val = 0;
529 for (j = 0; j < seq->length; j++)
530 {
531 if (bufsize < j + 1)
532 {
533 buffer[bufsize] = read_memory_unsigned_integer (pc + bufsize,
534 1, byte_order);
535 bufsize++;
536 }
537 /* Continue while we match the opcode. */
538 if (seq->code[j] == buffer[j])
539 continue;
540
541 if ((seq->code[j] & 0xf00) == 0)
542 break;
543
544 /* Extract a sequence parameter (address or constant). */
545 switch (seq->code[j])
546 {
547 case OP_DIRECT:
548 cur_val = (CORE_ADDR) buffer[j];
549 break;
550
551 case OP_IMM_HIGH:
552 cur_val = cur_val & 0x0ff;
553 cur_val |= (buffer[j] << 8);
554 break;
555
556 case OP_IMM_LOW:
557 cur_val &= 0x0ff00;
558 cur_val |= buffer[j];
559 break;
560
561 case OP_PBYTE:
562 if ((buffer[j] & 0xE0) == 0x80)
563 {
564 v = buffer[j] & 0x1f;
565 if (v & 0x10)
566 v |= 0xfff0;
567 }
568 else if ((buffer[j] & 0xfe) == 0xf0)
569 {
570 v = read_memory_unsigned_integer (pc + j + 1, 1, byte_order);
571 if (buffer[j] & 1)
572 v |= 0xff00;
573 }
574 else if (buffer[j] == 0xf2)
575 {
576 v = read_memory_unsigned_integer (pc + j + 1, 2, byte_order);
577 }
578 cur_val = v;
579 break;
580 }
581 }
582
583 /* We have a full match. */
584 if (j == seq->length)
585 {
586 *val = cur_val;
587 return seq;
588 }
589 }
590 return 0;
591 }
592
593 /* Return the instruction that the function at the PC is using. */
594 static enum insn_return_kind
595 m68hc11_get_return_insn (CORE_ADDR pc)
596 {
597 struct bound_minimal_symbol sym;
598
599 /* A flag indicating that this is a STO_M68HC12_FAR or STO_M68HC12_INTERRUPT
600 function is stored by elfread.c in the high bit of the info field.
601 Use this to decide which instruction the function uses to return. */
602 sym = lookup_minimal_symbol_by_pc (pc);
603 if (sym.minsym == 0)
604 return RETURN_RTS;
605
606 if (MSYMBOL_IS_RTC (sym.minsym))
607 return RETURN_RTC;
608 else if (MSYMBOL_IS_RTI (sym.minsym))
609 return RETURN_RTI;
610 else
611 return RETURN_RTS;
612 }
613
614 /* Analyze the function prologue to find some information
615 about the function:
616 - the PC of the first line (for m68hc11_skip_prologue)
617 - the offset of the previous frame saved address (from current frame)
618 - the soft registers which are pushed. */
619 static CORE_ADDR
620 m68hc11_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
621 CORE_ADDR current_pc, struct m68hc11_unwind_cache *info)
622 {
623 LONGEST save_addr;
624 CORE_ADDR func_end;
625 int size;
626 int found_frame_point;
627 int saved_reg;
628 int done = 0;
629 struct insn_sequence *seq_table;
630
631 info->size = 0;
632 info->sp_offset = 0;
633 if (pc >= current_pc)
634 return current_pc;
635
636 size = 0;
637
638 m68hc11_initialize_register_info ();
639 if (pc == 0)
640 {
641 info->size = 0;
642 return pc;
643 }
644
645 m68gc11_gdbarch_tdep *tdep = gdbarch_tdep<m68gc11_gdbarch_tdep> (gdbarch);
646 seq_table = tdep->prologue;
647
648 /* The 68hc11 stack is as follows:
649
650
651 | |
652 +-----------+
653 | |
654 | args |
655 | |
656 +-----------+
657 | PC-return |
658 +-----------+
659 | Old frame |
660 +-----------+
661 | |
662 | Locals |
663 | |
664 +-----------+ <--- current frame
665 | |
666
667 With most processors (like 68K) the previous frame can be computed
668 easily because it is always at a fixed offset (see link/unlink).
669 That is, locals are accessed with negative offsets, arguments are
670 accessed with positive ones. Since 68hc11 only supports offsets
671 in the range [0..255], the frame is defined at the bottom of
672 locals (see picture).
673
674 The purpose of the analysis made here is to find out the size
675 of locals in this function. An alternative to this is to use
676 DWARF2 info. This would be better but I don't know how to
677 access dwarf2 debug from this function.
678
679 Walk from the function entry point to the point where we save
680 the frame. While walking instructions, compute the size of bytes
681 which are pushed. This gives us the index to access the previous
682 frame.
683
684 We limit the search to 128 bytes so that the algorithm is bounded
685 in case of random and wrong code. We also stop and abort if
686 we find an instruction which is not supposed to appear in the
687 prologue (as generated by gcc 2.95, 2.96). */
688
689 func_end = pc + 128;
690 found_frame_point = 0;
691 info->size = 0;
692 save_addr = 0;
693 while (!done && pc + 2 < func_end)
694 {
695 struct insn_sequence *seq;
696 CORE_ADDR val;
697
698 seq = m68hc11_analyze_instruction (gdbarch, seq_table, pc, &val);
699 if (seq == 0)
700 break;
701
702 /* If we are within the instruction group, we can't advance the
703 pc nor the stack offset. Otherwise the caller's stack computed
704 from the current stack can be wrong. */
705 if (pc + seq->length > current_pc)
706 break;
707
708 pc = pc + seq->length;
709 if (seq->type == P_SAVE_REG)
710 {
711 if (found_frame_point)
712 {
713 saved_reg = m68hc11_which_soft_register (val);
714 if (saved_reg < 0)
715 break;
716
717 save_addr -= 2;
718 if (info->saved_regs)
719 info->saved_regs[saved_reg].set_addr (save_addr);
720 }
721 else
722 {
723 size += 2;
724 }
725 }
726 else if (seq->type == P_SET_FRAME)
727 {
728 found_frame_point = 1;
729 info->size = size;
730 }
731 else if (seq->type == P_LOCAL_1)
732 {
733 size += 1;
734 }
735 else if (seq->type == P_LOCAL_2)
736 {
737 size += 2;
738 }
739 else if (seq->type == P_LOCAL_N)
740 {
741 /* Stack pointer is decremented for the allocation. */
742 if (val & 0x8000)
743 size -= (int) (val) | 0xffff0000;
744 else
745 size -= val;
746 }
747 }
748 if (found_frame_point == 0)
749 info->sp_offset = size;
750 else
751 info->sp_offset = -1;
752 return pc;
753 }
754
755 static CORE_ADDR
756 m68hc11_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
757 {
758 CORE_ADDR func_addr, func_end;
759 struct symtab_and_line sal;
760 struct m68hc11_unwind_cache tmp_cache = { 0 };
761
762 /* If we have line debugging information, then the end of the
763 prologue should be the first assembly instruction of the
764 first source line. */
765 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
766 {
767 sal = find_pc_line (func_addr, 0);
768 if (sal.end && sal.end < func_end)
769 return sal.end;
770 }
771
772 pc = m68hc11_scan_prologue (gdbarch, pc, (CORE_ADDR) -1, &tmp_cache);
773 return pc;
774 }
775
776 /* Put here the code to store, into fi->saved_regs, the addresses of
777 the saved registers of frame described by FRAME_INFO. This
778 includes special registers such as pc and fp saved in special ways
779 in the stack frame. sp is even more special: the address we return
780 for it IS the sp for the next frame. */
781
782 static struct m68hc11_unwind_cache *
783 m68hc11_frame_unwind_cache (struct frame_info *this_frame,
784 void **this_prologue_cache)
785 {
786 struct gdbarch *gdbarch = get_frame_arch (this_frame);
787 ULONGEST prev_sp;
788 ULONGEST this_base;
789 struct m68hc11_unwind_cache *info;
790 CORE_ADDR current_pc;
791 int i;
792
793 if ((*this_prologue_cache))
794 return (struct m68hc11_unwind_cache *) (*this_prologue_cache);
795
796 info = FRAME_OBSTACK_ZALLOC (struct m68hc11_unwind_cache);
797 (*this_prologue_cache) = info;
798 info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
799
800 info->pc = get_frame_func (this_frame);
801
802 info->size = 0;
803 info->return_kind = m68hc11_get_return_insn (info->pc);
804
805 /* The SP was moved to the FP. This indicates that a new frame
806 was created. Get THIS frame's FP value by unwinding it from
807 the next frame. */
808 this_base = get_frame_register_unsigned (this_frame, SOFT_FP_REGNUM);
809 if (this_base == 0)
810 {
811 info->base = 0;
812 return info;
813 }
814
815 current_pc = get_frame_pc (this_frame);
816 if (info->pc != 0)
817 m68hc11_scan_prologue (gdbarch, info->pc, current_pc, info);
818
819 info->saved_regs[HARD_PC_REGNUM].set_addr (info->size);
820
821 if (info->sp_offset != (CORE_ADDR) -1)
822 {
823 info->saved_regs[HARD_PC_REGNUM].set_addr (info->sp_offset);
824 this_base = get_frame_register_unsigned (this_frame, HARD_SP_REGNUM);
825 prev_sp = this_base + info->sp_offset + 2;
826 this_base += stack_correction (gdbarch);
827 }
828 else
829 {
830 /* The FP points at the last saved register. Adjust the FP back
831 to before the first saved register giving the SP. */
832 prev_sp = this_base + info->size + 2;
833
834 this_base += stack_correction (gdbarch);
835 if (soft_regs[SOFT_FP_REGNUM].name)
836 info->saved_regs[SOFT_FP_REGNUM].set_addr (info->size - 2);
837 }
838
839 if (info->return_kind == RETURN_RTC)
840 {
841 prev_sp += 1;
842 info->saved_regs[HARD_PAGE_REGNUM].set_addr (info->size);
843 info->saved_regs[HARD_PC_REGNUM].set_addr (info->size + 1);
844 }
845 else if (info->return_kind == RETURN_RTI)
846 {
847 prev_sp += 7;
848 info->saved_regs[HARD_CCR_REGNUM].set_addr (info->size);
849 info->saved_regs[HARD_D_REGNUM].set_addr (info->size + 1);
850 info->saved_regs[HARD_X_REGNUM].set_addr (info->size + 3);
851 info->saved_regs[HARD_Y_REGNUM].set_addr (info->size + 5);
852 info->saved_regs[HARD_PC_REGNUM].set_addr (info->size + 7);
853 }
854
855 /* Add 1 here to adjust for the post-decrement nature of the push
856 instruction. */
857 info->prev_sp = prev_sp;
858
859 info->base = this_base;
860
861 /* Adjust all the saved registers so that they contain addresses and not
862 offsets. */
863 for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
864 if (info->saved_regs[i].is_addr ())
865 {
866 info->saved_regs[i].set_addr (info->saved_regs[i].addr () + this_base);
867 }
868
869 /* The previous frame's SP needed to be computed. Save the computed
870 value. */
871 info->saved_regs[HARD_SP_REGNUM].set_value (info->prev_sp);
872
873 return info;
874 }
875
876 /* Given a GDB frame, determine the address of the calling function's
877 frame. This will be used to create a new GDB frame struct. */
878
879 static void
880 m68hc11_frame_this_id (struct frame_info *this_frame,
881 void **this_prologue_cache,
882 struct frame_id *this_id)
883 {
884 struct m68hc11_unwind_cache *info
885 = m68hc11_frame_unwind_cache (this_frame, this_prologue_cache);
886 CORE_ADDR base;
887 CORE_ADDR func;
888 struct frame_id id;
889
890 /* The FUNC is easy. */
891 func = get_frame_func (this_frame);
892
893 /* Hopefully the prologue analysis either correctly determined the
894 frame's base (which is the SP from the previous frame), or set
895 that base to "NULL". */
896 base = info->prev_sp;
897 if (base == 0)
898 return;
899
900 id = frame_id_build (base, func);
901 (*this_id) = id;
902 }
903
904 static struct value *
905 m68hc11_frame_prev_register (struct frame_info *this_frame,
906 void **this_prologue_cache, int regnum)
907 {
908 struct value *value;
909 struct m68hc11_unwind_cache *info
910 = m68hc11_frame_unwind_cache (this_frame, this_prologue_cache);
911
912 value = trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
913
914 /* Take into account the 68HC12 specific call (PC + page). */
915 if (regnum == HARD_PC_REGNUM
916 && info->return_kind == RETURN_RTC
917 && use_page_register (get_frame_arch (this_frame)))
918 {
919 CORE_ADDR pc = value_as_long (value);
920 if (pc >= 0x08000 && pc < 0x0c000)
921 {
922 CORE_ADDR page;
923
924 release_value (value);
925
926 value = trad_frame_get_prev_register (this_frame, info->saved_regs,
927 HARD_PAGE_REGNUM);
928 page = value_as_long (value);
929 release_value (value);
930
931 pc -= 0x08000;
932 pc += ((page & 0x0ff) << 14);
933 pc += 0x1000000;
934
935 return frame_unwind_got_constant (this_frame, regnum, pc);
936 }
937 }
938
939 return value;
940 }
941
942 static const struct frame_unwind m68hc11_frame_unwind = {
943 "m68hc11 prologue",
944 NORMAL_FRAME,
945 default_frame_unwind_stop_reason,
946 m68hc11_frame_this_id,
947 m68hc11_frame_prev_register,
948 NULL,
949 default_frame_sniffer
950 };
951
952 static CORE_ADDR
953 m68hc11_frame_base_address (struct frame_info *this_frame, void **this_cache)
954 {
955 struct m68hc11_unwind_cache *info
956 = m68hc11_frame_unwind_cache (this_frame, this_cache);
957
958 return info->base;
959 }
960
961 static CORE_ADDR
962 m68hc11_frame_args_address (struct frame_info *this_frame, void **this_cache)
963 {
964 CORE_ADDR addr;
965 struct m68hc11_unwind_cache *info
966 = m68hc11_frame_unwind_cache (this_frame, this_cache);
967
968 addr = info->base + info->size;
969 if (info->return_kind == RETURN_RTC)
970 addr += 1;
971 else if (info->return_kind == RETURN_RTI)
972 addr += 7;
973
974 return addr;
975 }
976
977 static const struct frame_base m68hc11_frame_base = {
978 &m68hc11_frame_unwind,
979 m68hc11_frame_base_address,
980 m68hc11_frame_base_address,
981 m68hc11_frame_args_address
982 };
983
984 /* Assuming THIS_FRAME is a dummy, return the frame ID of that dummy
985 frame. The frame ID's base needs to match the TOS value saved by
986 save_dummy_frame_tos(), and the PC match the dummy frame's breakpoint. */
987
988 static struct frame_id
989 m68hc11_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
990 {
991 ULONGEST tos;
992 CORE_ADDR pc = get_frame_pc (this_frame);
993
994 tos = get_frame_register_unsigned (this_frame, SOFT_FP_REGNUM);
995 tos += 2;
996 return frame_id_build (tos, pc);
997 }
998
999 \f
1000 /* Get and print the register from the given frame. */
1001 static void
1002 m68hc11_print_register (struct gdbarch *gdbarch, struct ui_file *file,
1003 struct frame_info *frame, int regno)
1004 {
1005 LONGEST rval;
1006
1007 if (regno == HARD_PC_REGNUM || regno == HARD_SP_REGNUM
1008 || regno == SOFT_FP_REGNUM || regno == M68HC12_HARD_PC_REGNUM)
1009 rval = get_frame_register_unsigned (frame, regno);
1010 else
1011 rval = get_frame_register_signed (frame, regno);
1012
1013 if (regno == HARD_A_REGNUM || regno == HARD_B_REGNUM
1014 || regno == HARD_CCR_REGNUM || regno == HARD_PAGE_REGNUM)
1015 {
1016 gdb_printf (file, "0x%02x ", (unsigned char) rval);
1017 if (regno != HARD_CCR_REGNUM)
1018 print_longest (file, 'd', 1, rval);
1019 }
1020 else
1021 {
1022 m68gc11_gdbarch_tdep *tdep
1023 = gdbarch_tdep<m68gc11_gdbarch_tdep> (gdbarch);
1024
1025 if (regno == HARD_PC_REGNUM && tdep->use_page_register)
1026 {
1027 ULONGEST page;
1028
1029 page = get_frame_register_unsigned (frame, HARD_PAGE_REGNUM);
1030 gdb_printf (file, "0x%02x:%04x ", (unsigned) page,
1031 (unsigned) rval);
1032 }
1033 else
1034 {
1035 gdb_printf (file, "0x%04x ", (unsigned) rval);
1036 if (regno != HARD_PC_REGNUM && regno != HARD_SP_REGNUM
1037 && regno != SOFT_FP_REGNUM && regno != M68HC12_HARD_PC_REGNUM)
1038 print_longest (file, 'd', 1, rval);
1039 }
1040 }
1041
1042 if (regno == HARD_CCR_REGNUM)
1043 {
1044 /* CCR register */
1045 int C, Z, N, V;
1046 unsigned char l = rval & 0xff;
1047
1048 gdb_printf (file, "%c%c%c%c%c%c%c%c ",
1049 l & M6811_S_BIT ? 'S' : '-',
1050 l & M6811_X_BIT ? 'X' : '-',
1051 l & M6811_H_BIT ? 'H' : '-',
1052 l & M6811_I_BIT ? 'I' : '-',
1053 l & M6811_N_BIT ? 'N' : '-',
1054 l & M6811_Z_BIT ? 'Z' : '-',
1055 l & M6811_V_BIT ? 'V' : '-',
1056 l & M6811_C_BIT ? 'C' : '-');
1057 N = (l & M6811_N_BIT) != 0;
1058 Z = (l & M6811_Z_BIT) != 0;
1059 V = (l & M6811_V_BIT) != 0;
1060 C = (l & M6811_C_BIT) != 0;
1061
1062 /* Print flags following the h8300. */
1063 if ((C | Z) == 0)
1064 gdb_printf (file, "u> ");
1065 else if ((C | Z) == 1)
1066 gdb_printf (file, "u<= ");
1067 else if (C == 0)
1068 gdb_printf (file, "u< ");
1069
1070 if (Z == 0)
1071 gdb_printf (file, "!= ");
1072 else
1073 gdb_printf (file, "== ");
1074
1075 if ((N ^ V) == 0)
1076 gdb_printf (file, ">= ");
1077 else
1078 gdb_printf (file, "< ");
1079
1080 if ((Z | (N ^ V)) == 0)
1081 gdb_printf (file, "> ");
1082 else
1083 gdb_printf (file, "<= ");
1084 }
1085 }
1086
1087 /* Same as 'info reg' but prints the registers in a different way. */
1088 static void
1089 m68hc11_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
1090 struct frame_info *frame, int regno, int cpregs)
1091 {
1092 if (regno >= 0)
1093 {
1094 const char *name = gdbarch_register_name (gdbarch, regno);
1095
1096 if (!name || !*name)
1097 return;
1098
1099 gdb_printf (file, "%-10s ", name);
1100 m68hc11_print_register (gdbarch, file, frame, regno);
1101 gdb_printf (file, "\n");
1102 }
1103 else
1104 {
1105 int i, nr;
1106
1107 gdb_printf (file, "PC=");
1108 m68hc11_print_register (gdbarch, file, frame, HARD_PC_REGNUM);
1109
1110 gdb_printf (file, " SP=");
1111 m68hc11_print_register (gdbarch, file, frame, HARD_SP_REGNUM);
1112
1113 gdb_printf (file, " FP=");
1114 m68hc11_print_register (gdbarch, file, frame, SOFT_FP_REGNUM);
1115
1116 gdb_printf (file, "\nCCR=");
1117 m68hc11_print_register (gdbarch, file, frame, HARD_CCR_REGNUM);
1118
1119 gdb_printf (file, "\nD=");
1120 m68hc11_print_register (gdbarch, file, frame, HARD_D_REGNUM);
1121
1122 gdb_printf (file, " X=");
1123 m68hc11_print_register (gdbarch, file, frame, HARD_X_REGNUM);
1124
1125 gdb_printf (file, " Y=");
1126 m68hc11_print_register (gdbarch, file, frame, HARD_Y_REGNUM);
1127
1128 m68gc11_gdbarch_tdep *tdep = gdbarch_tdep<m68gc11_gdbarch_tdep> (gdbarch);
1129
1130 if (tdep->use_page_register)
1131 {
1132 gdb_printf (file, "\nPage=");
1133 m68hc11_print_register (gdbarch, file, frame, HARD_PAGE_REGNUM);
1134 }
1135 gdb_printf (file, "\n");
1136
1137 nr = 0;
1138 for (i = SOFT_D1_REGNUM; i < M68HC11_ALL_REGS; i++)
1139 {
1140 /* Skip registers which are not defined in the symbol table. */
1141 if (soft_regs[i].name == 0)
1142 continue;
1143
1144 gdb_printf (file, "D%d=", i - SOFT_D1_REGNUM + 1);
1145 m68hc11_print_register (gdbarch, file, frame, i);
1146 nr++;
1147 if ((nr % 8) == 7)
1148 gdb_printf (file, "\n");
1149 else
1150 gdb_printf (file, " ");
1151 }
1152 if (nr && (nr % 8) != 7)
1153 gdb_printf (file, "\n");
1154 }
1155 }
1156
1157 static CORE_ADDR
1158 m68hc11_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
1159 struct regcache *regcache, CORE_ADDR bp_addr,
1160 int nargs, struct value **args, CORE_ADDR sp,
1161 function_call_return_method return_method,
1162 CORE_ADDR struct_addr)
1163 {
1164 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1165 int argnum;
1166 int first_stack_argnum;
1167 struct type *type;
1168 const gdb_byte *val;
1169 gdb_byte buf[2];
1170
1171 first_stack_argnum = 0;
1172 if (return_method == return_method_struct)
1173 regcache_cooked_write_unsigned (regcache, HARD_D_REGNUM, struct_addr);
1174 else if (nargs > 0)
1175 {
1176 type = value_type (args[0]);
1177
1178 /* First argument is passed in D and X registers. */
1179 if (type->length () <= 4)
1180 {
1181 ULONGEST v;
1182
1183 v = extract_unsigned_integer (value_contents (args[0]).data (),
1184 type->length (), byte_order);
1185 first_stack_argnum = 1;
1186
1187 regcache_cooked_write_unsigned (regcache, HARD_D_REGNUM, v);
1188 if (type->length () > 2)
1189 {
1190 v >>= 16;
1191 regcache_cooked_write_unsigned (regcache, HARD_X_REGNUM, v);
1192 }
1193 }
1194 }
1195
1196 for (argnum = nargs - 1; argnum >= first_stack_argnum; argnum--)
1197 {
1198 type = value_type (args[argnum]);
1199
1200 if (type->length () & 1)
1201 {
1202 static gdb_byte zero = 0;
1203
1204 sp--;
1205 write_memory (sp, &zero, 1);
1206 }
1207 val = value_contents (args[argnum]).data ();
1208 sp -= type->length ();
1209 write_memory (sp, val, type->length ());
1210 }
1211
1212 /* Store return address. */
1213 sp -= 2;
1214 store_unsigned_integer (buf, 2, byte_order, bp_addr);
1215 write_memory (sp, buf, 2);
1216
1217 /* Finally, update the stack pointer... */
1218 sp -= stack_correction (gdbarch);
1219 regcache_cooked_write_unsigned (regcache, HARD_SP_REGNUM, sp);
1220
1221 /* ...and fake a frame pointer. */
1222 regcache_cooked_write_unsigned (regcache, SOFT_FP_REGNUM, sp);
1223
1224 /* DWARF2/GCC uses the stack address *before* the function call as a
1225 frame's CFA. */
1226 return sp + 2;
1227 }
1228
1229
1230 /* Return the GDB type object for the "standard" data type
1231 of data in register N. */
1232
1233 static struct type *
1234 m68hc11_register_type (struct gdbarch *gdbarch, int reg_nr)
1235 {
1236 switch (reg_nr)
1237 {
1238 case HARD_PAGE_REGNUM:
1239 case HARD_A_REGNUM:
1240 case HARD_B_REGNUM:
1241 case HARD_CCR_REGNUM:
1242 return builtin_type (gdbarch)->builtin_uint8;
1243
1244 case M68HC12_HARD_PC_REGNUM:
1245 return builtin_type (gdbarch)->builtin_uint32;
1246
1247 default:
1248 return builtin_type (gdbarch)->builtin_uint16;
1249 }
1250 }
1251
1252 static void
1253 m68hc11_store_return_value (struct type *type, struct regcache *regcache,
1254 const gdb_byte *valbuf)
1255 {
1256 int len;
1257
1258 len = type->length ();
1259
1260 /* First argument is passed in D and X registers. */
1261 if (len <= 2)
1262 regcache->raw_write_part (HARD_D_REGNUM, 2 - len, len, valbuf);
1263 else if (len <= 4)
1264 {
1265 regcache->raw_write_part (HARD_X_REGNUM, 4 - len, len - 2, valbuf);
1266 regcache->raw_write (HARD_D_REGNUM, valbuf + (len - 2));
1267 }
1268 else
1269 error (_("return of value > 4 is not supported."));
1270 }
1271
1272
1273 /* Given a return value in `regcache' with a type `type',
1274 extract and copy its value into `valbuf'. */
1275
1276 static void
1277 m68hc11_extract_return_value (struct type *type, struct regcache *regcache,
1278 void *valbuf)
1279 {
1280 gdb_byte buf[M68HC11_REG_SIZE];
1281
1282 regcache->raw_read (HARD_D_REGNUM, buf);
1283 switch (type->length ())
1284 {
1285 case 1:
1286 memcpy (valbuf, buf + 1, 1);
1287 break;
1288
1289 case 2:
1290 memcpy (valbuf, buf, 2);
1291 break;
1292
1293 case 3:
1294 memcpy ((char*) valbuf + 1, buf, 2);
1295 regcache->raw_read (HARD_X_REGNUM, buf);
1296 memcpy (valbuf, buf + 1, 1);
1297 break;
1298
1299 case 4:
1300 memcpy ((char*) valbuf + 2, buf, 2);
1301 regcache->raw_read (HARD_X_REGNUM, buf);
1302 memcpy (valbuf, buf, 2);
1303 break;
1304
1305 default:
1306 error (_("bad size for return value"));
1307 }
1308 }
1309
1310 static enum return_value_convention
1311 m68hc11_return_value (struct gdbarch *gdbarch, struct value *function,
1312 struct type *valtype, struct regcache *regcache,
1313 gdb_byte *readbuf, const gdb_byte *writebuf)
1314 {
1315 if (valtype->code () == TYPE_CODE_STRUCT
1316 || valtype->code () == TYPE_CODE_UNION
1317 || valtype->code () == TYPE_CODE_ARRAY
1318 || valtype->length () > 4)
1319 return RETURN_VALUE_STRUCT_CONVENTION;
1320 else
1321 {
1322 if (readbuf != NULL)
1323 m68hc11_extract_return_value (valtype, regcache, readbuf);
1324 if (writebuf != NULL)
1325 m68hc11_store_return_value (valtype, regcache, writebuf);
1326 return RETURN_VALUE_REGISTER_CONVENTION;
1327 }
1328 }
1329
1330 /* Test whether the ELF symbol corresponds to a function using rtc or
1331 rti to return. */
1332
1333 static void
1334 m68hc11_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
1335 {
1336 unsigned char flags;
1337
1338 flags = ((elf_symbol_type *)sym)->internal_elf_sym.st_other;
1339 if (flags & STO_M68HC12_FAR)
1340 MSYMBOL_SET_RTC (msym);
1341 if (flags & STO_M68HC12_INTERRUPT)
1342 MSYMBOL_SET_RTI (msym);
1343 }
1344 \f
1345
1346 /* 68HC11/68HC12 register groups.
1347 Identify real hard registers and soft registers used by gcc. */
1348
1349 static const reggroup *m68hc11_soft_reggroup;
1350 static const reggroup *m68hc11_hard_reggroup;
1351
1352 static void
1353 m68hc11_init_reggroups (void)
1354 {
1355 m68hc11_hard_reggroup = reggroup_new ("hard", USER_REGGROUP);
1356 m68hc11_soft_reggroup = reggroup_new ("soft", USER_REGGROUP);
1357 }
1358
1359 static void
1360 m68hc11_add_reggroups (struct gdbarch *gdbarch)
1361 {
1362 reggroup_add (gdbarch, m68hc11_hard_reggroup);
1363 reggroup_add (gdbarch, m68hc11_soft_reggroup);
1364 }
1365
1366 static int
1367 m68hc11_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
1368 const struct reggroup *group)
1369 {
1370 /* We must save the real hard register as well as gcc
1371 soft registers including the frame pointer. */
1372 if (group == save_reggroup || group == restore_reggroup)
1373 {
1374 return (regnum <= gdbarch_num_regs (gdbarch)
1375 || ((regnum == SOFT_FP_REGNUM
1376 || regnum == SOFT_TMP_REGNUM
1377 || regnum == SOFT_ZS_REGNUM
1378 || regnum == SOFT_XY_REGNUM)
1379 && m68hc11_register_name (gdbarch, regnum)));
1380 }
1381
1382 /* Group to identify gcc soft registers (d1..dN). */
1383 if (group == m68hc11_soft_reggroup)
1384 {
1385 return regnum >= SOFT_D1_REGNUM
1386 && m68hc11_register_name (gdbarch, regnum);
1387 }
1388
1389 if (group == m68hc11_hard_reggroup)
1390 {
1391 return regnum == HARD_PC_REGNUM || regnum == HARD_SP_REGNUM
1392 || regnum == HARD_X_REGNUM || regnum == HARD_D_REGNUM
1393 || regnum == HARD_Y_REGNUM || regnum == HARD_CCR_REGNUM;
1394 }
1395 return default_register_reggroup_p (gdbarch, regnum, group);
1396 }
1397
1398 static struct gdbarch *
1399 m68hc11_gdbarch_init (struct gdbarch_info info,
1400 struct gdbarch_list *arches)
1401 {
1402 struct gdbarch *gdbarch;
1403 int elf_flags;
1404
1405 soft_reg_initialized = 0;
1406
1407 /* Extract the elf_flags if available. */
1408 if (info.abfd != NULL
1409 && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
1410 elf_flags = elf_elfheader (info.abfd)->e_flags;
1411 else
1412 elf_flags = 0;
1413
1414 /* Try to find a pre-existing architecture. */
1415 for (arches = gdbarch_list_lookup_by_info (arches, &info);
1416 arches != NULL;
1417 arches = gdbarch_list_lookup_by_info (arches->next, &info))
1418 {
1419 m68gc11_gdbarch_tdep *tdep
1420 = gdbarch_tdep<m68gc11_gdbarch_tdep> (arches->gdbarch);
1421
1422 if (tdep->elf_flags != elf_flags)
1423 continue;
1424
1425 return arches->gdbarch;
1426 }
1427
1428 /* Need a new architecture. Fill in a target specific vector. */
1429 m68gc11_gdbarch_tdep *tdep = new m68gc11_gdbarch_tdep;
1430 gdbarch = gdbarch_alloc (&info, tdep);
1431 tdep->elf_flags = elf_flags;
1432
1433 switch (info.bfd_arch_info->arch)
1434 {
1435 case bfd_arch_m68hc11:
1436 tdep->stack_correction = 1;
1437 tdep->use_page_register = 0;
1438 tdep->prologue = m6811_prologue;
1439 set_gdbarch_addr_bit (gdbarch, 16);
1440 set_gdbarch_num_pseudo_regs (gdbarch, M68HC11_NUM_PSEUDO_REGS);
1441 set_gdbarch_pc_regnum (gdbarch, HARD_PC_REGNUM);
1442 set_gdbarch_num_regs (gdbarch, M68HC11_NUM_REGS);
1443 break;
1444
1445 case bfd_arch_m68hc12:
1446 tdep->stack_correction = 0;
1447 tdep->use_page_register = elf_flags & E_M68HC12_BANKS;
1448 tdep->prologue = m6812_prologue;
1449 set_gdbarch_addr_bit (gdbarch, elf_flags & E_M68HC12_BANKS ? 32 : 16);
1450 set_gdbarch_num_pseudo_regs (gdbarch,
1451 elf_flags & E_M68HC12_BANKS
1452 ? M68HC12_NUM_PSEUDO_REGS
1453 : M68HC11_NUM_PSEUDO_REGS);
1454 set_gdbarch_pc_regnum (gdbarch, elf_flags & E_M68HC12_BANKS
1455 ? M68HC12_HARD_PC_REGNUM : HARD_PC_REGNUM);
1456 set_gdbarch_num_regs (gdbarch, elf_flags & E_M68HC12_BANKS
1457 ? M68HC12_NUM_REGS : M68HC11_NUM_REGS);
1458 break;
1459
1460 default:
1461 break;
1462 }
1463
1464 /* Initially set everything according to the ABI.
1465 Use 16-bit integers since it will be the case for most
1466 programs. The size of these types should normally be set
1467 according to the dwarf2 debug information. */
1468 set_gdbarch_short_bit (gdbarch, 16);
1469 set_gdbarch_int_bit (gdbarch, elf_flags & E_M68HC11_I32 ? 32 : 16);
1470 set_gdbarch_float_bit (gdbarch, 32);
1471 if (elf_flags & E_M68HC11_F64)
1472 {
1473 set_gdbarch_double_bit (gdbarch, 64);
1474 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
1475 }
1476 else
1477 {
1478 set_gdbarch_double_bit (gdbarch, 32);
1479 set_gdbarch_double_format (gdbarch, floatformats_ieee_single);
1480 }
1481 set_gdbarch_long_double_bit (gdbarch, 64);
1482 set_gdbarch_long_bit (gdbarch, 32);
1483 set_gdbarch_ptr_bit (gdbarch, 16);
1484 set_gdbarch_long_long_bit (gdbarch, 64);
1485
1486 /* Characters are unsigned. */
1487 set_gdbarch_char_signed (gdbarch, 0);
1488
1489 /* Set register info. */
1490 set_gdbarch_fp0_regnum (gdbarch, -1);
1491
1492 set_gdbarch_sp_regnum (gdbarch, HARD_SP_REGNUM);
1493 set_gdbarch_register_name (gdbarch, m68hc11_register_name);
1494 set_gdbarch_register_type (gdbarch, m68hc11_register_type);
1495 set_gdbarch_pseudo_register_read (gdbarch, m68hc11_pseudo_register_read);
1496 set_gdbarch_pseudo_register_write (gdbarch, m68hc11_pseudo_register_write);
1497
1498 set_gdbarch_push_dummy_call (gdbarch, m68hc11_push_dummy_call);
1499
1500 set_gdbarch_return_value (gdbarch, m68hc11_return_value);
1501 set_gdbarch_skip_prologue (gdbarch, m68hc11_skip_prologue);
1502 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1503 set_gdbarch_breakpoint_kind_from_pc (gdbarch,
1504 m68hc11_breakpoint::kind_from_pc);
1505 set_gdbarch_sw_breakpoint_from_kind (gdbarch,
1506 m68hc11_breakpoint::bp_from_kind);
1507
1508 m68hc11_add_reggroups (gdbarch);
1509 set_gdbarch_register_reggroup_p (gdbarch, m68hc11_register_reggroup_p);
1510 set_gdbarch_print_registers_info (gdbarch, m68hc11_print_registers_info);
1511
1512 /* Hook in the DWARF CFI frame unwinder. */
1513 dwarf2_append_unwinders (gdbarch);
1514
1515 frame_unwind_append_unwinder (gdbarch, &m68hc11_frame_unwind);
1516 frame_base_set_default (gdbarch, &m68hc11_frame_base);
1517
1518 /* Methods for saving / extracting a dummy frame's ID. The ID's
1519 stack address must match the SP value returned by
1520 PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos. */
1521 set_gdbarch_dummy_id (gdbarch, m68hc11_dummy_id);
1522
1523 /* Minsymbol frobbing. */
1524 set_gdbarch_elf_make_msymbol_special (gdbarch,
1525 m68hc11_elf_make_msymbol_special);
1526
1527 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
1528
1529 return gdbarch;
1530 }
1531
1532 void _initialize_m68hc11_tdep ();
1533 void
1534 _initialize_m68hc11_tdep ()
1535 {
1536 gdbarch_register (bfd_arch_m68hc11, m68hc11_gdbarch_init);
1537 gdbarch_register (bfd_arch_m68hc12, m68hc11_gdbarch_init);
1538 m68hc11_init_reggroups ();
1539 }
1540