1 /* Print VAX instructions for GDB, the GNU debugger.
2 Copyright 1986, 1989, 1991, 1992, 1995, 1996, 1998, 1999, 2000, 2002, 2003
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "opcode/vax.h"
30 #include "arch-utils.h"
31 #include "gdb_string.h"
36 static gdbarch_register_name_ftype vax_register_name;
37 static gdbarch_register_byte_ftype vax_register_byte;
38 static gdbarch_register_raw_size_ftype vax_register_raw_size;
39 static gdbarch_register_virtual_size_ftype vax_register_virtual_size;
40 static gdbarch_register_virtual_type_ftype vax_register_virtual_type;
42 static gdbarch_skip_prologue_ftype vax_skip_prologue;
43 static gdbarch_saved_pc_after_call_ftype vax_saved_pc_after_call;
44 static gdbarch_frame_num_args_ftype vax_frame_num_args;
45 static gdbarch_deprecated_frame_chain_ftype vax_frame_chain;
46 static gdbarch_frame_args_address_ftype vax_frame_args_address;
47 static gdbarch_frame_locals_address_ftype vax_frame_locals_address;
49 static gdbarch_deprecated_extract_return_value_ftype vax_extract_return_value;
50 static gdbarch_deprecated_extract_struct_value_address_ftype
51 vax_extract_struct_value_address;
53 static gdbarch_deprecated_push_dummy_frame_ftype vax_push_dummy_frame;
54 static gdbarch_fix_call_dummy_ftype vax_fix_call_dummy;
56 /* Return 1 if P points to an invalid floating point value.
57 LEN is the length in bytes -- not relevant on the Vax. */
59 /* FIXME: cagney/2002-01-19: The macro below was originally defined in
60 tm-vax.h and used in values.c. Two problems. Firstly this is a
61 very non-portable and secondly it is wrong. The VAX should be
62 using floatformat and associated methods to identify and handle
63 invalid floating-point values. Adding to the poor target's woes
64 there is no floatformat_vax_{f,d} and no TARGET_FLOAT_FORMAT
67 /* FIXME: cagney/2002-01-19: It turns out that the only thing that
68 uses this macro is the vax disassembler code (so how old is this
69 target?). This target should instead be using the opcodes
70 disassembler. That allowing the macro to be eliminated. */
72 #define INVALID_FLOAT(p, len) ((*(short *) p & 0xff80) == 0x8000)
74 /* Vax instructions are never longer than this. */
77 /* Number of elements in the opcode table. */
78 #define NOPCODES (sizeof votstrs / sizeof votstrs[0])
80 static unsigned char *print_insn_arg ();
83 vax_register_name (int regno)
85 static char *register_names[] =
87 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
88 "r8", "r9", "r10", "r11", "ap", "fp", "sp", "pc",
94 if (regno >= (sizeof(register_names) / sizeof(*register_names)))
96 return (register_names[regno]);
100 vax_register_byte (int regno)
106 vax_register_raw_size (int regno)
112 vax_register_virtual_size (int regno)
118 vax_register_virtual_type (int regno)
120 return (builtin_type_int);
124 vax_frame_init_saved_regs (struct frame_info *frame)
129 if (get_frame_saved_regs (frame))
132 frame_saved_regs_zalloc (frame);
134 regmask = read_memory_integer (get_frame_base (frame) + 4, 4) >> 16;
136 next_addr = get_frame_base (frame) + 16;
138 /* regmask's low bit is for register 0, which is the first one
139 what would be pushed. */
140 for (regnum = 0; regnum < VAX_AP_REGNUM; regnum++)
142 if (regmask & (1 << regnum))
143 get_frame_saved_regs (frame)[regnum] = next_addr += 4;
146 get_frame_saved_regs (frame)[SP_REGNUM] = next_addr + 4;
147 if (regmask & (1 << FP_REGNUM))
148 get_frame_saved_regs (frame)[SP_REGNUM] +=
149 4 + (4 * read_memory_integer (next_addr + 4, 4));
151 get_frame_saved_regs (frame)[PC_REGNUM] = get_frame_base (frame) + 16;
152 get_frame_saved_regs (frame)[FP_REGNUM] = get_frame_base (frame) + 12;
153 get_frame_saved_regs (frame)[VAX_AP_REGNUM] = get_frame_base (frame) + 8;
154 get_frame_saved_regs (frame)[PS_REGNUM] = get_frame_base (frame) + 4;
157 /* Get saved user PC for sigtramp from sigcontext for BSD style sigtramp. */
160 vax_sigtramp_saved_pc (struct frame_info *frame)
162 CORE_ADDR sigcontext_addr;
164 int ptrbytes = TYPE_LENGTH (builtin_type_void_func_ptr);
165 int sigcontext_offs = (2 * TARGET_INT_BIT) / TARGET_CHAR_BIT;
167 buf = alloca (ptrbytes);
168 /* Get sigcontext address, it is the third parameter on the stack. */
169 if (get_next_frame (frame))
170 sigcontext_addr = read_memory_typed_address
171 (FRAME_ARGS_ADDRESS (get_next_frame (frame))
172 + FRAME_ARGS_SKIP + sigcontext_offs,
173 builtin_type_void_data_ptr);
175 sigcontext_addr = read_memory_typed_address
176 (read_register (SP_REGNUM) + sigcontext_offs, builtin_type_void_data_ptr);
178 /* Don't cause a memory_error when accessing sigcontext in case the stack
179 layout has changed or the stack is corrupt. */
180 target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes);
181 return extract_typed_address (buf, builtin_type_void_func_ptr);
185 vax_frame_saved_pc (struct frame_info *frame)
187 if ((get_frame_type (frame) == SIGTRAMP_FRAME))
188 return (vax_sigtramp_saved_pc (frame)); /* XXXJRT */
190 return (read_memory_integer (get_frame_base (frame) + 16, 4));
194 vax_frame_args_address_correct (struct frame_info *frame)
196 /* Cannot find the AP register value directly from the FP value. Must
197 find it saved in the frame called by this one, or in the AP register
198 for the innermost frame. However, there is no way to tell the
199 difference between the innermost frame and a frame for which we
200 just don't know the frame that it called (e.g. "info frame 0x7ffec789").
201 For the sake of argument, suppose that the stack is somewhat trashed
202 (which is one reason that "info frame" exists). So, return 0 (indicating
203 we don't know the address of the arglist) if we don't know what frame
205 if (get_next_frame (frame))
206 return (read_memory_integer (get_frame_base (get_next_frame (frame)) + 8, 4));
212 vax_frame_args_address (struct frame_info *frame)
214 /* In most of GDB, getting the args address is too important to
215 just say "I don't know". This is sometimes wrong for functions
216 that aren't on top of the stack, but c'est la vie. */
217 if (get_next_frame (frame))
218 return (read_memory_integer (get_frame_base (get_next_frame (frame)) + 8, 4));
220 return (read_register (VAX_AP_REGNUM));
224 vax_frame_locals_address (struct frame_info *frame)
226 return (get_frame_base (frame));
230 vax_frame_num_args (struct frame_info *fi)
232 return (0xff & read_memory_integer (FRAME_ARGS_ADDRESS (fi), 1));
236 vax_frame_chain (struct frame_info *frame)
238 /* In the case of the VAX, the frame's nominal address is the FP value,
239 and 12 bytes later comes the saved previous FP value as a 4-byte word. */
240 if (inside_entry_file (get_frame_pc (frame)))
243 return (read_memory_integer (get_frame_base (frame) + 12, 4));
247 vax_push_dummy_frame (void)
249 CORE_ADDR sp = read_register (SP_REGNUM);
252 sp = push_word (sp, 0); /* arglist */
253 for (regnum = 11; regnum >= 0; regnum--)
254 sp = push_word (sp, read_register (regnum));
255 sp = push_word (sp, read_register (PC_REGNUM));
256 sp = push_word (sp, read_register (FP_REGNUM));
257 sp = push_word (sp, read_register (VAX_AP_REGNUM));
258 sp = push_word (sp, (read_register (PS_REGNUM) & 0xffef) + 0x2fff0000);
259 sp = push_word (sp, 0);
260 write_register (SP_REGNUM, sp);
261 write_register (FP_REGNUM, sp);
262 write_register (VAX_AP_REGNUM, sp + (17 * 4));
268 CORE_ADDR fp = read_register (FP_REGNUM);
270 int regmask = read_memory_integer (fp + 4, 4);
272 write_register (PS_REGNUM,
274 | (read_register (PS_REGNUM) & 0xffff0000));
275 write_register (PC_REGNUM, read_memory_integer (fp + 16, 4));
276 write_register (FP_REGNUM, read_memory_integer (fp + 12, 4));
277 write_register (VAX_AP_REGNUM, read_memory_integer (fp + 8, 4));
279 for (regnum = 0; regnum < 12; regnum++)
280 if (regmask & (0x10000 << regnum))
281 write_register (regnum, read_memory_integer (fp += 4, 4));
282 fp = fp + 4 + ((regmask >> 30) & 3);
283 if (regmask & 0x20000000)
285 regnum = read_memory_integer (fp, 4);
286 fp += (regnum + 1) * 4;
288 write_register (SP_REGNUM, fp);
289 flush_cached_frames ();
292 /* The VAX call dummy sequence:
294 calls #69, @#32323232
297 It is 8 bytes long. The address and argc are patched by
298 vax_fix_call_dummy(). */
299 static LONGEST vax_call_dummy_words[] = { 0x329f69fb, 0x03323232 };
300 static int sizeof_vax_call_dummy_words = sizeof(vax_call_dummy_words);
303 vax_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
304 struct value **args, struct type *type, int gcc_p)
307 store_unsigned_integer (dummy + 3, 4, fun);
311 vax_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
313 write_register (1, addr);
317 vax_extract_return_value (struct type *valtype, char *regbuf, char *valbuf)
319 memcpy (valbuf, regbuf + REGISTER_BYTE (0), TYPE_LENGTH (valtype));
323 vax_store_return_value (struct type *valtype, char *valbuf)
325 deprecated_write_register_bytes (0, valbuf, TYPE_LENGTH (valtype));
329 vax_extract_struct_value_address (char *regbuf)
331 return (extract_address (regbuf + REGISTER_BYTE (0), REGISTER_RAW_SIZE (0)));
334 static const unsigned char *
335 vax_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
337 static const unsigned char vax_breakpoint[] = { 3 };
339 *lenptr = sizeof(vax_breakpoint);
340 return (vax_breakpoint);
343 /* Advance PC across any function entry prologue instructions
344 to reach some "real" code. */
347 vax_skip_prologue (CORE_ADDR pc)
349 register int op = (unsigned char) read_memory_integer (pc, 1);
351 pc += 2; /* skip brb */
353 pc += 3; /* skip brw */
355 && ((unsigned char) read_memory_integer (pc + 2, 1)) == 0x5E)
356 pc += 3; /* skip subl2 */
358 && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xAE
359 && ((unsigned char) read_memory_integer (pc + 3, 1)) == 0x5E)
360 pc += 4; /* skip movab */
362 && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xCE
363 && ((unsigned char) read_memory_integer (pc + 4, 1)) == 0x5E)
364 pc += 5; /* skip movab */
366 && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xEE
367 && ((unsigned char) read_memory_integer (pc + 6, 1)) == 0x5E)
368 pc += 7; /* skip movab */
373 vax_saved_pc_after_call (struct frame_info *frame)
375 return (DEPRECATED_FRAME_SAVED_PC(frame));
378 /* Print the vax instruction at address MEMADDR in debugged memory,
379 from disassembler info INFO.
380 Returns length of the instruction, in bytes. */
383 vax_print_insn (CORE_ADDR memaddr, disassemble_info *info)
385 unsigned char buffer[MAXLEN];
387 register unsigned char *p;
390 int status = (*info->read_memory_func) (memaddr, buffer, MAXLEN, info);
393 (*info->memory_error_func) (status, memaddr, info);
397 for (i = 0; i < NOPCODES; i++)
398 if (votstrs[i].detail.code == buffer[0]
399 || votstrs[i].detail.code == *(unsigned short *) buffer)
402 /* Handle undefined instructions. */
405 (*info->fprintf_func) (info->stream, "0%o", buffer[0]);
409 (*info->fprintf_func) (info->stream, "%s", votstrs[i].name);
411 /* Point at first byte of argument data,
412 and at descriptor for first argument. */
413 p = buffer + 1 + (votstrs[i].detail.code >= 0x100);
414 d = votstrs[i].detail.args;
417 (*info->fprintf_func) (info->stream, " ");
421 p = print_insn_arg (d, p, memaddr + (p - buffer), info);
424 (*info->fprintf_func) (info->stream, ",");
429 static unsigned char *
430 print_insn_arg (char *d, register char *p, CORE_ADDR addr,
431 disassemble_info *info)
433 register int regnum = *p & 0xf;
439 (*info->fprintf_func) (info->stream, "0x%x", addr + *p++ + 1);
442 (*info->fprintf_func) (info->stream, "0x%x", addr + *(short *) p + 2);
447 switch ((*p++ >> 4) & 0xf)
452 case 3: /* Literal mode */
453 if (d[1] == 'd' || d[1] == 'f' || d[1] == 'g' || d[1] == 'h')
455 *(int *) &floatlitbuf = 0x4000 + ((p[-1] & 0x3f) << 4);
456 (*info->fprintf_func) (info->stream, "$%f", floatlitbuf);
459 (*info->fprintf_func) (info->stream, "$%d", p[-1] & 0x3f);
462 case 4: /* Indexed */
463 p = (char *) print_insn_arg (d, p, addr + 1, info);
464 (*info->fprintf_func) (info->stream, "[%s]", REGISTER_NAME (regnum));
467 case 5: /* Register */
468 (*info->fprintf_func) (info->stream, REGISTER_NAME (regnum));
471 case 7: /* Autodecrement */
472 (*info->fprintf_func) (info->stream, "-");
473 case 6: /* Register deferred */
474 (*info->fprintf_func) (info->stream, "(%s)", REGISTER_NAME (regnum));
477 case 9: /* Autoincrement deferred */
478 (*info->fprintf_func) (info->stream, "@");
479 if (regnum == PC_REGNUM)
481 (*info->fprintf_func) (info->stream, "#");
482 info->target = *(long *) p;
483 (*info->print_address_func) (info->target, info);
487 case 8: /* Autoincrement */
488 if (regnum == PC_REGNUM)
490 (*info->fprintf_func) (info->stream, "#");
494 (*info->fprintf_func) (info->stream, "%d", *p++);
498 (*info->fprintf_func) (info->stream, "%d", *(short *) p);
503 (*info->fprintf_func) (info->stream, "%d", *(long *) p);
508 (*info->fprintf_func) (info->stream, "0x%x%08x",
509 ((long *) p)[1], ((long *) p)[0]);
514 (*info->fprintf_func) (info->stream, "0x%x%08x%08x%08x",
515 ((long *) p)[3], ((long *) p)[2],
516 ((long *) p)[1], ((long *) p)[0]);
521 if (INVALID_FLOAT (p, 4))
522 (*info->fprintf_func) (info->stream,
523 "<<invalid float 0x%x>>",
526 (*info->fprintf_func) (info->stream, "%f", *(float *) p);
531 if (INVALID_FLOAT (p, 8))
532 (*info->fprintf_func) (info->stream,
533 "<<invalid float 0x%x%08x>>",
534 ((long *) p)[1], ((long *) p)[0]);
536 (*info->fprintf_func) (info->stream, "%f", *(double *) p);
541 (*info->fprintf_func) (info->stream, "g-float");
546 (*info->fprintf_func) (info->stream, "h-float");
553 (*info->fprintf_func) (info->stream, "(%s)+", REGISTER_NAME (regnum));
556 case 11: /* Byte displacement deferred */
557 (*info->fprintf_func) (info->stream, "@");
558 case 10: /* Byte displacement */
559 if (regnum == PC_REGNUM)
561 info->target = addr + *p + 2;
562 (*info->print_address_func) (info->target, info);
565 (*info->fprintf_func) (info->stream, "%d(%s)", *p, REGISTER_NAME (regnum));
569 case 13: /* Word displacement deferred */
570 (*info->fprintf_func) (info->stream, "@");
571 case 12: /* Word displacement */
572 if (regnum == PC_REGNUM)
574 info->target = addr + *(short *) p + 3;
575 (*info->print_address_func) (info->target, info);
578 (*info->fprintf_func) (info->stream, "%d(%s)",
579 *(short *) p, REGISTER_NAME (regnum));
583 case 15: /* Long displacement deferred */
584 (*info->fprintf_func) (info->stream, "@");
585 case 14: /* Long displacement */
586 if (regnum == PC_REGNUM)
588 info->target = addr + *(short *) p + 5;
589 (*info->print_address_func) (info->target, info);
592 (*info->fprintf_func) (info->stream, "%d(%s)",
593 *(long *) p, REGISTER_NAME (regnum));
597 return (unsigned char *) p;
600 /* Initialize the current architecture based on INFO. If possible, re-use an
601 architecture from ARCHES, which is a list of architectures already created
602 during this debugging session.
604 Called e.g. at program startup, when reading a core file, and when reading
607 static struct gdbarch *
608 vax_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
610 struct gdbarch *gdbarch;
612 /* If there is already a candidate, use it. */
613 arches = gdbarch_list_lookup_by_info (arches, &info);
615 return arches->gdbarch;
617 gdbarch = gdbarch_alloc (&info, NULL);
619 /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
620 ready to unwind the PC first (see frame.c:get_prev_frame()). */
621 set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
624 set_gdbarch_num_regs (gdbarch, VAX_NUM_REGS);
625 set_gdbarch_sp_regnum (gdbarch, VAX_SP_REGNUM);
626 set_gdbarch_fp_regnum (gdbarch, VAX_FP_REGNUM);
627 set_gdbarch_pc_regnum (gdbarch, VAX_PC_REGNUM);
628 set_gdbarch_ps_regnum (gdbarch, VAX_PS_REGNUM);
630 set_gdbarch_register_name (gdbarch, vax_register_name);
631 set_gdbarch_register_size (gdbarch, VAX_REGISTER_SIZE);
632 set_gdbarch_register_bytes (gdbarch, VAX_REGISTER_BYTES);
633 set_gdbarch_register_byte (gdbarch, vax_register_byte);
634 set_gdbarch_register_raw_size (gdbarch, vax_register_raw_size);
635 set_gdbarch_deprecated_max_register_raw_size (gdbarch, VAX_MAX_REGISTER_RAW_SIZE);
636 set_gdbarch_register_virtual_size (gdbarch, vax_register_virtual_size);
637 set_gdbarch_deprecated_max_register_virtual_size (gdbarch,
638 VAX_MAX_REGISTER_VIRTUAL_SIZE);
639 set_gdbarch_register_virtual_type (gdbarch, vax_register_virtual_type);
641 /* Frame and stack info */
642 set_gdbarch_skip_prologue (gdbarch, vax_skip_prologue);
643 set_gdbarch_saved_pc_after_call (gdbarch, vax_saved_pc_after_call);
645 set_gdbarch_frame_num_args (gdbarch, vax_frame_num_args);
646 set_gdbarch_frameless_function_invocation (gdbarch,
647 generic_frameless_function_invocation_not);
649 set_gdbarch_deprecated_frame_chain (gdbarch, vax_frame_chain);
650 set_gdbarch_deprecated_frame_saved_pc (gdbarch, vax_frame_saved_pc);
652 set_gdbarch_frame_args_address (gdbarch, vax_frame_args_address);
653 set_gdbarch_frame_locals_address (gdbarch, vax_frame_locals_address);
655 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, vax_frame_init_saved_regs);
657 set_gdbarch_frame_args_skip (gdbarch, 4);
659 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
661 /* Return value info */
662 set_gdbarch_deprecated_store_struct_return (gdbarch, vax_store_struct_return);
663 set_gdbarch_deprecated_extract_return_value (gdbarch, vax_extract_return_value);
664 set_gdbarch_deprecated_store_return_value (gdbarch, vax_store_return_value);
665 set_gdbarch_deprecated_extract_struct_value_address (gdbarch, vax_extract_struct_value_address);
667 /* Call dummy info */
668 set_gdbarch_deprecated_push_dummy_frame (gdbarch, vax_push_dummy_frame);
669 set_gdbarch_deprecated_pop_frame (gdbarch, vax_pop_frame);
670 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
671 set_gdbarch_call_dummy_words (gdbarch, vax_call_dummy_words);
672 set_gdbarch_sizeof_call_dummy_words (gdbarch, sizeof_vax_call_dummy_words);
673 set_gdbarch_fix_call_dummy (gdbarch, vax_fix_call_dummy);
674 set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 7);
675 set_gdbarch_deprecated_use_generic_dummy_frames (gdbarch, 0);
676 set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
678 /* Breakpoint info */
679 set_gdbarch_breakpoint_from_pc (gdbarch, vax_breakpoint_from_pc);
680 set_gdbarch_decr_pc_after_break (gdbarch, 0);
683 set_gdbarch_function_start_offset (gdbarch, 2);
684 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
686 /* Should be using push_dummy_call. */
687 set_gdbarch_deprecated_dummy_write_sp (gdbarch, generic_target_write_sp);
689 /* Hook in ABI-specific overrides, if they have been registered. */
690 gdbarch_init_osabi (info, gdbarch);
696 _initialize_vax_tdep (void)
698 gdbarch_register (bfd_arch_vax, vax_gdbarch_init, NULL);
700 tm_print_insn = vax_print_insn;