Fix device memory allocation in 68hc11 simulator
[deliverable/binutils-gdb.git] / gdb / m68hc11-tdep.c
CommitLineData
78073dd8
AC
1/* Target-dependent code for Motorola 68HC11
2 Copyright (C) 1999, 2000 Free Software Foundation, Inc.
3 Contributed by Stephane Carrez, stcarrez@worldnet.fr
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
78073dd8 21
82c230c2
SC
22#include "defs.h"
23#include "frame.h"
24#include "obstack.h"
25#include "symtab.h"
26#include "gdbtypes.h"
27#include "gdbcmd.h"
28#include "gdbcore.h"
29#include "gdb_string.h"
30#include "value.h"
31#include "inferior.h"
32#include "dis-asm.h"
33#include "symfile.h"
34#include "objfiles.h"
35#include "arch-utils.h"
78073dd8 36
82c230c2
SC
37#include "target.h"
38#include "opcode/m68hc11.h"
78073dd8
AC
39
40/* Register numbers of various important registers.
41 Note that some of these values are "real" register numbers,
42 and correspond to the general registers of the machine,
43 and some are "phony" register numbers which are too large
44 to be actual register numbers as far as the user is concerned
45 but do serve to get the desired values when passed to read_register. */
46
82c230c2
SC
47#define HARD_X_REGNUM 0
48#define HARD_D_REGNUM 1
49#define HARD_Y_REGNUM 2
50#define HARD_SP_REGNUM 3
51#define HARD_PC_REGNUM 4
52
53#define HARD_A_REGNUM 5
54#define HARD_B_REGNUM 6
55#define HARD_CCR_REGNUM 7
56#define M68HC11_LAST_HARD_REG (HARD_CCR_REGNUM)
57
58/* Z is replaced by X or Y by gcc during machine reorg.
59 ??? There is no way to get it and even know whether
60 it's in X or Y or in ZS. */
61#define SOFT_Z_REGNUM 8
62
63/* Soft registers. These registers are special. There are treated
64 like normal hard registers by gcc and gdb (ie, within dwarf2 info).
65 They are physically located in memory. */
66#define SOFT_FP_REGNUM 9
67#define SOFT_TMP_REGNUM 10
68#define SOFT_ZS_REGNUM 11
69#define SOFT_XY_REGNUM 12
70#define SOFT_D1_REGNUM 13
71#define SOFT_D32_REGNUM (SOFT_D1_REGNUM+31)
72#define M68HC11_MAX_SOFT_REGS 32
73
74#define M68HC11_NUM_REGS (8)
75#define M68HC11_NUM_PSEUDO_REGS (M68HC11_MAX_SOFT_REGS+5)
76#define M68HC11_ALL_REGS (M68HC11_NUM_REGS+M68HC11_NUM_PSEUDO_REGS)
77
78#define M68HC11_REG_SIZE (2)
79
80struct gdbarch_tdep
81 {
82 /* from the elf header */
83 int elf_flags;
84 };
85
86struct frame_extra_info
87{
88 int frame_reg;
89 CORE_ADDR return_pc;
90 CORE_ADDR dummy;
91 int frameless;
92 int size;
93};
78073dd8 94
82c230c2
SC
95/* Table of registers for 68HC11. This includes the hard registers
96 and the soft registers used by GCC. */
97static char *
98m68hc11_register_names[] =
99{
100 "x", "d", "y", "sp", "pc", "a", "b",
101 "ccr", "z", "frame","tmp", "zs", "xy",
102 "d1", "d2", "d3", "d4", "d5", "d6", "d7",
103 "d8", "d9", "d10", "d11", "d12", "d13", "d14",
104 "d15", "d16", "d17", "d18", "d19", "d20", "d21",
105 "d22", "d23", "d24", "d25", "d26", "d27", "d28",
106 "d29", "d30", "d31", "d32"
107};
78073dd8 108
82c230c2
SC
109struct m68hc11_soft_reg
110{
111 const char *name;
112 CORE_ADDR addr;
113};
78073dd8 114
82c230c2 115static struct m68hc11_soft_reg soft_regs[M68HC11_ALL_REGS];
78073dd8 116
82c230c2 117#define M68HC11_FP_ADDR soft_regs[SOFT_FP_REGNUM].addr
78073dd8 118
82c230c2
SC
119static int soft_min_addr;
120static int soft_max_addr;
121static int soft_reg_initialized = 0;
78073dd8 122
184651e3
SC
123/* Stack pointer correction value. For 68hc11, the stack pointer points
124 to the next push location. An offset of 1 must be applied to obtain
125 the address where the last value is saved. For 68hc12, the stack
126 pointer points to the last value pushed. No offset is necessary. */
127static int stack_correction = 1;
128
82c230c2
SC
129/* Look in the symbol table for the address of a pseudo register
130 in memory. If we don't find it, pretend the register is not used
131 and not available. */
132static void
133m68hc11_get_register_info (struct m68hc11_soft_reg *reg, const char *name)
134{
135 struct minimal_symbol *msymbol;
78073dd8 136
82c230c2
SC
137 msymbol = lookup_minimal_symbol (name, NULL, NULL);
138 if (msymbol)
139 {
140 reg->addr = SYMBOL_VALUE_ADDRESS (msymbol);
141 reg->name = xstrdup (name);
142
143 /* Keep track of the address range for soft registers. */
144 if (reg->addr < (CORE_ADDR) soft_min_addr)
145 soft_min_addr = reg->addr;
146 if (reg->addr > (CORE_ADDR) soft_max_addr)
147 soft_max_addr = reg->addr;
148 }
149 else
150 {
151 reg->name = 0;
152 reg->addr = 0;
153 }
154}
78073dd8 155
82c230c2
SC
156/* Initialize the table of soft register addresses according
157 to the symbol table. */
158 static void
159m68hc11_initialize_register_info (void)
160{
161 int i;
78073dd8 162
82c230c2
SC
163 if (soft_reg_initialized)
164 return;
165
166 soft_min_addr = INT_MAX;
167 soft_max_addr = 0;
168 for (i = 0; i < M68HC11_ALL_REGS; i++)
169 {
170 soft_regs[i].name = 0;
171 }
172
173 m68hc11_get_register_info (&soft_regs[SOFT_FP_REGNUM], "_.frame");
174 m68hc11_get_register_info (&soft_regs[SOFT_TMP_REGNUM], "_.tmp");
175 m68hc11_get_register_info (&soft_regs[SOFT_ZS_REGNUM], "_.z");
176 soft_regs[SOFT_Z_REGNUM] = soft_regs[SOFT_ZS_REGNUM];
177 m68hc11_get_register_info (&soft_regs[SOFT_XY_REGNUM], "_.xy");
78073dd8 178
82c230c2
SC
179 for (i = SOFT_D1_REGNUM; i < M68HC11_MAX_SOFT_REGS; i++)
180 {
181 char buf[10];
78073dd8 182
82c230c2
SC
183 sprintf (buf, "_.d%d", i - SOFT_D1_REGNUM + 1);
184 m68hc11_get_register_info (&soft_regs[i], buf);
185 }
78073dd8 186
82c230c2
SC
187 if (soft_regs[SOFT_FP_REGNUM].name == 0)
188 {
189 warning ("No frame soft register found in the symbol table.\n");
190 warning ("Stack backtrace will not work.\n");
191 }
192 soft_reg_initialized = 1;
193}
78073dd8 194
82c230c2
SC
195/* Given an address in memory, return the soft register number if
196 that address corresponds to a soft register. Returns -1 if not. */
197static int
198m68hc11_which_soft_register (CORE_ADDR addr)
199{
200 int i;
201
202 if (addr < soft_min_addr || addr > soft_max_addr)
203 return -1;
204
205 for (i = SOFT_FP_REGNUM; i < M68HC11_ALL_REGS; i++)
206 {
207 if (soft_regs[i].name && soft_regs[i].addr == addr)
208 return i;
209 }
210 return -1;
211}
78073dd8 212
82c230c2
SC
213/* Fetch a pseudo register. The 68hc11 soft registers are treated like
214 pseudo registers. They are located in memory. Translate the register
215 fetch into a memory read. */
216void
217m68hc11_fetch_pseudo_register (int regno)
218{
219 char buf[MAX_REGISTER_RAW_SIZE];
78073dd8 220
82c230c2
SC
221 m68hc11_initialize_register_info ();
222
223 /* Fetch a soft register: translate into a memory read. */
224 if (soft_regs[regno].name)
225 {
226 target_read_memory (soft_regs[regno].addr, buf, 2);
227 }
228 else
229 {
230 memset (buf, 0, 2);
231 }
232 supply_register (regno, buf);
233}
78073dd8 234
82c230c2
SC
235/* Store a pseudo register. Translate the register store
236 into a memory write. */
237static void
238m68hc11_store_pseudo_register (int regno)
239{
240 m68hc11_initialize_register_info ();
78073dd8 241
82c230c2
SC
242 /* Store a soft register: translate into a memory write. */
243 if (soft_regs[regno].name)
244 {
245 char buf[MAX_REGISTER_RAW_SIZE];
78073dd8 246
82c230c2
SC
247 read_register_gen (regno, buf);
248 target_write_memory (soft_regs[regno].addr, buf, 2);
249 }
250}
78073dd8 251
82c230c2
SC
252static char *
253m68hc11_register_name (int reg_nr)
78073dd8 254{
82c230c2
SC
255 if (reg_nr < 0)
256 return NULL;
257 if (reg_nr >= M68HC11_ALL_REGS)
258 return NULL;
259
260 /* If we don't know the address of a soft register, pretend it
261 does not exist. */
262 if (reg_nr > M68HC11_LAST_HARD_REG && soft_regs[reg_nr].name == 0)
263 return NULL;
264 return m68hc11_register_names[reg_nr];
265}
78073dd8 266
82c230c2
SC
267static unsigned char *
268m68hc11_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
78073dd8 269{
82c230c2
SC
270 static unsigned char breakpoint[] = {0x0};
271
272 *lenptr = sizeof (breakpoint);
273 return breakpoint;
78073dd8
AC
274}
275
276/* Immediately after a function call, return the saved pc before the frame
82c230c2 277 is setup. */
78073dd8 278
82c230c2 279static CORE_ADDR
78073dd8
AC
280m68hc11_saved_pc_after_call (struct frame_info *frame)
281{
82c230c2
SC
282 CORE_ADDR addr;
283
184651e3 284 addr = read_register (HARD_SP_REGNUM) + stack_correction;
78073dd8
AC
285 addr &= 0x0ffff;
286 return read_memory_integer (addr, 2) & 0x0FFFF;
287}
288
82c230c2
SC
289static CORE_ADDR
290m68hc11_frame_saved_pc (struct frame_info *frame)
291{
292 return frame->extra_info->return_pc;
293}
294
295static CORE_ADDR
296m68hc11_frame_args_address (struct frame_info *frame)
297{
298 return frame->frame;
299}
300
301static CORE_ADDR
302m68hc11_frame_locals_address (struct frame_info *frame)
303{
304 return frame->frame;
305}
306
78073dd8
AC
307/* Discard from the stack the innermost frame, restoring all saved
308 registers. */
309
82c230c2 310static void
fba45db2 311m68hc11_pop_frame (void)
78073dd8 312{
82c230c2
SC
313 register struct frame_info *frame = get_current_frame ();
314 register CORE_ADDR fp, sp;
315 register int regnum;
316
317 if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
318 generic_pop_dummy_frame ();
319 else
320 {
321 fp = FRAME_FP (frame);
322 FRAME_INIT_SAVED_REGS (frame);
323
324 /* Copy regs from where they were saved in the frame. */
325 for (regnum = 0; regnum < M68HC11_ALL_REGS; regnum++)
326 if (frame->saved_regs[regnum])
327 write_register (regnum,
328 read_memory_integer (frame->saved_regs[regnum], 2));
329
330 write_register (HARD_PC_REGNUM, frame->extra_info->return_pc);
331 sp = fp + frame->extra_info->size;
332 write_register (HARD_SP_REGNUM, sp);
333 }
334 flush_cached_frames ();
78073dd8
AC
335}
336
337/* Analyze the function prologue to find some information
338 about the function:
339 - the PC of the first line (for m68hc11_skip_prologue)
340 - the offset of the previous frame saved address (from current frame)
341 - the soft registers which are pushed. */
342static void
82c230c2
SC
343m68hc11_guess_from_prologue (CORE_ADDR pc, CORE_ADDR fp,
344 CORE_ADDR *first_line,
345 int *frame_offset, CORE_ADDR *pushed_regs)
78073dd8 346{
82c230c2 347 CORE_ADDR save_addr;
78073dd8
AC
348 CORE_ADDR func_end;
349 unsigned char op0, op1, op2;
350 int add_sp_mode;
82c230c2 351 int sp_adjust = 0;
78073dd8
AC
352 int size;
353 int found_frame_point;
82c230c2 354 int saved_reg;
78073dd8 355 CORE_ADDR first_pc;
78073dd8
AC
356
357 first_pc = get_pc_function_start (pc);
358 size = 0;
359
82c230c2 360 m68hc11_initialize_register_info ();
78073dd8
AC
361 if (first_pc == 0)
362 {
363 *frame_offset = 0;
78073dd8
AC
364 *first_line = pc;
365 return;
366 }
367
368#define OP_PAGE2 (0x18)
369#define OP_LDX (0xde)
370#define OP_LDY (0xde)
371#define OP_PSHX (0x3c)
372#define OP_PSHY (0x3c)
373#define OP_STS (0x9f)
374#define OP_TSX (0x30)
375#define OP_TSY (0x30)
376#define OP_XGDX (0x8f)
377#define OP_XGDY (0x8f)
378#define OP_ADDD (0xc3)
379#define OP_TXS (0x35)
380#define OP_TYS (0x35)
6148eca7 381#define OP_DES (0x34)
78073dd8
AC
382
383 /* The 68hc11 stack is as follows:
384
385
386 | |
387 +-----------+
388 | |
389 | args |
390 | |
391 +-----------+
392 | PC-return |
393 +-----------+
394 | Old frame |
395 +-----------+
396 | |
397 | Locals |
398 | |
399 +-----------+ <--- current frame
400 | |
401
402 With most processors (like 68K) the previous frame can be computed
403 easily because it is always at a fixed offset (see link/unlink).
404 That is, locals are accessed with negative offsets, arguments are
405 accessed with positive ones. Since 68hc11 only supports offsets
406 in the range [0..255], the frame is defined at the bottom of
407 locals (see picture).
408
409 The purpose of the analysis made here is to find out the size
410 of locals in this function. An alternative to this is to use
411 DWARF2 info. This would be better but I don't know how to
412 access dwarf2 debug from this function.
413
414 Walk from the function entry point to the point where we save
415 the frame. While walking instructions, compute the size of bytes
416 which are pushed. This gives us the index to access the previous
417 frame.
418
419 We limit the search to 128 bytes so that the algorithm is bounded
420 in case of random and wrong code. We also stop and abort if
421 we find an instruction which is not supposed to appear in the
422 prologue (as generated by gcc 2.95, 2.96).
423 */
424 pc = first_pc;
425 func_end = pc + 128;
426 add_sp_mode = 0;
427 found_frame_point = 0;
428 while (pc + 2 < func_end)
429 {
430 op0 = read_memory_unsigned_integer (pc, 1);
431 op1 = read_memory_unsigned_integer (pc + 1, 1);
432 op2 = read_memory_unsigned_integer (pc + 2, 1);
433
434 /* ldx *frame */
82c230c2 435 if (op0 == OP_LDX && op1 == M68HC11_FP_ADDR)
78073dd8
AC
436 {
437 pc += 2;
438 }
439
440 /* ldy *frame */
82c230c2
SC
441 else if (op0 == OP_PAGE2 && op1 == OP_LDY
442 && op2 == M68HC11_FP_ADDR)
78073dd8
AC
443 {
444 pc += 3;
445 }
446
447 /* pshx */
448 else if (op0 == OP_PSHX)
449 {
450 pc += 1;
451 size += 2;
452 }
453
454 /* pshy */
455 else if (op0 == OP_PAGE2 && op1 == OP_PSHX)
456 {
457 pc += 2;
458 size += 2;
459 }
460
461 /* sts *frame */
82c230c2 462 else if (op0 == OP_STS && op1 == M68HC11_FP_ADDR)
78073dd8
AC
463 {
464 found_frame_point = 1;
465 pc += 2;
466 break;
467 }
468 else if (op0 == OP_TSX && op1 == OP_XGDX)
469 {
470 add_sp_mode = 1;
471 pc += 2;
472 }
6148eca7
SC
473 /* des to allocate 1 byte on the stack */
474 else if (op0 == OP_DES)
475 {
476 pc += 1;
477 size += 1;
478 }
78073dd8
AC
479 else if (op0 == OP_PAGE2 && op1 == OP_TSY && op2 == OP_PAGE2)
480 {
481 op0 = read_memory_unsigned_integer (pc + 3, 1);
482 if (op0 != OP_XGDY)
483 break;
484
485 add_sp_mode = 2;
486 pc += 4;
487 }
488 else if (add_sp_mode && op0 == OP_ADDD)
489 {
490 sp_adjust = read_memory_unsigned_integer (pc + 1, 2);
491 if (sp_adjust & 0x8000)
492 sp_adjust |= 0xffff0000L;
493
494 sp_adjust = -sp_adjust;
495 add_sp_mode |= 4;
496 pc += 3;
497 }
498 else if (add_sp_mode == (1 | 4) && op0 == OP_XGDX
499 && op1 == OP_TXS)
500 {
501 size += sp_adjust;
502 pc += 2;
503 add_sp_mode = 0;
504 }
505 else if (add_sp_mode == (2 | 4) && op0 == OP_PAGE2
506 && op1 == OP_XGDY && op2 == OP_PAGE2)
507 {
508 op0 = read_memory_unsigned_integer (pc + 3, 1);
509 if (op0 != OP_TYS)
510 break;
511
512 size += sp_adjust;
513 pc += 4;
514 add_sp_mode = 0;
515 }
516 else
517 {
518 break;
519 }
520 }
521
522 if (found_frame_point == 0)
523 {
524 *frame_offset = 0;
525 }
526 else
527 {
528 *frame_offset = size;
529 }
530
531 /* Now, look forward to see how many registers are pushed on the stack.
532 We look only for soft registers so there must be a first LDX *REG
533 before a PSHX. */
82c230c2
SC
534 saved_reg = -1;
535 save_addr = fp;
78073dd8
AC
536 while (pc + 2 < func_end)
537 {
538 op0 = read_memory_unsigned_integer (pc, 1);
539 op1 = read_memory_unsigned_integer (pc + 1, 1);
540 op2 = read_memory_unsigned_integer (pc + 2, 1);
82c230c2 541 if (op0 == OP_LDX)
78073dd8 542 {
82c230c2
SC
543 saved_reg = m68hc11_which_soft_register (op1);
544 if (saved_reg < 0 || saved_reg == SOFT_FP_REGNUM)
545 break;
546
78073dd8
AC
547 pc += 2;
548 }
82c230c2 549 else if (op0 == OP_PAGE2 && op1 == OP_LDY)
78073dd8 550 {
82c230c2
SC
551 saved_reg = m68hc11_which_soft_register (op2);
552 if (saved_reg < 0 || saved_reg == SOFT_FP_REGNUM)
553 break;
554
78073dd8
AC
555 pc += 3;
556 }
557 else if (op0 == OP_PSHX)
558 {
559 /* If there was no load, this is a push for a function call. */
82c230c2 560 if (saved_reg < 0 || saved_reg >= M68HC11_ALL_REGS)
78073dd8 561 break;
82c230c2
SC
562
563 /* Keep track of the address where that register is saved
564 on the stack. */
565 save_addr -= 2;
566 if (pushed_regs)
567 pushed_regs[saved_reg] = save_addr;
568
78073dd8 569 pc += 1;
82c230c2 570 saved_reg = -1;
78073dd8
AC
571 }
572 else if (op0 == OP_PAGE2 && op1 == OP_PSHY)
573 {
82c230c2 574 if (saved_reg < 0 || saved_reg >= M68HC11_ALL_REGS)
78073dd8
AC
575 break;
576
82c230c2
SC
577 /* Keep track of the address where that register is saved
578 on the stack. */
579 save_addr -= 2;
580 if (pushed_regs)
581 pushed_regs[saved_reg] = save_addr;
582
78073dd8 583 pc += 2;
82c230c2 584 saved_reg = -1;
78073dd8
AC
585 }
586 else
587 {
588 break;
589 }
590 }
78073dd8
AC
591 *first_line = pc;
592}
593
82c230c2 594static CORE_ADDR
78073dd8
AC
595m68hc11_skip_prologue (CORE_ADDR pc)
596{
597 CORE_ADDR func_addr, func_end;
598 struct symtab_and_line sal;
599 int frame_offset;
78073dd8 600
82c230c2
SC
601 /* If we have line debugging information, then the end of the
602 prologue should be the first assembly instruction of the
78073dd8
AC
603 first source line. */
604 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
605 {
606 sal = find_pc_line (func_addr, 0);
607 if (sal.end && sal.end < func_end)
608 return sal.end;
609 }
610
82c230c2 611 m68hc11_guess_from_prologue (pc, 0, &pc, &frame_offset, 0);
78073dd8
AC
612 return pc;
613}
614
615/* Given a GDB frame, determine the address of the calling function's frame.
616 This will be used to create a new GDB frame struct, and then
617 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
618*/
619
82c230c2 620static CORE_ADDR
78073dd8
AC
621m68hc11_frame_chain (struct frame_info *frame)
622{
82c230c2 623 CORE_ADDR addr;
78073dd8 624
6148eca7
SC
625 if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
626 return frame->frame; /* dummy frame same as caller's frame */
627
82c230c2
SC
628 if (frame->extra_info->return_pc == 0
629 || inside_entry_file (frame->extra_info->return_pc))
630 return (CORE_ADDR) 0;
78073dd8
AC
631
632 if (frame->frame == 0)
633 {
634 return (CORE_ADDR) 0;
635 }
636
184651e3 637 addr = frame->frame + frame->extra_info->size + stack_correction - 2;
78073dd8
AC
638 addr = read_memory_unsigned_integer (addr, 2) & 0x0FFFF;
639 if (addr == 0)
640 {
82c230c2 641 return (CORE_ADDR) 0;
78073dd8
AC
642 }
643
644 return addr;
645}
646
647/* Put here the code to store, into a struct frame_saved_regs, the
648 addresses of the saved registers of frame described by FRAME_INFO.
649 This includes special registers such as pc and fp saved in special
650 ways in the stack frame. sp is even more special: the address we
651 return for it IS the sp for the next frame. */
82c230c2
SC
652static void
653m68hc11_frame_init_saved_regs (struct frame_info *fi)
78073dd8
AC
654{
655 CORE_ADDR pc;
184651e3
SC
656 CORE_ADDR addr;
657
82c230c2
SC
658 if (fi->saved_regs == NULL)
659 frame_saved_regs_zalloc (fi);
660 else
661 memset (fi->saved_regs, 0, sizeof (fi->saved_regs));
662
78073dd8 663 pc = fi->pc;
82c230c2
SC
664 m68hc11_guess_from_prologue (pc, fi->frame, &pc, &fi->extra_info->size,
665 fi->saved_regs);
666
184651e3
SC
667 addr = fi->frame + fi->extra_info->size + stack_correction;
668 fi->saved_regs[SOFT_FP_REGNUM] = addr - 2;
669 fi->saved_regs[HARD_SP_REGNUM] = addr;
82c230c2 670 fi->saved_regs[HARD_PC_REGNUM] = fi->saved_regs[HARD_SP_REGNUM];
78073dd8
AC
671}
672
82c230c2 673static void
78073dd8
AC
674m68hc11_init_extra_frame_info (int fromleaf, struct frame_info *fi)
675{
82c230c2 676 CORE_ADDR addr;
78073dd8 677
82c230c2
SC
678 fi->extra_info = (struct frame_extra_info *)
679 frame_obstack_alloc (sizeof (struct frame_extra_info));
680
681 if (fi->next)
682 fi->pc = FRAME_SAVED_PC (fi->next);
683
684 m68hc11_frame_init_saved_regs (fi);
78073dd8
AC
685
686 if (fromleaf)
687 {
82c230c2 688 fi->extra_info->return_pc = m68hc11_saved_pc_after_call (fi);
78073dd8
AC
689 }
690 else
691 {
184651e3 692 addr = fi->frame + fi->extra_info->size + stack_correction;
82c230c2
SC
693 addr = read_memory_unsigned_integer (addr, 2) & 0x0ffff;
694 fi->extra_info->return_pc = addr;
78073dd8
AC
695#if 0
696 printf ("Pc@0x%04x, FR 0x%04x, size %d, read ret @0x%04x -> 0x%04x\n",
697 fi->pc,
698 fi->frame, fi->size,
699 addr & 0x0ffff,
700 fi->return_pc);
701#endif
702 }
703}
704
705/* Same as 'info reg' but prints the registers in a different way. */
706static void
707show_regs (char *args, int from_tty)
708{
82c230c2 709 int ccr = read_register (HARD_CCR_REGNUM);
78073dd8 710 int i;
82c230c2
SC
711 int nr;
712
78073dd8 713 printf_filtered ("PC=%04x SP=%04x FP=%04x CCR=%02x %c%c%c%c%c%c%c%c\n",
82c230c2
SC
714 (int) read_register (HARD_PC_REGNUM),
715 (int) read_register (HARD_SP_REGNUM),
716 (int) read_register (SOFT_FP_REGNUM),
78073dd8
AC
717 ccr,
718 ccr & M6811_S_BIT ? 'S' : '-',
719 ccr & M6811_X_BIT ? 'X' : '-',
720 ccr & M6811_H_BIT ? 'H' : '-',
721 ccr & M6811_I_BIT ? 'I' : '-',
722 ccr & M6811_N_BIT ? 'N' : '-',
723 ccr & M6811_Z_BIT ? 'Z' : '-',
724 ccr & M6811_V_BIT ? 'V' : '-',
725 ccr & M6811_C_BIT ? 'C' : '-');
726
727 printf_filtered ("D=%04x IX=%04x IY=%04x\n",
82c230c2
SC
728 (int) read_register (HARD_D_REGNUM),
729 (int) read_register (HARD_X_REGNUM),
730 (int) read_register (HARD_Y_REGNUM));
731
732 nr = 0;
733 for (i = SOFT_D1_REGNUM; i < M68HC11_ALL_REGS; i++)
78073dd8 734 {
82c230c2
SC
735 /* Skip registers which are not defined in the symbol table. */
736 if (soft_regs[i].name == 0)
737 continue;
738
739 printf_filtered ("D%d=%04x",
740 i - SOFT_D1_REGNUM + 1,
741 (int) read_register (i));
742 nr++;
743 if ((nr % 8) == 7)
78073dd8
AC
744 printf_filtered ("\n");
745 else
746 printf_filtered (" ");
747 }
82c230c2
SC
748 if (nr && (nr % 8) != 7)
749 printf_filtered ("\n");
78073dd8
AC
750}
751
22df305e
SC
752static CORE_ADDR
753m68hc11_stack_align (CORE_ADDR addr)
754{
755 return ((addr + 1) & -2);
756}
757
82c230c2 758static CORE_ADDR
78073dd8
AC
759m68hc11_push_arguments (int nargs,
760 value_ptr *args,
761 CORE_ADDR sp,
762 int struct_return,
763 CORE_ADDR struct_addr)
764{
82c230c2
SC
765 int stack_alloc;
766 int argnum;
767 int first_stack_argnum;
768 int stack_offset;
769 struct type *type;
770 char *val;
771 int len;
772
773 stack_alloc = 0;
774 first_stack_argnum = 0;
775 if (struct_return)
776 {
184651e3
SC
777 /* The struct is allocated on the stack and gdb used the stack
778 pointer for the address of that struct. We must apply the
779 stack offset on the address. */
780 write_register (HARD_D_REGNUM, struct_addr + stack_correction);
82c230c2
SC
781 }
782 else if (nargs > 0)
783 {
784 type = VALUE_TYPE (args[0]);
785 len = TYPE_LENGTH (type);
786
787 /* First argument is passed in D and X registers. */
788 if (len <= 4)
789 {
790 LONGEST v = extract_unsigned_integer (VALUE_CONTENTS (args[0]), len);
791 first_stack_argnum = 1;
792 write_register (HARD_D_REGNUM, v);
793 if (len > 2)
794 {
795 v >>= 16;
796 write_register (HARD_X_REGNUM, v);
797 }
798 }
799 }
800 for (argnum = first_stack_argnum; argnum < nargs; argnum++)
801 {
802 type = VALUE_TYPE (args[argnum]);
22df305e 803 stack_alloc += (TYPE_LENGTH (type) + 1) & -2;
82c230c2
SC
804 }
805 sp -= stack_alloc;
806
184651e3 807 stack_offset = stack_correction;
82c230c2
SC
808 for (argnum = first_stack_argnum; argnum < nargs; argnum++)
809 {
810 type = VALUE_TYPE (args[argnum]);
811 len = TYPE_LENGTH (type);
812
813 val = (char*) VALUE_CONTENTS (args[argnum]);
814 write_memory (sp + stack_offset, val, len);
815 stack_offset += len;
22df305e
SC
816 if (len & 1)
817 {
818 static char zero = 0;
819
820 write_memory (sp + stack_offset, &zero, 1);
821 stack_offset++;
822 }
82c230c2
SC
823 }
824 return sp;
78073dd8
AC
825}
826
827
82c230c2
SC
828/* Return a location where we can set a breakpoint that will be hit
829 when an inferior function call returns. */
78073dd8 830CORE_ADDR
fba45db2 831m68hc11_call_dummy_address (void)
78073dd8 832{
22df305e 833 return entry_point_address ();
78073dd8
AC
834}
835
82c230c2
SC
836static struct type *
837m68hc11_register_virtual_type (int reg_nr)
838{
839 return builtin_type_uint16;
840}
841
842static void
843m68hc11_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
844{
184651e3
SC
845 /* The struct address computed by gdb is on the stack.
846 It uses the stack pointer so we must apply the stack
847 correction offset. */
848 write_register (HARD_D_REGNUM, addr + stack_correction);
82c230c2
SC
849}
850
851static void
852m68hc11_store_return_value (struct type *type, char *valbuf)
853{
22df305e
SC
854 int len;
855
856 len = TYPE_LENGTH (type);
857
858 /* First argument is passed in D and X registers. */
859 if (len <= 4)
860 {
861 LONGEST v = extract_unsigned_integer (valbuf, len);
862
863 write_register (HARD_D_REGNUM, v);
864 if (len > 2)
865 {
866 v >>= 16;
867 write_register (HARD_X_REGNUM, v);
868 }
869 }
870 else
871 error ("return of value > 4 is not supported.");
82c230c2
SC
872}
873
874
875/* Given a return value in `regbuf' with a type `type',
78073dd8
AC
876 extract and copy its value into `valbuf'. */
877
82c230c2
SC
878static void
879m68hc11_extract_return_value (struct type *type,
78073dd8
AC
880 char *regbuf,
881 char *valbuf)
882{
82c230c2
SC
883 int len = TYPE_LENGTH (type);
884
22df305e 885 switch (len)
82c230c2 886 {
22df305e
SC
887 case 1:
888 memcpy (valbuf, &regbuf[HARD_D_REGNUM * 2 + 1], len);
889 break;
890
891 case 2:
892 memcpy (valbuf, &regbuf[HARD_D_REGNUM * 2], len);
893 break;
894
895 case 3:
896 memcpy (&valbuf[0], &regbuf[HARD_X_REGNUM * 2 + 1], 1);
897 memcpy (&valbuf[1], &regbuf[HARD_D_REGNUM * 2], 2);
898 break;
899
900 case 4:
901 memcpy (&valbuf[0], &regbuf[HARD_X_REGNUM * 2], 2);
902 memcpy (&valbuf[2], &regbuf[HARD_D_REGNUM * 2], 2);
903 break;
904
905 default:
82c230c2
SC
906 error ("bad size for return value");
907 }
908}
909
910/* Should call_function allocate stack space for a struct return? */
911static int
912m68hc11_use_struct_convention (int gcc_p, struct type *type)
913{
22df305e
SC
914 return (TYPE_CODE (type) == TYPE_CODE_STRUCT
915 || TYPE_CODE (type) == TYPE_CODE_UNION
916 || TYPE_LENGTH (type) > 4);
82c230c2
SC
917}
918
919static int
920m68hc11_return_value_on_stack (struct type *type)
921{
22df305e 922 return TYPE_LENGTH (type) > 4;
82c230c2
SC
923}
924
925/* Extract from an array REGBUF containing the (raw) register state
926 the address in which a function should return its structure value,
927 as a CORE_ADDR (or an expression that can be used as one). */
928static CORE_ADDR
929m68hc11_extract_struct_value_address (char *regbuf)
930{
931 return extract_address (&regbuf[HARD_D_REGNUM * 2],
932 REGISTER_RAW_SIZE (HARD_D_REGNUM));
933}
934
935/* Function: push_return_address (pc)
936 Set up the return address for the inferior function call.
937 Needed for targets where we don't actually execute a JSR/BSR instruction */
938
939static CORE_ADDR
940m68hc11_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
941{
942 char valbuf[2];
943
22df305e 944 pc = CALL_DUMMY_ADDRESS ();
82c230c2
SC
945 sp -= 2;
946 store_unsigned_integer (valbuf, 2, pc);
184651e3 947 write_memory (sp + stack_correction, valbuf, 2);
82c230c2
SC
948 return sp;
949}
950
951/* Index within `registers' of the first byte of the space for
952 register N. */
953static int
954m68hc11_register_byte (int reg_nr)
955{
956 return (reg_nr * M68HC11_REG_SIZE);
957}
958
959static int
960m68hc11_register_raw_size (int reg_nr)
961{
962 return M68HC11_REG_SIZE;
963}
964
965static struct gdbarch *
966m68hc11_gdbarch_init (struct gdbarch_info info,
967 struct gdbarch_list *arches)
968{
969 static LONGEST m68hc11_call_dummy_words[] =
970 {0};
971 struct gdbarch *gdbarch;
972 struct gdbarch_tdep *tdep;
973 int elf_flags;
974
975 /* Extract the elf_flags if available */
976 elf_flags = 0;
977
978 soft_reg_initialized = 0;
979
980 /* try to find a pre-existing architecture */
981 for (arches = gdbarch_list_lookup_by_info (arches, &info);
982 arches != NULL;
983 arches = gdbarch_list_lookup_by_info (arches->next, &info))
984 {
985 /* MIPS needs to be pedantic about which ABI the object is
986 using. */
987 if (gdbarch_tdep (current_gdbarch)->elf_flags != elf_flags)
988 continue;
989 return arches->gdbarch;
990 }
991
992 /* Need a new architecture. Fill in a target specific vector. */
993 tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
994 gdbarch = gdbarch_alloc (&info, tdep);
995 tdep->elf_flags = elf_flags;
996
997 /* Initially set everything according to the ABI. */
998 set_gdbarch_short_bit (gdbarch, 16);
999 set_gdbarch_int_bit (gdbarch, 32);
1000 set_gdbarch_float_bit (gdbarch, 32);
1001 set_gdbarch_double_bit (gdbarch, 64);
1002 set_gdbarch_long_double_bit (gdbarch, 64);
1003 set_gdbarch_long_bit (gdbarch, 32);
1004 set_gdbarch_ptr_bit (gdbarch, 16);
1005 set_gdbarch_long_long_bit (gdbarch, 64);
1006
1007 /* Set register info. */
1008 set_gdbarch_fp0_regnum (gdbarch, -1);
1009 set_gdbarch_max_register_raw_size (gdbarch, 2);
1010 set_gdbarch_max_register_virtual_size (gdbarch, 2);
1011 set_gdbarch_register_raw_size (gdbarch, m68hc11_register_raw_size);
1012 set_gdbarch_register_virtual_size (gdbarch, m68hc11_register_raw_size);
1013 set_gdbarch_register_byte (gdbarch, m68hc11_register_byte);
1014 set_gdbarch_frame_init_saved_regs (gdbarch, m68hc11_frame_init_saved_regs);
1015 set_gdbarch_frame_args_skip (gdbarch, 0);
1016
1017 set_gdbarch_read_pc (gdbarch, generic_target_read_pc);
1018 set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
1019 set_gdbarch_read_fp (gdbarch, generic_target_read_fp);
1020 set_gdbarch_write_fp (gdbarch, generic_target_write_fp);
1021 set_gdbarch_read_sp (gdbarch, generic_target_read_sp);
1022 set_gdbarch_write_sp (gdbarch, generic_target_write_sp);
1023
1024 set_gdbarch_num_regs (gdbarch, M68HC11_NUM_REGS);
1025 set_gdbarch_num_pseudo_regs (gdbarch, M68HC11_NUM_PSEUDO_REGS);
1026 set_gdbarch_sp_regnum (gdbarch, HARD_SP_REGNUM);
1027 set_gdbarch_fp_regnum (gdbarch, SOFT_FP_REGNUM);
1028 set_gdbarch_pc_regnum (gdbarch, HARD_PC_REGNUM);
1029 set_gdbarch_register_name (gdbarch, m68hc11_register_name);
1030 set_gdbarch_register_size (gdbarch, 2);
1031 set_gdbarch_register_bytes (gdbarch, M68HC11_ALL_REGS * 2);
1032 set_gdbarch_register_virtual_type (gdbarch, m68hc11_register_virtual_type);
1033 set_gdbarch_fetch_pseudo_register (gdbarch, m68hc11_fetch_pseudo_register);
1034 set_gdbarch_store_pseudo_register (gdbarch, m68hc11_store_pseudo_register);
1035
1036 set_gdbarch_use_generic_dummy_frames (gdbarch, 1);
1037 set_gdbarch_call_dummy_length (gdbarch, 0);
1038 set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
1039 set_gdbarch_call_dummy_address (gdbarch, m68hc11_call_dummy_address);
1040 set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1); /*???*/
1041 set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
1042 set_gdbarch_call_dummy_start_offset (gdbarch, 0);
1043 set_gdbarch_pc_in_call_dummy (gdbarch, generic_pc_in_call_dummy);
1044 set_gdbarch_call_dummy_words (gdbarch, m68hc11_call_dummy_words);
1045 set_gdbarch_sizeof_call_dummy_words (gdbarch,
1046 sizeof (m68hc11_call_dummy_words));
1047 set_gdbarch_call_dummy_p (gdbarch, 1);
1048 set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0);
1049 set_gdbarch_get_saved_register (gdbarch, generic_get_saved_register);
1050 set_gdbarch_fix_call_dummy (gdbarch, generic_fix_call_dummy);
1051 set_gdbarch_extract_return_value (gdbarch, m68hc11_extract_return_value);
1052 set_gdbarch_push_arguments (gdbarch, m68hc11_push_arguments);
1053 set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame);
1054 set_gdbarch_push_return_address (gdbarch, m68hc11_push_return_address);
1055 set_gdbarch_return_value_on_stack (gdbarch, m68hc11_return_value_on_stack);
1056
1057 set_gdbarch_store_struct_return (gdbarch, m68hc11_store_struct_return);
1058 set_gdbarch_store_return_value (gdbarch, m68hc11_store_return_value);
1059 set_gdbarch_extract_struct_value_address (gdbarch,
1060 m68hc11_extract_struct_value_address);
1061 set_gdbarch_register_convertible (gdbarch, generic_register_convertible_not);
1062
1063
1064 set_gdbarch_frame_chain (gdbarch, m68hc11_frame_chain);
1065 set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid);
1066 set_gdbarch_frame_saved_pc (gdbarch, m68hc11_frame_saved_pc);
1067 set_gdbarch_frame_args_address (gdbarch, m68hc11_frame_args_address);
1068 set_gdbarch_frame_locals_address (gdbarch, m68hc11_frame_locals_address);
1069 set_gdbarch_saved_pc_after_call (gdbarch, m68hc11_saved_pc_after_call);
1070 set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
1071
1072 set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
1073 set_gdbarch_get_saved_register (gdbarch, generic_get_saved_register);
1074
1075 set_gdbarch_store_struct_return (gdbarch, m68hc11_store_struct_return);
1076 set_gdbarch_store_return_value (gdbarch, m68hc11_store_return_value);
1077 set_gdbarch_extract_struct_value_address
1078 (gdbarch, m68hc11_extract_struct_value_address);
1079 set_gdbarch_use_struct_convention (gdbarch, m68hc11_use_struct_convention);
1080 set_gdbarch_init_extra_frame_info (gdbarch, m68hc11_init_extra_frame_info);
1081 set_gdbarch_pop_frame (gdbarch, m68hc11_pop_frame);
1082 set_gdbarch_skip_prologue (gdbarch, m68hc11_skip_prologue);
1083 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1084 set_gdbarch_decr_pc_after_break (gdbarch, 0);
1085 set_gdbarch_function_start_offset (gdbarch, 0);
1086 set_gdbarch_breakpoint_from_pc (gdbarch, m68hc11_breakpoint_from_pc);
22df305e 1087 set_gdbarch_stack_align (gdbarch, m68hc11_stack_align);
82c230c2
SC
1088
1089 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
1090 set_gdbarch_ieee_float (gdbarch, 1);
1091
1092 return gdbarch;
78073dd8
AC
1093}
1094
1095void
fba45db2 1096_initialize_m68hc11_tdep (void)
78073dd8 1097{
82c230c2
SC
1098 register_gdbarch_init (bfd_arch_m68hc11, m68hc11_gdbarch_init);
1099 if (!tm_print_insn) /* Someone may have already set it */
1100 tm_print_insn = print_insn_m68hc11;
78073dd8
AC
1101
1102 add_com ("regs", class_vars, show_regs, "Print all registers");
1103}
1104
This page took 0.208704 seconds and 4 git commands to generate.