1 /* Target-machine dependent code for Hitachi H8/500, for GDB.
2 Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21 Contributed by Steve Chamberlain
33 #include "../opcodes/h8500-opc.h"
36 #define UNSIGNED_SHORT(X) ((X) & 0xffff)
40 /* Shape of an H8/500 frame :
47 return address <2 or 4 bytes>
57 /* an easy to debug H8 stack frame looks like:
61 0x7905 nnnn mov.w #n,r5 or 0x1b87 subs #2,sp
66 #define IS_PUSH(x) (((x) & 0xff00)==0x6d00)
67 #define IS_LINK_8(x) ((x) == 0x17)
68 #define IS_LINK_16(x) ((x) == 0x1f)
69 #define IS_MOVE_FP(x) ((x) == 0x0d76)
70 #define IS_MOV_SP_FP(x) ((x) == 0x0d76)
71 #define IS_SUB2_SP(x) ((x) == 0x1b87)
72 #define IS_MOVK_R5(x) ((x) == 0x7905)
73 #define IS_SUB_R5SP(x) ((x) == 0x1957)
79 CORE_ADDR examine_prologue ();
81 void frame_find_saved_regs ();
85 h8500_skip_prologue (start_pc)
91 w = read_memory_integer (start_pc, 1);
95 w = read_memory_integer (start_pc, 1);
101 w = read_memory_integer (start_pc, 2);
107 /* Given a GDB frame, determine the address of the calling function's frame.
108 This will be used to create a new GDB frame struct, and then
109 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
111 For us, the frame address is its stack pointer value, so we look up
112 the function prologue to determine the caller's sp value, and return it. */
115 h8500_frame_chain (thisframe)
116 struct frame_info *thisframe;
118 if (!inside_entry_file (thisframe->pc))
119 return (read_memory_integer (FRAME_FP (thisframe), PTR_SIZE));
125 /* Fetch the instruction at ADDR, returning 0 if ADDR is beyond LIM or
126 is not the address of a valid instruction, the address of the next
127 instruction beyond ADDR otherwise. *PWORD1 receives the first word
128 of the instruction.*/
131 NEXT_PROLOGUE_INSN (addr, lim, pword1)
138 read_memory (addr, pword1, 1);
139 read_memory (addr, pword1 + 1, 1);
145 /* Examine the prologue of a function. `ip' points to the first instruction.
146 `limit' is the limit of the prologue (e.g. the addr of the first
147 linenumber, or perhaps the program counter if we're stepping through).
148 `frame_sp' is the stack pointer value in use in this frame.
149 `fsr' is a pointer to a frame_saved_regs structure into which we put
150 info about the registers saved by this frame.
151 `fi' is a struct frame_info pointer; we fill in various fields in it
152 to reflect the offsets of the arg pointer and the locals pointer. */
155 /* Return the saved PC from this frame. */
158 frame_saved_pc (frame)
159 struct frame_info *frame;
161 return read_memory_integer (FRAME_FP (frame) + 2, PTR_SIZE);
165 frame_locals_address (fi)
166 struct frame_info *fi;
171 /* Return the address of the argument block for the frame
172 described by FI. Returns 0 if the address is unknown. */
175 frame_args_address (fi)
176 struct frame_info *fi;
185 struct frame_saved_regs fsr;
186 struct frame_info *frame = get_current_frame ();
188 get_frame_saved_regs (frame, &fsr);
190 for (regnum = 0; regnum < 8; regnum++)
192 if (fsr.regs[regnum])
193 write_register (regnum, read_memory_short (fsr.regs[regnum]));
195 flush_cached_frames ();
201 print_register_hook (regno)
203 if (regno == CCR_REGNUM)
211 read_relative_register_raw_bytes (regno, b);
213 printf_unfiltered ("\t");
214 printf_unfiltered ("I-%d - ", (l & 0x80) != 0);
219 printf_unfiltered ("N-%d ", N);
220 printf_unfiltered ("Z-%d ", Z);
221 printf_unfiltered ("V-%d ", V);
222 printf_unfiltered ("C-%d ", C);
224 printf_unfiltered ("u> ");
226 printf_unfiltered ("u<= ");
228 printf_unfiltered ("u>= ");
230 printf_unfiltered ("u< ");
232 printf_unfiltered ("!= ");
234 printf_unfiltered ("== ");
236 printf_unfiltered (">= ");
238 printf_unfiltered ("< ");
239 if ((Z | (N ^ V)) == 0)
240 printf_unfiltered ("> ");
241 if ((Z | (N ^ V)) == 1)
242 printf_unfiltered ("<= ");
247 h8500_register_size (regno)
281 h8500_register_virtual_type (regno)
290 return builtin_type_unsigned_char;
300 return builtin_type_unsigned_short;
310 return builtin_type_unsigned_long;
316 /* Put here the code to store, into a struct frame_saved_regs,
317 the addresses of the saved registers of frame described by FRAME_INFO.
318 This includes special registers such as pc and fp saved in special
319 ways in the stack frame. sp is even more special:
320 the address we return for it IS the sp for the next frame. */
323 frame_find_saved_regs (frame_info, frame_saved_regs)
324 struct frame_info *frame_info;
325 struct frame_saved_regs *frame_saved_regs;
329 register int regmask;
330 register CORE_ADDR next_addr;
331 register CORE_ADDR pc;
332 unsigned char thebyte;
334 memset (frame_saved_regs, '\0', sizeof *frame_saved_regs);
336 if ((frame_info)->pc >= (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM * 4 - 4
337 && (frame_info)->pc <= (frame_info)->frame)
339 next_addr = (frame_info)->frame;
340 pc = (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM * 4 - 4;
344 pc = get_pc_function_start ((frame_info)->pc);
345 /* Verify we have a link a6 instruction next;
346 if not we lose. If we win, find the address above the saved
347 regs using the amount of storage from the link instruction.
350 thebyte = read_memory_integer (pc, 1);
352 next_addr = (frame_info)->frame + read_memory_integer (pc += 1, 2), pc += 2;
353 else if (0x17 == thebyte)
354 next_addr = (frame_info)->frame + read_memory_integer (pc += 1, 1), pc += 1;
359 /* If have an add:g.waddal #-n, sp next, adjust next_addr. */
360 if ((0x0c0177777 & read_memory_integer (pc, 2)) == 0157774)
361 next_addr += read_memory_integer (pc += 2, 4), pc += 4;
365 thebyte = read_memory_integer (pc, 1);
370 regmask = read_memory_integer (pc, 1);
372 for (regnum = 0; regnum < 8; regnum++, regmask >>= 1)
376 (frame_saved_regs)->regs[regnum] = (next_addr += 2) - 2;
379 thebyte = read_memory_integer (pc, 1);
381 /* Maybe got a load of pushes */
382 while (thebyte == 0xbf)
385 regnum = read_memory_integer (pc, 1) & 0x7;
387 (frame_saved_regs)->regs[regnum] = (next_addr += 2) - 2;
388 thebyte = read_memory_integer (pc, 1);
393 /* Remember the address of the frame pointer */
394 (frame_saved_regs)->regs[FP_REGNUM] = (frame_info)->frame;
396 /* This is where the old sp is hidden */
397 (frame_saved_regs)->regs[SP_REGNUM] = (frame_info)->frame;
399 /* And the PC - remember the pushed FP is always two bytes long */
400 (frame_saved_regs)->regs[PC_REGNUM] = (frame_info)->frame + 2;
403 saved_pc_after_call (frame)
406 int a = read_register (SP_REGNUM);
407 x = read_memory_integer (a, code_size);
410 /* Stick current code segement onto top */
412 x |= read_register (SEG_C_REGNUM) << 16;
419 /* Nonzero if instruction at PC is a return instruction. */
423 int b1 = read_memory_integer (pc, 1);
427 case 0x14: /* rtd #8 */
428 case 0x1c: /* rtd #16 */
434 int b2 = read_memory_integer (pc + 1, 1);
437 case 0x18: /* prts */
438 case 0x14: /* prtd #8 */
439 case 0x16: /* prtd #16 */
449 h8500_set_pointer_size (newsize)
452 static int oldsize = 0;
454 if (oldsize != newsize)
456 printf_unfiltered ("pointer size set to %d bits\n", newsize);
466 _initialize_gdbtypes ();
471 struct cmd_list_element *setmemorylist;
474 #define C(name,a,b,c) name () { h8500_set_pointer_size(a); code_size = b; data_size = c; }
476 C(big_command, 32,4,4);
477 C(medium_command, 32, 4,2);
478 C(compact_command, 32,2,4);
479 C(small_command, 16,2,2);
482 set_memory (args, from_tty)
486 printf_unfiltered ("\"set memory\" must be followed by the name of a memory subcommand.\n");
487 help_list (setmemorylist, "set memory ", -1, gdb_stdout);
490 /* See if variable name is ppc or pr[0-7] */
493 h8500_is_trapped_internalvar (name)
499 if (strcmp (name + 1, "pc") == 0)
505 && name[3] == '\000')
512 h8500_value_of_trapped_internalvar (var)
513 struct internalvar *var;
516 unsigned char regbuf[4];
517 int page_regnum, regnum;
519 regnum = var->name[2] == 'c' ? PC_REGNUM : var->name[2] - '0';
521 switch (var->name[2])
524 page_regnum = SEG_C_REGNUM;
530 page_regnum = SEG_D_REGNUM;
534 page_regnum = SEG_E_REGNUM;
538 page_regnum = SEG_T_REGNUM;
542 get_saved_register (regbuf, NULL, NULL, selected_frame, page_regnum, NULL);
543 regval = regbuf[0] << 16;
545 get_saved_register (regbuf, NULL, NULL, selected_frame, regnum, NULL);
546 regval |= regbuf[0] << 8 | regbuf[1]; /* XXX host/target byte order */
548 free (var->value); /* Free up old value */
550 var->value = value_from_longest (builtin_type_unsigned_long, regval);
551 release_value (var->value); /* Unchain new value */
553 VALUE_LVAL (var->value) = lval_internalvar;
554 VALUE_INTERNALVAR (var->value) = var;
559 h8500_set_trapped_internalvar (var, newval, bitpos, bitsize, offset)
560 struct internalvar *var;
561 int offset, bitpos, bitsize;
564 char *page_regnum, *regnum;
565 char expression[100];
568 enum type_code newval_type_code;
570 type = VALUE_TYPE (newval);
571 newval_type_code = TYPE_CODE (type);
573 if ((newval_type_code != TYPE_CODE_INT
574 && newval_type_code != TYPE_CODE_PTR)
575 || TYPE_LENGTH (type) != sizeof (new_regval))
576 error ("Illegal type (%s) for assignment to $%s\n",
577 TYPE_NAME (type), var->name);
579 new_regval = *(long *) VALUE_CONTENTS_RAW (newval);
581 regnum = var->name + 1;
583 switch (var->name[2])
604 sprintf (expression, "$%s=%d", page_regnum, new_regval >> 16);
605 parse_and_eval (expression);
607 sprintf (expression, "$%s=%d", regnum, new_regval & 0xffff);
608 parse_and_eval (expression);
612 _initialize_h8500_tdep ()
614 add_prefix_cmd ("memory", no_class, set_memory,
615 "set the memory model", &setmemorylist, "set memory ", 0,
618 add_cmd ("small", class_support, small_command,
619 "Set small memory model. (16 bit code, 16 bit data)", &setmemorylist);
621 add_cmd ("big", class_support, big_command,
622 "Set big memory model. (32 bit code, 32 bit data)", &setmemorylist);
624 add_cmd ("medium", class_support, medium_command,
625 "Set medium memory model. (32 bit code, 16 bit data)", &setmemorylist);
627 add_cmd ("compact", class_support, compact_command,
628 "Set compact memory model. (16 bit code, 32 bit data)", &setmemorylist);
635 return read_register (PR7_REGNUM);
642 write_register (PR7_REGNUM, v);
649 return read_register (PC_REGNUM);
653 h8500_write_pc (v, pid)
657 write_register (PC_REGNUM, v);
663 return read_register (PR6_REGNUM);
670 write_register (PR6_REGNUM, v);
674 _initialize_h8500_tdep ()
676 tm_print_insn = gdb_print_insn_sh;