/* Target-machine dependent code for Zilog Z8000, for GDB.
- Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+
+ Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+ 2002, 2003 Free Software Foundation, Inc.
This file is part of GDB.
#include "defs.h"
#include "frame.h"
-#include "obstack.h"
#include "symtab.h"
#include "gdbcmd.h"
#include "gdbtypes.h"
#include "dis-asm.h"
#include "gdbcore.h"
+#include "regcache.h"
#include "value.h" /* For read_register() */
CORE_ADDR
z8k_frame_chain (struct frame_info *thisframe)
{
- if (thisframe->prev == 0)
- {
- /* This is the top of the stack, let's get the sp for real */
- }
- if (!inside_entry_file (thisframe->pc))
+ if (!inside_entry_file (get_frame_pc (thisframe)))
{
return read_memory_pointer (thisframe->frame);
}
return 0;
}
-void
-init_frame_pc (void)
-{
- internal_error (__FILE__, __LINE__, "failed internal consistency check");
-}
-
/* Put here the code to store, into a struct frame_saved_regs,
the addresses of the saved registers of frame described by FRAME_INFO.
This includes special registers such as pc and fp saved in special
int w;
frame_saved_regs_zalloc (frame_info);
- pc = get_pc_function_start (frame_info->pc);
+ pc = get_pc_function_start (get_frame_pc (frame_info));
/* wander down the instruction stream */
examine_frame (pc, frame_info->saved_regs, frame_info->frame);
memset (fsrp, 0, sizeof *fsrp);
- pc = skip_adjust (get_pc_function_start (fip->pc), &locals);
+ pc = skip_adjust (get_pc_function_start (get_frame_pc (fip)), &locals);
{
- adr = FRAME_FP (fip) - locals;
+ adr = get_frame_base (fip) - locals;
for (i = 0; i < 8; i++)
{
int word = read_memory_short (pc);
int len;
for (len = 0; len < TYPE_LENGTH (type); len += 2)
- write_register_bytes (REGISTER_BYTE (len / 2 + 2), valbuf + len, 2);
+ deprecated_write_register_bytes (REGISTER_BYTE (len / 2 + 2),
+ valbuf + len, 2);
}
void
}
-void
+static void
z8k_print_register_hook (int regno)
{
if ((regno & 1) == 0 && regno < 16)
{
- unsigned short l[2];
+ unsigned char l[4];
- read_relative_register_raw_bytes (regno, (char *) (l + 0));
- read_relative_register_raw_bytes (regno + 1, (char *) (l + 1));
+ frame_register_read (deprecated_selected_frame, regno, l + 0);
+ frame_register_read (deprecated_selected_frame, regno + 1, l + 2);
printf_unfiltered ("\t");
- printf_unfiltered ("%04x%04x", l[0], l[1]);
+ printf_unfiltered ("0x%02x%02x%02x%02x", l[0], l[1], l[2], l[3]);
}
if ((regno & 3) == 0 && regno < 16)
{
- unsigned short l[4];
+ unsigned char l[8];
- read_relative_register_raw_bytes (regno, (char *) (l + 0));
- read_relative_register_raw_bytes (regno + 1, (char *) (l + 1));
- read_relative_register_raw_bytes (regno + 2, (char *) (l + 2));
- read_relative_register_raw_bytes (regno + 3, (char *) (l + 3));
+ frame_register_read (deprecated_selected_frame, regno, l + 0);
+ frame_register_read (deprecated_selected_frame, regno + 1, l + 2);
+ frame_register_read (deprecated_selected_frame, regno + 2, l + 4);
+ frame_register_read (deprecated_selected_frame, regno + 3, l + 6);
printf_unfiltered ("\t");
- printf_unfiltered ("%04x%04x%04x%04x", l[0], l[1], l[2], l[3]);
+ printf_unfiltered ("0x%02x%02x%02x%02x%02x%02x%02x%02x",
+ l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7]);
}
if (regno == 15)
{
unsigned short rval;
int i;
- read_relative_register_raw_bytes (regno, (char *) (&rval));
+ frame_register_read (deprecated_selected_frame, regno, (char *) (&rval));
printf_unfiltered ("\n");
for (i = 0; i < 10; i += 2)
(unsigned int)read_memory_short (rval + i));
}
}
+}
+
+static void
+z8k_print_registers_info (struct gdbarch *gdbarch,
+ struct ui_file *file,
+ struct frame_info *frame,
+ int regnum, int print_all)
+{
+ int i;
+ const int numregs = NUM_REGS + NUM_PSEUDO_REGS;
+ char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
+ char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE);
+
+ for (i = 0; i < numregs; i++)
+ {
+ /* Decide between printing all regs, non-float / vector regs, or
+ specific reg. */
+ if (regnum == -1)
+ {
+ if (!print_all)
+ {
+ if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
+ continue;
+ if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)))
+ continue;
+ }
+ }
+ else
+ {
+ if (i != regnum)
+ continue;
+ }
+
+ /* If the register name is empty, it is undefined for this
+ processor, so don't display anything. */
+ if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0')
+ continue;
+ fputs_filtered (REGISTER_NAME (i), file);
+ print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file);
+
+ /* Get the data in raw format. */
+ if (! frame_register_read (frame, i, raw_buffer))
+ {
+ fprintf_filtered (file, "*value not available*\n");
+ continue;
+ }
+
+ /* FIXME: cagney/2002-08-03: This code shouldn't be necessary.
+ The function frame_register_read() should have returned the
+ pre-cooked register so no conversion is necessary. */
+ /* Convert raw data to virtual format if necessary. */
+ if (REGISTER_CONVERTIBLE (i))
+ {
+ REGISTER_CONVERT_TO_VIRTUAL (i, REGISTER_VIRTUAL_TYPE (i),
+ raw_buffer, virtual_buffer);
+ }
+ else
+ {
+ memcpy (virtual_buffer, raw_buffer,
+ REGISTER_VIRTUAL_SIZE (i));
+ }
+
+ /* If virtual format is floating, print it that way, and in raw
+ hex. */
+ if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
+ {
+ int j;
+
+ val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+ file, 0, 1, 0, Val_pretty_default);
+
+ fprintf_filtered (file, "\t(raw 0x");
+ for (j = 0; j < REGISTER_RAW_SIZE (i); j++)
+ {
+ int idx;
+ if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+ idx = j;
+ else
+ idx = REGISTER_RAW_SIZE (i) - 1 - j;
+ fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]);
+ }
+ fprintf_filtered (file, ")");
+ }
+ else
+ {
+ /* Print the register in hex. */
+ val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+ file, 'x', 1, 0, Val_pretty_default);
+ /* If not a vector register, print it also according to its
+ natural format. */
+ if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)) == 0)
+ {
+ fprintf_filtered (file, "\t");
+ val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+ file, 0, 1, 0, Val_pretty_default);
+ }
+ }
+
+ /* Some z8k specific info. */
+ z8k_print_register_hook (i);
+
+ fprintf_filtered (file, "\n");
+ }
+}
+
+void
+z8k_do_registers_info (int regnum, int all)
+{
+ z8k_print_registers_info (current_gdbarch, gdb_stdout,
+ deprecated_selected_frame, regnum, all);
}
void