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_frame_num_args_ftype vax_frame_num_args;
44 static gdbarch_deprecated_frame_chain_ftype vax_frame_chain;
45 static gdbarch_frame_args_address_ftype vax_frame_args_address;
46 static gdbarch_frame_locals_address_ftype vax_frame_locals_address;
48 static gdbarch_deprecated_extract_return_value_ftype vax_extract_return_value;
49 static gdbarch_deprecated_extract_struct_value_address_ftype
50 vax_extract_struct_value_address;
52 static gdbarch_deprecated_push_dummy_frame_ftype vax_push_dummy_frame;
54 /* Return 1 if P points to an invalid floating point value.
55 LEN is the length in bytes -- not relevant on the Vax. */
57 /* FIXME: cagney/2002-01-19: The macro below was originally defined in
58 tm-vax.h and used in values.c. Two problems. Firstly this is a
59 very non-portable and secondly it is wrong. The VAX should be
60 using floatformat and associated methods to identify and handle
61 invalid floating-point values. Adding to the poor target's woes
62 there is no floatformat_vax_{f,d} and no TARGET_FLOAT_FORMAT
65 /* FIXME: cagney/2002-01-19: It turns out that the only thing that
66 uses this macro is the vax disassembler code (so how old is this
67 target?). This target should instead be using the opcodes
68 disassembler. That allowing the macro to be eliminated. */
70 #define INVALID_FLOAT(p, len) ((*(short *) p & 0xff80) == 0x8000)
72 /* Vax instructions are never longer than this. */
75 /* Number of elements in the opcode table. */
76 #define NOPCODES (sizeof votstrs / sizeof votstrs[0])
78 static unsigned char *print_insn_arg ();
81 vax_register_name (int regno)
83 static char *register_names[] =
85 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
86 "r8", "r9", "r10", "r11", "ap", "fp", "sp", "pc",
92 if (regno >= (sizeof(register_names) / sizeof(*register_names)))
94 return (register_names[regno]);
98 vax_register_byte (int regno)
104 vax_register_raw_size (int regno)
110 vax_register_virtual_size (int regno)
116 vax_register_virtual_type (int regno)
118 return (builtin_type_int);
122 vax_frame_init_saved_regs (struct frame_info *frame)
127 if (get_frame_saved_regs (frame))
130 frame_saved_regs_zalloc (frame);
132 regmask = read_memory_integer (get_frame_base (frame) + 4, 4) >> 16;
134 next_addr = get_frame_base (frame) + 16;
136 /* regmask's low bit is for register 0, which is the first one
137 what would be pushed. */
138 for (regnum = 0; regnum < VAX_AP_REGNUM; regnum++)
140 if (regmask & (1 << regnum))
141 get_frame_saved_regs (frame)[regnum] = next_addr += 4;
144 get_frame_saved_regs (frame)[SP_REGNUM] = next_addr + 4;
145 if (regmask & (1 << DEPRECATED_FP_REGNUM))
146 get_frame_saved_regs (frame)[SP_REGNUM] +=
147 4 + (4 * read_memory_integer (next_addr + 4, 4));
149 get_frame_saved_regs (frame)[PC_REGNUM] = get_frame_base (frame) + 16;
150 get_frame_saved_regs (frame)[DEPRECATED_FP_REGNUM] = get_frame_base (frame) + 12;
151 get_frame_saved_regs (frame)[VAX_AP_REGNUM] = get_frame_base (frame) + 8;
152 get_frame_saved_regs (frame)[PS_REGNUM] = get_frame_base (frame) + 4;
155 /* Get saved user PC for sigtramp from sigcontext for BSD style sigtramp. */
158 vax_sigtramp_saved_pc (struct frame_info *frame)
160 CORE_ADDR sigcontext_addr;
162 int ptrbytes = TYPE_LENGTH (builtin_type_void_func_ptr);
163 int sigcontext_offs = (2 * TARGET_INT_BIT) / TARGET_CHAR_BIT;
165 buf = alloca (ptrbytes);
166 /* Get sigcontext address, it is the third parameter on the stack. */
167 if (get_next_frame (frame))
168 sigcontext_addr = read_memory_typed_address
169 (FRAME_ARGS_ADDRESS (get_next_frame (frame))
170 + FRAME_ARGS_SKIP + sigcontext_offs,
171 builtin_type_void_data_ptr);
173 sigcontext_addr = read_memory_typed_address
174 (read_register (SP_REGNUM) + sigcontext_offs, builtin_type_void_data_ptr);
176 /* Don't cause a memory_error when accessing sigcontext in case the stack
177 layout has changed or the stack is corrupt. */
178 target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes);
179 return extract_typed_address (buf, builtin_type_void_func_ptr);
183 vax_frame_saved_pc (struct frame_info *frame)
185 if ((get_frame_type (frame) == SIGTRAMP_FRAME))
186 return (vax_sigtramp_saved_pc (frame)); /* XXXJRT */
188 return (read_memory_integer (get_frame_base (frame) + 16, 4));
192 vax_frame_args_address_correct (struct frame_info *frame)
194 /* Cannot find the AP register value directly from the FP value. Must
195 find it saved in the frame called by this one, or in the AP register
196 for the innermost frame. However, there is no way to tell the
197 difference between the innermost frame and a frame for which we
198 just don't know the frame that it called (e.g. "info frame 0x7ffec789").
199 For the sake of argument, suppose that the stack is somewhat trashed
200 (which is one reason that "info frame" exists). So, return 0 (indicating
201 we don't know the address of the arglist) if we don't know what frame
203 if (get_next_frame (frame))
204 return (read_memory_integer (get_frame_base (get_next_frame (frame)) + 8, 4));
210 vax_frame_args_address (struct frame_info *frame)
212 /* In most of GDB, getting the args address is too important to
213 just say "I don't know". This is sometimes wrong for functions
214 that aren't on top of the stack, but c'est la vie. */
215 if (get_next_frame (frame))
216 return (read_memory_integer (get_frame_base (get_next_frame (frame)) + 8, 4));
218 return (read_register (VAX_AP_REGNUM));
222 vax_frame_locals_address (struct frame_info *frame)
224 return (get_frame_base (frame));
228 vax_frame_num_args (struct frame_info *fi)
230 return (0xff & read_memory_integer (FRAME_ARGS_ADDRESS (fi), 1));
234 vax_frame_chain (struct frame_info *frame)
236 /* In the case of the VAX, the frame's nominal address is the FP value,
237 and 12 bytes later comes the saved previous FP value as a 4-byte word. */
238 if (inside_entry_file (get_frame_pc (frame)))
241 return (read_memory_integer (get_frame_base (frame) + 12, 4));
245 vax_push_dummy_frame (void)
247 CORE_ADDR sp = read_register (SP_REGNUM);
250 sp = push_word (sp, 0); /* arglist */
251 for (regnum = 11; regnum >= 0; regnum--)
252 sp = push_word (sp, read_register (regnum));
253 sp = push_word (sp, read_register (PC_REGNUM));
254 sp = push_word (sp, read_register (DEPRECATED_FP_REGNUM));
255 sp = push_word (sp, read_register (VAX_AP_REGNUM));
256 sp = push_word (sp, (read_register (PS_REGNUM) & 0xffef) + 0x2fff0000);
257 sp = push_word (sp, 0);
258 write_register (SP_REGNUM, sp);
259 write_register (DEPRECATED_FP_REGNUM, sp);
260 write_register (VAX_AP_REGNUM, sp + (17 * 4));
266 CORE_ADDR fp = read_register (DEPRECATED_FP_REGNUM);
268 int regmask = read_memory_integer (fp + 4, 4);
270 write_register (PS_REGNUM,
272 | (read_register (PS_REGNUM) & 0xffff0000));
273 write_register (PC_REGNUM, read_memory_integer (fp + 16, 4));
274 write_register (DEPRECATED_FP_REGNUM, read_memory_integer (fp + 12, 4));
275 write_register (VAX_AP_REGNUM, read_memory_integer (fp + 8, 4));
277 for (regnum = 0; regnum < 12; regnum++)
278 if (regmask & (0x10000 << regnum))
279 write_register (regnum, read_memory_integer (fp += 4, 4));
280 fp = fp + 4 + ((regmask >> 30) & 3);
281 if (regmask & 0x20000000)
283 regnum = read_memory_integer (fp, 4);
284 fp += (regnum + 1) * 4;
286 write_register (SP_REGNUM, fp);
287 flush_cached_frames ();
290 /* The VAX call dummy sequence:
292 calls #69, @#32323232
295 It is 8 bytes long. The address and argc are patched by
296 vax_fix_call_dummy(). */
297 static LONGEST vax_call_dummy_words[] = { 0x329f69fb, 0x03323232 };
298 static int sizeof_vax_call_dummy_words = sizeof(vax_call_dummy_words);
301 vax_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
302 struct value **args, struct type *type, int gcc_p)
305 store_unsigned_integer (dummy + 3, 4, fun);
309 vax_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
311 write_register (1, addr);
315 vax_extract_return_value (struct type *valtype, char *regbuf, char *valbuf)
317 memcpy (valbuf, regbuf + REGISTER_BYTE (0), TYPE_LENGTH (valtype));
321 vax_store_return_value (struct type *valtype, char *valbuf)
323 deprecated_write_register_bytes (0, valbuf, TYPE_LENGTH (valtype));
327 vax_extract_struct_value_address (char *regbuf)
329 return (extract_address (regbuf + REGISTER_BYTE (0), REGISTER_RAW_SIZE (0)));
332 static const unsigned char *
333 vax_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
335 static const unsigned char vax_breakpoint[] = { 3 };
337 *lenptr = sizeof(vax_breakpoint);
338 return (vax_breakpoint);
341 /* Advance PC across any function entry prologue instructions
342 to reach some "real" code. */
345 vax_skip_prologue (CORE_ADDR pc)
347 register int op = (unsigned char) read_memory_integer (pc, 1);
349 pc += 2; /* skip brb */
351 pc += 3; /* skip brw */
353 && ((unsigned char) read_memory_integer (pc + 2, 1)) == 0x5E)
354 pc += 3; /* skip subl2 */
356 && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xAE
357 && ((unsigned char) read_memory_integer (pc + 3, 1)) == 0x5E)
358 pc += 4; /* skip movab */
360 && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xCE
361 && ((unsigned char) read_memory_integer (pc + 4, 1)) == 0x5E)
362 pc += 5; /* skip movab */
364 && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xEE
365 && ((unsigned char) read_memory_integer (pc + 6, 1)) == 0x5E)
366 pc += 7; /* skip movab */
371 vax_saved_pc_after_call (struct frame_info *frame)
373 return (DEPRECATED_FRAME_SAVED_PC(frame));
376 /* Print the vax instruction at address MEMADDR in debugged memory,
377 from disassembler info INFO.
378 Returns length of the instruction, in bytes. */
381 vax_print_insn (CORE_ADDR memaddr, disassemble_info *info)
383 unsigned char buffer[MAXLEN];
385 register unsigned char *p;
388 int status = (*info->read_memory_func) (memaddr, buffer, MAXLEN, info);
391 (*info->memory_error_func) (status, memaddr, info);
395 for (i = 0; i < NOPCODES; i++)
396 if (votstrs[i].detail.code == buffer[0]
397 || votstrs[i].detail.code == *(unsigned short *) buffer)
400 /* Handle undefined instructions. */
403 (*info->fprintf_func) (info->stream, "0%o", buffer[0]);
407 (*info->fprintf_func) (info->stream, "%s", votstrs[i].name);
409 /* Point at first byte of argument data,
410 and at descriptor for first argument. */
411 p = buffer + 1 + (votstrs[i].detail.code >= 0x100);
412 d = votstrs[i].detail.args;
415 (*info->fprintf_func) (info->stream, " ");
419 p = print_insn_arg (d, p, memaddr + (p - buffer), info);
422 (*info->fprintf_func) (info->stream, ",");
427 static unsigned char *
428 print_insn_arg (char *d, register char *p, CORE_ADDR addr,
429 disassemble_info *info)
431 register int regnum = *p & 0xf;
437 (*info->fprintf_func) (info->stream, "0x%x", addr + *p++ + 1);
440 (*info->fprintf_func) (info->stream, "0x%x", addr + *(short *) p + 2);
445 switch ((*p++ >> 4) & 0xf)
450 case 3: /* Literal mode */
451 if (d[1] == 'd' || d[1] == 'f' || d[1] == 'g' || d[1] == 'h')
453 *(int *) &floatlitbuf = 0x4000 + ((p[-1] & 0x3f) << 4);
454 (*info->fprintf_func) (info->stream, "$%f", floatlitbuf);
457 (*info->fprintf_func) (info->stream, "$%d", p[-1] & 0x3f);
460 case 4: /* Indexed */
461 p = (char *) print_insn_arg (d, p, addr + 1, info);
462 (*info->fprintf_func) (info->stream, "[%s]", REGISTER_NAME (regnum));
465 case 5: /* Register */
466 (*info->fprintf_func) (info->stream, REGISTER_NAME (regnum));
469 case 7: /* Autodecrement */
470 (*info->fprintf_func) (info->stream, "-");
471 case 6: /* Register deferred */
472 (*info->fprintf_func) (info->stream, "(%s)", REGISTER_NAME (regnum));
475 case 9: /* Autoincrement deferred */
476 (*info->fprintf_func) (info->stream, "@");
477 if (regnum == PC_REGNUM)
479 (*info->fprintf_func) (info->stream, "#");
480 info->target = *(long *) p;
481 (*info->print_address_func) (info->target, info);
485 case 8: /* Autoincrement */
486 if (regnum == PC_REGNUM)
488 (*info->fprintf_func) (info->stream, "#");
492 (*info->fprintf_func) (info->stream, "%d", *p++);
496 (*info->fprintf_func) (info->stream, "%d", *(short *) p);
501 (*info->fprintf_func) (info->stream, "%d", *(long *) p);
506 (*info->fprintf_func) (info->stream, "0x%x%08x",
507 ((long *) p)[1], ((long *) p)[0]);
512 (*info->fprintf_func) (info->stream, "0x%x%08x%08x%08x",
513 ((long *) p)[3], ((long *) p)[2],
514 ((long *) p)[1], ((long *) p)[0]);
519 if (INVALID_FLOAT (p, 4))
520 (*info->fprintf_func) (info->stream,
521 "<<invalid float 0x%x>>",
524 (*info->fprintf_func) (info->stream, "%f", *(float *) p);
529 if (INVALID_FLOAT (p, 8))
530 (*info->fprintf_func) (info->stream,
531 "<<invalid float 0x%x%08x>>",
532 ((long *) p)[1], ((long *) p)[0]);
534 (*info->fprintf_func) (info->stream, "%f", *(double *) p);
539 (*info->fprintf_func) (info->stream, "g-float");
544 (*info->fprintf_func) (info->stream, "h-float");
551 (*info->fprintf_func) (info->stream, "(%s)+", REGISTER_NAME (regnum));
554 case 11: /* Byte displacement deferred */
555 (*info->fprintf_func) (info->stream, "@");
556 case 10: /* Byte displacement */
557 if (regnum == PC_REGNUM)
559 info->target = addr + *p + 2;
560 (*info->print_address_func) (info->target, info);
563 (*info->fprintf_func) (info->stream, "%d(%s)", *p, REGISTER_NAME (regnum));
567 case 13: /* Word displacement deferred */
568 (*info->fprintf_func) (info->stream, "@");
569 case 12: /* Word displacement */
570 if (regnum == PC_REGNUM)
572 info->target = addr + *(short *) p + 3;
573 (*info->print_address_func) (info->target, info);
576 (*info->fprintf_func) (info->stream, "%d(%s)",
577 *(short *) p, REGISTER_NAME (regnum));
581 case 15: /* Long displacement deferred */
582 (*info->fprintf_func) (info->stream, "@");
583 case 14: /* Long displacement */
584 if (regnum == PC_REGNUM)
586 info->target = addr + *(short *) p + 5;
587 (*info->print_address_func) (info->target, info);
590 (*info->fprintf_func) (info->stream, "%d(%s)",
591 *(long *) p, REGISTER_NAME (regnum));
595 return (unsigned char *) p;
598 /* Initialize the current architecture based on INFO. If possible, re-use an
599 architecture from ARCHES, which is a list of architectures already created
600 during this debugging session.
602 Called e.g. at program startup, when reading a core file, and when reading
605 static struct gdbarch *
606 vax_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
608 struct gdbarch *gdbarch;
610 /* If there is already a candidate, use it. */
611 arches = gdbarch_list_lookup_by_info (arches, &info);
613 return arches->gdbarch;
615 gdbarch = gdbarch_alloc (&info, NULL);
617 /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
618 ready to unwind the PC first (see frame.c:get_prev_frame()). */
619 set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
622 set_gdbarch_num_regs (gdbarch, VAX_NUM_REGS);
623 set_gdbarch_sp_regnum (gdbarch, VAX_SP_REGNUM);
624 set_gdbarch_deprecated_fp_regnum (gdbarch, VAX_FP_REGNUM);
625 set_gdbarch_pc_regnum (gdbarch, VAX_PC_REGNUM);
626 set_gdbarch_ps_regnum (gdbarch, VAX_PS_REGNUM);
628 set_gdbarch_register_name (gdbarch, vax_register_name);
629 set_gdbarch_deprecated_register_size (gdbarch, VAX_REGISTER_SIZE);
630 set_gdbarch_register_bytes (gdbarch, VAX_REGISTER_BYTES);
631 set_gdbarch_register_byte (gdbarch, vax_register_byte);
632 set_gdbarch_register_raw_size (gdbarch, vax_register_raw_size);
633 set_gdbarch_deprecated_max_register_raw_size (gdbarch, VAX_MAX_REGISTER_RAW_SIZE);
634 set_gdbarch_register_virtual_size (gdbarch, vax_register_virtual_size);
635 set_gdbarch_deprecated_max_register_virtual_size (gdbarch,
636 VAX_MAX_REGISTER_VIRTUAL_SIZE);
637 set_gdbarch_register_virtual_type (gdbarch, vax_register_virtual_type);
639 /* Frame and stack info */
640 set_gdbarch_skip_prologue (gdbarch, vax_skip_prologue);
641 set_gdbarch_deprecated_saved_pc_after_call (gdbarch, vax_saved_pc_after_call);
643 set_gdbarch_frame_num_args (gdbarch, vax_frame_num_args);
644 set_gdbarch_frameless_function_invocation (gdbarch,
645 generic_frameless_function_invocation_not);
647 set_gdbarch_deprecated_frame_chain (gdbarch, vax_frame_chain);
648 set_gdbarch_deprecated_frame_saved_pc (gdbarch, vax_frame_saved_pc);
650 set_gdbarch_frame_args_address (gdbarch, vax_frame_args_address);
651 set_gdbarch_frame_locals_address (gdbarch, vax_frame_locals_address);
653 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, vax_frame_init_saved_regs);
655 set_gdbarch_frame_args_skip (gdbarch, 4);
657 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
659 /* Return value info */
660 set_gdbarch_deprecated_store_struct_return (gdbarch, vax_store_struct_return);
661 set_gdbarch_deprecated_extract_return_value (gdbarch, vax_extract_return_value);
662 set_gdbarch_deprecated_store_return_value (gdbarch, vax_store_return_value);
663 set_gdbarch_deprecated_extract_struct_value_address (gdbarch, vax_extract_struct_value_address);
665 /* Call dummy info */
666 set_gdbarch_deprecated_push_dummy_frame (gdbarch, vax_push_dummy_frame);
667 set_gdbarch_deprecated_pop_frame (gdbarch, vax_pop_frame);
668 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
669 set_gdbarch_deprecated_call_dummy_words (gdbarch, vax_call_dummy_words);
670 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, sizeof_vax_call_dummy_words);
671 set_gdbarch_deprecated_fix_call_dummy (gdbarch, vax_fix_call_dummy);
672 set_gdbarch_deprecated_call_dummy_breakpoint_offset (gdbarch, 7);
673 set_gdbarch_deprecated_use_generic_dummy_frames (gdbarch, 0);
674 set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
676 /* Breakpoint info */
677 set_gdbarch_breakpoint_from_pc (gdbarch, vax_breakpoint_from_pc);
678 set_gdbarch_decr_pc_after_break (gdbarch, 0);
681 set_gdbarch_function_start_offset (gdbarch, 2);
682 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
684 /* Should be using push_dummy_call. */
685 set_gdbarch_deprecated_dummy_write_sp (gdbarch, generic_target_write_sp);
687 /* Hook in ABI-specific overrides, if they have been registered. */
688 gdbarch_init_osabi (info, gdbarch);
694 _initialize_vax_tdep (void)
696 gdbarch_register (bfd_arch_vax, vax_gdbarch_init, NULL);
698 deprecated_tm_print_insn = vax_print_insn;