1 /* Target dependent code for the NS32000, for GDB.
2 Copyright 1986, 1988, 1991, 1992, 1994, 1995, 1998, 1999, 2000, 2001,
3 2002, 2003 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. */
29 #include "arch-utils.h"
33 #include "ns32k-tdep.h"
34 #include "gdb_string.h"
36 static int sign_extend (int value, int bits);
37 static CORE_ADDR ns32k_get_enter_addr (CORE_ADDR);
38 static int ns32k_localcount (CORE_ADDR enter_pc);
39 static void flip_bytes (void *, int);
42 ns32k_register_name_32082 (int regno)
44 static char *register_names[] =
46 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
47 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
48 "sp", "fp", "pc", "ps",
49 "l0", "l1", "l2", "l3", "xx",
54 if (regno >= sizeof (register_names) / sizeof (*register_names))
57 return (register_names[regno]);
61 ns32k_register_name_32382 (int regno)
63 static char *register_names[] =
65 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
66 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
67 "sp", "fp", "pc", "ps",
69 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7", "xx",
74 if (regno >= sizeof (register_names) / sizeof (*register_names))
77 return (register_names[regno]);
81 ns32k_register_byte_32082 (int regno)
83 if (regno >= NS32K_LP0_REGNUM)
84 return (NS32K_LP0_REGNUM * 4) + ((regno - NS32K_LP0_REGNUM) * 8);
90 ns32k_register_byte_32382 (int regno)
92 /* This is a bit yuk. The even numbered double precision floating
93 point long registers occupy the same space as the even:odd numbered
94 single precision floating point registers, but the extra 32381 FPU
95 registers are at the end. Doing it this way is compatible for both
96 32081 and 32381 equipped machines. */
98 return ((regno < NS32K_LP0_REGNUM ? regno
99 : (regno - NS32K_LP0_REGNUM) & 1 ? regno - 1
100 : (regno - NS32K_LP0_REGNUM + FP0_REGNUM)) * 4);
104 ns32k_register_raw_size (int regno)
106 /* All registers are 4 bytes, except for the doubled floating
109 return ((regno >= NS32K_LP0_REGNUM) ? 8 : 4);
113 ns32k_register_virtual_size (int regno)
115 return ((regno >= NS32K_LP0_REGNUM) ? 8 : 4);
119 ns32k_register_virtual_type (int regno)
121 if (regno < FP0_REGNUM)
122 return (builtin_type_int);
124 if (regno < FP0_REGNUM + 8)
125 return (builtin_type_float);
127 if (regno < NS32K_LP0_REGNUM)
128 return (builtin_type_int);
130 return (builtin_type_double);
133 /* Immediately after a function call, return the saved PC. Can't
134 always go through the frames for this because on some systems,
135 the new frame is not set up until the new function executes some
139 ns32k_saved_pc_after_call (struct frame_info *frame)
141 return (read_memory_integer (read_register (SP_REGNUM), 4));
144 /* Advance PC across any function entry prologue instructions
145 to reach some "real" code. */
148 umax_skip_prologue (CORE_ADDR pc)
150 unsigned char op = read_memory_integer (pc, 1);
153 op = read_memory_integer (pc + 2, 1);
154 if ((op & 0x80) == 0)
156 else if ((op & 0xc0) == 0x80)
164 static const unsigned char *
165 ns32k_breakpoint_from_pc (CORE_ADDR *pcp, int *lenp)
167 static const unsigned char breakpoint_insn[] = { 0xf2 };
169 *lenp = sizeof (breakpoint_insn);
170 return breakpoint_insn;
173 /* Return number of args passed to a frame.
174 Can return -1, meaning no way to tell.
175 Encore's C compiler often reuses same area on stack for args,
176 so this will often not work properly. If the arg names
177 are known, it's likely most of them will be printed. */
180 umax_frame_num_args (struct frame_info *fi)
184 CORE_ADDR enter_addr;
186 unsigned int addr_mode;
190 enter_addr = ns32k_get_enter_addr (get_frame_pc (fi));
193 pc = ((enter_addr == 1)
194 ? DEPRECATED_SAVED_PC_AFTER_CALL (fi)
195 : DEPRECATED_FRAME_SAVED_PC (fi));
196 insn = read_memory_integer (pc, 2);
197 addr_mode = (insn >> 11) & 0x1f;
199 if ((insn & 0x7fc) == 0x57c
200 && addr_mode == 0x14) /* immediate */
202 if (insn == 0x57c) /* adjspb */
204 else if (insn == 0x57d) /* adjspw */
206 else if (insn == 0x57f) /* adjspd */
209 internal_error (__FILE__, __LINE__, "bad else");
210 numargs = read_memory_integer (pc + 2, width);
212 flip_bytes (&numargs, width);
213 numargs = -sign_extend (numargs, width * 8) / 4;
220 sign_extend (int value, int bits)
222 value = value & ((1 << bits) - 1);
223 return (value & (1 << (bits - 1))
224 ? value | (~((1 << bits) - 1))
229 flip_bytes (void *p, int count)
237 ptr[0] = ptr[count - 1];
238 ptr[count - 1] = tmp;
244 /* Return the number of locals in the current frame given a
245 pc pointing to the enter instruction. This is used by
246 ns32k_frame_init_saved_regs. */
249 ns32k_localcount (CORE_ADDR enter_pc)
251 unsigned char localtype;
254 localtype = read_memory_integer (enter_pc + 2, 1);
255 if ((localtype & 0x80) == 0)
256 localcount = localtype;
257 else if ((localtype & 0xc0) == 0x80)
258 localcount = (((localtype & 0x3f) << 8)
259 | (read_memory_integer (enter_pc + 3, 1) & 0xff));
261 localcount = (((localtype & 0x3f) << 24)
262 | ((read_memory_integer (enter_pc + 3, 1) & 0xff) << 16)
263 | ((read_memory_integer (enter_pc + 4, 1) & 0xff) << 8)
264 | (read_memory_integer (enter_pc + 5, 1) & 0xff));
269 /* Nonzero if instruction at PC is a return instruction. */
272 ns32k_about_to_return (CORE_ADDR pc)
274 return (read_memory_integer (pc, 1) == 0x12);
277 /* Get the address of the enter opcode for this function, if it is active.
278 Returns positive address > 1 if pc is between enter/exit,
279 1 if pc before enter or after exit, 0 otherwise. */
281 ns32k_get_enter_addr (CORE_ADDR pc)
283 CORE_ADDR enter_addr;
289 if (ns32k_about_to_return (pc))
290 return 1; /* after exit */
292 enter_addr = get_pc_function_start (pc);
294 if (pc == enter_addr)
295 return 1; /* before enter */
297 op = read_memory_integer (enter_addr, 1);
300 return 0; /* function has no enter/exit */
302 return enter_addr; /* pc is between enter and exit */
306 ns32k_frame_chain (struct frame_info *frame)
308 /* In the case of the NS32000 series, the frame's nominal address is the
309 FP value, and that address is saved at the previous FP value as a
312 if (deprecated_inside_entry_file (get_frame_pc (frame)))
315 return (read_memory_integer (get_frame_base (frame), 4));
320 ns32k_sigtramp_saved_pc (struct frame_info *frame)
322 CORE_ADDR sigcontext_addr;
324 int ptrbytes = TYPE_LENGTH (builtin_type_void_func_ptr);
325 int sigcontext_offs = (2 * TARGET_INT_BIT) / TARGET_CHAR_BIT;
327 buf = alloca (ptrbytes);
328 /* Get sigcontext address, it is the third parameter on the stack. */
329 if (get_next_frame (frame))
330 sigcontext_addr = read_memory_typed_address
331 (DEPRECATED_FRAME_ARGS_ADDRESS (get_next_frame (frame)) + FRAME_ARGS_SKIP + sigcontext_offs,
332 builtin_type_void_data_ptr);
334 sigcontext_addr = read_memory_typed_address
335 (read_register (SP_REGNUM) + sigcontext_offs, builtin_type_void_data_ptr);
337 /* Don't cause a memory_error when accessing sigcontext in case the stack
338 layout has changed or the stack is corrupt. */
339 target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes);
340 return extract_typed_address (buf, builtin_type_void_func_ptr);
344 ns32k_frame_saved_pc (struct frame_info *frame)
346 if ((get_frame_type (frame) == SIGTRAMP_FRAME))
347 return (ns32k_sigtramp_saved_pc (frame)); /* XXXJRT */
349 return (read_memory_integer (get_frame_base (frame) + 4, 4));
353 ns32k_frame_args_address (struct frame_info *frame)
355 if (ns32k_get_enter_addr (get_frame_pc (frame)) > 1)
356 return (get_frame_base (frame));
358 return (read_register (SP_REGNUM) - 4);
361 /* Code to initialize the addresses of the saved registers of frame described
362 by FRAME_INFO. This includes special registers such as pc and fp saved in
363 special ways in the stack frame. sp is even more special: the address we
364 return for it IS the sp for the next frame. */
367 ns32k_frame_init_saved_regs (struct frame_info *frame)
371 CORE_ADDR enter_addr, next_addr;
373 if (get_frame_saved_regs (frame))
376 frame_saved_regs_zalloc (frame);
378 enter_addr = ns32k_get_enter_addr (get_frame_pc (frame));
381 regmask = read_memory_integer (enter_addr + 1, 1) & 0xff;
382 localcount = ns32k_localcount (enter_addr);
383 next_addr = get_frame_base (frame) + localcount;
385 for (regnum = 0; regnum < 8; regnum++)
387 if (regmask & (1 << regnum))
388 get_frame_saved_regs (frame)[regnum] = next_addr -= 4;
391 get_frame_saved_regs (frame)[SP_REGNUM] = get_frame_base (frame) + 4;
392 get_frame_saved_regs (frame)[PC_REGNUM] = get_frame_base (frame) + 4;
393 get_frame_saved_regs (frame)[DEPRECATED_FP_REGNUM] = read_memory_integer (get_frame_base (frame), 4);
395 else if (enter_addr == 1)
397 CORE_ADDR sp = read_register (SP_REGNUM);
398 get_frame_saved_regs (frame)[PC_REGNUM] = sp;
399 get_frame_saved_regs (frame)[SP_REGNUM] = sp + 4;
404 ns32k_push_dummy_frame (void)
406 CORE_ADDR sp = read_register (SP_REGNUM);
409 sp = push_word (sp, read_register (PC_REGNUM));
410 sp = push_word (sp, read_register (DEPRECATED_FP_REGNUM));
411 write_register (DEPRECATED_FP_REGNUM, sp);
413 for (regnum = 0; regnum < 8; regnum++)
414 sp = push_word (sp, read_register (regnum));
416 write_register (SP_REGNUM, sp);
420 ns32k_pop_frame (void)
422 struct frame_info *frame = get_current_frame ();
426 fp = get_frame_base (frame);
427 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
429 for (regnum = 0; regnum < 8; regnum++)
430 if (get_frame_saved_regs (frame)[regnum])
431 write_register (regnum,
432 read_memory_integer (get_frame_saved_regs (frame)[regnum], 4));
434 write_register (DEPRECATED_FP_REGNUM, read_memory_integer (fp, 4));
435 write_register (PC_REGNUM, read_memory_integer (fp + 4, 4));
436 write_register (SP_REGNUM, fp + 8);
437 flush_cached_frames ();
440 /* The NS32000 call dummy sequence:
442 enter 0xff,0 82 ff 00
443 jsr @0x00010203 7f ae c0 01 02 03
444 adjspd 0x69696969 7f a5 01 02 03 04
447 It is 16 bytes long. */
449 static LONGEST ns32k_call_dummy_words[] =
456 static int sizeof_ns32k_call_dummy_words = sizeof (ns32k_call_dummy_words);
458 #define NS32K_CALL_DUMMY_ADDR 5
459 #define NS32K_CALL_DUMMY_NARGS 11
462 ns32k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
463 struct value **args, struct type *type, int gcc_p)
467 flipped = fun | 0xc0000000;
468 flip_bytes (&flipped, 4);
469 store_unsigned_integer (dummy + NS32K_CALL_DUMMY_ADDR, 4, flipped);
471 flipped = - nargs * 4;
472 flip_bytes (&flipped, 4);
473 store_unsigned_integer (dummy + NS32K_CALL_DUMMY_NARGS, 4, flipped);
477 ns32k_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
479 /* On this machine, this is a no-op (Encore Umax didn't use GCC). */
483 ns32k_extract_return_value (struct type *valtype, char *regbuf, char *valbuf)
486 regbuf + REGISTER_BYTE (TYPE_CODE (valtype) == TYPE_CODE_FLT ?
487 FP0_REGNUM : 0), TYPE_LENGTH (valtype));
491 ns32k_store_return_value (struct type *valtype, char *valbuf)
493 deprecated_write_register_bytes (TYPE_CODE (valtype) == TYPE_CODE_FLT
494 ? FP0_REGNUM : 0, valbuf,
495 TYPE_LENGTH (valtype));
499 ns32k_extract_struct_value_address (char *regbuf)
501 return (extract_unsigned_integer (regbuf + REGISTER_BYTE (0), REGISTER_RAW_SIZE (0)));
505 ns32k_gdbarch_init_32082 (struct gdbarch *gdbarch)
507 set_gdbarch_num_regs (gdbarch, NS32K_NUM_REGS_32082);
509 set_gdbarch_register_name (gdbarch, ns32k_register_name_32082);
510 set_gdbarch_deprecated_register_bytes (gdbarch, NS32K_REGISTER_BYTES_32082);
511 set_gdbarch_deprecated_register_byte (gdbarch, ns32k_register_byte_32082);
515 ns32k_gdbarch_init_32382 (struct gdbarch *gdbarch)
517 set_gdbarch_num_regs (gdbarch, NS32K_NUM_REGS_32382);
519 set_gdbarch_register_name (gdbarch, ns32k_register_name_32382);
520 set_gdbarch_deprecated_register_bytes (gdbarch, NS32K_REGISTER_BYTES_32382);
521 set_gdbarch_deprecated_register_byte (gdbarch, ns32k_register_byte_32382);
524 /* Initialize the current architecture based on INFO. If possible, re-use an
525 architecture from ARCHES, which is a list of architectures already created
526 during this debugging session.
528 Called e.g. at program startup, when reading a core file, and when reading
531 static struct gdbarch *
532 ns32k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
534 struct gdbarch *gdbarch;
536 /* If there is already a candidate, use it. */
537 arches = gdbarch_list_lookup_by_info (arches, &info);
539 return arches->gdbarch;
541 gdbarch = gdbarch_alloc (&info, NULL);
543 /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
544 ready to unwind the PC first (see frame.c:get_prev_frame()). */
545 set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
548 ns32k_gdbarch_init_32082 (gdbarch);
549 set_gdbarch_num_regs (gdbarch, NS32K_SP_REGNUM);
550 set_gdbarch_num_regs (gdbarch, NS32K_FP_REGNUM);
551 set_gdbarch_num_regs (gdbarch, NS32K_PC_REGNUM);
552 set_gdbarch_num_regs (gdbarch, NS32K_PS_REGNUM);
554 set_gdbarch_deprecated_register_size (gdbarch, NS32K_REGISTER_SIZE);
555 set_gdbarch_deprecated_register_raw_size (gdbarch, ns32k_register_raw_size);
556 set_gdbarch_deprecated_max_register_raw_size (gdbarch, NS32K_MAX_REGISTER_RAW_SIZE);
557 set_gdbarch_deprecated_register_virtual_size (gdbarch, ns32k_register_virtual_size);
558 set_gdbarch_deprecated_max_register_virtual_size (gdbarch,
559 NS32K_MAX_REGISTER_VIRTUAL_SIZE);
560 set_gdbarch_deprecated_register_virtual_type (gdbarch, ns32k_register_virtual_type);
562 /* Frame and stack info */
563 set_gdbarch_skip_prologue (gdbarch, umax_skip_prologue);
564 set_gdbarch_deprecated_saved_pc_after_call (gdbarch, ns32k_saved_pc_after_call);
566 set_gdbarch_frame_num_args (gdbarch, umax_frame_num_args);
567 set_gdbarch_frameless_function_invocation (gdbarch,
568 generic_frameless_function_invocation_not);
570 set_gdbarch_deprecated_frame_chain (gdbarch, ns32k_frame_chain);
571 set_gdbarch_deprecated_frame_saved_pc (gdbarch, ns32k_frame_saved_pc);
573 set_gdbarch_deprecated_frame_args_address (gdbarch, ns32k_frame_args_address);
575 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, ns32k_frame_init_saved_regs);
577 set_gdbarch_frame_args_skip (gdbarch, 8);
579 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
581 /* Return value info */
582 set_gdbarch_deprecated_store_struct_return (gdbarch, ns32k_store_struct_return);
583 set_gdbarch_deprecated_extract_return_value (gdbarch, ns32k_extract_return_value);
584 set_gdbarch_deprecated_store_return_value (gdbarch, ns32k_store_return_value);
585 set_gdbarch_deprecated_extract_struct_value_address (gdbarch,
586 ns32k_extract_struct_value_address);
588 /* Call dummy info */
589 set_gdbarch_deprecated_push_dummy_frame (gdbarch, ns32k_push_dummy_frame);
590 set_gdbarch_deprecated_pop_frame (gdbarch, ns32k_pop_frame);
591 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
592 set_gdbarch_deprecated_call_dummy_words (gdbarch, ns32k_call_dummy_words);
593 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, sizeof_ns32k_call_dummy_words);
594 set_gdbarch_deprecated_fix_call_dummy (gdbarch, ns32k_fix_call_dummy);
595 set_gdbarch_deprecated_call_dummy_start_offset (gdbarch, 3);
596 set_gdbarch_deprecated_call_dummy_breakpoint_offset (gdbarch, 15);
597 set_gdbarch_deprecated_use_generic_dummy_frames (gdbarch, 0);
598 set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
600 /* Breakpoint info */
601 set_gdbarch_decr_pc_after_break (gdbarch, 0);
602 set_gdbarch_breakpoint_from_pc (gdbarch, ns32k_breakpoint_from_pc);
605 set_gdbarch_function_start_offset (gdbarch, 0);
607 /* Should be using push_dummy_call. */
608 set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp);
610 set_gdbarch_print_insn (gdbarch, print_insn_ns32k);
612 /* Hook in OS ABI-specific overrides, if they have been registered. */
613 gdbarch_init_osabi (info, gdbarch);
618 extern initialize_file_ftype _initialize_ns32k_tdep; /* -Wmissing-prototypes */
621 _initialize_ns32k_tdep (void)
623 gdbarch_register (bfd_arch_ns32k, ns32k_gdbarch_init, NULL);