]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/config/mips/tm-mips.h
import gdb-1999-09-08 snapshot
[thirdparty/binutils-gdb.git] / gdb / config / mips / tm-mips.h
index aa595f55e9fc24f88de4fddbd5c056a2a099d5e6..6e7e72c5762cc080d9b432bda3c00b08a98a594e 100644 (file)
@@ -4,38 +4,37 @@
    Contributed by Per Bothner (bothner@cs.wisc.edu) at U.Wisconsin
    and by Alessandro Forin (af@cs.cmu.edu) at CMU..
 
-This file is part of GDB.
+   This file is part of GDB.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifndef TM_MIPS_H
 #define TM_MIPS_H 1
 
-#ifdef __STDC__
 struct frame_info;
 struct symbol;
 struct type;
 struct value;
-#endif
 
 #include <bfd.h>
 #include "coff/sym.h"          /* Needed for PDR below.  */
 #include "coff/symconst.h"
 
-#if !defined (TARGET_BYTE_ORDER)
-#define TARGET_BYTE_ORDER LITTLE_ENDIAN
+#if !defined (TARGET_BYTE_ORDER_DEFAULT)
+#define TARGET_BYTE_ORDER_DEFAULT LITTLE_ENDIAN
 #endif
 
 #if !defined (GDB_TARGET_IS_MIPS64)
@@ -50,23 +49,17 @@ struct value;
 #define TARGET_MONITOR_PROMPT "<IDT>"
 #endif
 
+/* PC should be masked to remove possible MIPS16 flag */
+#if !defined (GDB_TARGET_MASK_DISAS_PC)
+#define GDB_TARGET_MASK_DISAS_PC(addr) UNMAKE_MIPS16_ADDR(addr)
+#endif
+#if !defined (GDB_TARGET_UNMASK_DISAS_PC)
+#define GDB_TARGET_UNMASK_DISAS_PC(addr) MAKE_MIPS16_ADDR(addr)
+#endif
+
 /* Floating point is IEEE compliant */
 #define IEEE_FLOAT
 
-/* Some MIPS boards are provided both with and without a floating
-   point coprocessor.  The MIPS R4650 chip has only single precision
-   floating point.  We provide a user settable variable to tell gdb
-   what type of floating point to use.  */
-
-enum mips_fpu_type
-{
-  MIPS_FPU_DOUBLE,     /* Full double precision floating point.  */
-  MIPS_FPU_SINGLE,     /* Single precision floating point (R4650).  */
-  MIPS_FPU_NONE                /* No floating point.  */
-};
-
-extern enum mips_fpu_type mips_fpu;
-
 /* The name of the usual type of MIPS processor that is in the target
    system.  */
 
@@ -89,13 +82,14 @@ CORE_ADDR mips_addr_bits_remove PARAMS ((CORE_ADDR addr));
 /* Advance PC across any function entry prologue instructions
    to reach some "real" code.  */
 
-#define SKIP_PROLOGUE(pc)      pc = mips_skip_prologue (pc, 0)
+#define SKIP_PROLOGUE(pc) (mips_skip_prologue (pc, 0))
 extern CORE_ADDR mips_skip_prologue PARAMS ((CORE_ADDR addr, int lenient));
 
 /* Return non-zero if PC points to an instruction which will cause a step
    to execute both the instruction at PC and an instruction at PC+4.  */
-#define STEP_SKIPS_DELAY(pc) (mips_step_skips_delay (pc))
 extern int mips_step_skips_delay PARAMS ((CORE_ADDR));
+#define STEP_SKIPS_DELAY_P (1)
+#define STEP_SKIPS_DELAY(pc) (mips_step_skips_delay (pc))
 
 /* Immediately after a function call, return the saved pc.
    Can't always go through the frames for this because on some machines
@@ -111,16 +105,7 @@ extern int in_sigtramp PARAMS ((CORE_ADDR, char *));
 
 /* Stack grows downward.  */
 
-#define INNER_THAN <
-
-#define BIG_ENDIAN 4321
-
-/* Old-style breakpoint macros.  */
-
-#define BIG_BREAKPOINT {0, 0x5, 0, 0xd}
-#define LITTLE_BREAKPOINT {0xd, 0, 0x5, 0}
-#define MIPS16_BIG_BREAKPOINT {0xe8, 0xa5}
-#define MIPS16_LITTLE_BREAKPOINT {0xa5, 0xe8}
+#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
 
 /* BREAKPOINT_FROM_PC uses the program counter value to determine whether a
    16- or 32-bit breakpoint should be used.  It returns a pointer
@@ -129,7 +114,7 @@ extern int in_sigtramp PARAMS ((CORE_ADDR, char *));
    point to the actual memory location where the breakpoint should be
    inserted.  */
 
-unsigned char *mips_breakpoint_from_pc PARAMS ((CORE_ADDR *pcptr, int *lenptr));
+extern breakpoint_from_pc_fn mips_breakpoint_from_pc;
 #define BREAKPOINT_FROM_PC(pcptr, lenptr) mips_breakpoint_from_pc(pcptr, lenptr)
 
 /* Amount PC must be decremented by after a breakpoint.
@@ -138,11 +123,6 @@ unsigned char *mips_breakpoint_from_pc PARAMS ((CORE_ADDR *pcptr, int *lenptr));
 
 #define DECR_PC_AFTER_BREAK 0
 
-/* Nonzero if instruction at PC is a return instruction. "j ra" on mips. */
-
-int mips_about_to_return PARAMS ((CORE_ADDR pc));
-#define ABOUT_TO_RETURN(pc) mips_about_to_return (pc)
-
 /* Say how long (ordinary) registers are.  This is a piece of bogosity
    used in push_word and a few other places; REGISTER_RAW_SIZE is the
    real way to know how big a register is.  */
@@ -157,14 +137,27 @@ int mips_about_to_return PARAMS ((CORE_ADDR pc));
 #define MIPS_REGSIZE 4
 #endif
 
+/* The sizes of floating point registers.  */
+
+#define MIPS_FPU_SINGLE_REGSIZE 4
+#define MIPS_FPU_DOUBLE_REGSIZE 8
+
 /* Number of machine registers */
 
+#ifndef NUM_REGS
 #define NUM_REGS 90
+#endif
+
+/* Given the register index, return the name of the corresponding
+   register. */
+extern char *mips_register_name PARAMS ((int regnr));
+#define REGISTER_NAME(i) mips_register_name (i)
 
 /* Initializer for an array of names of registers.
    There should be NUM_REGS strings in this initializer.  */
 
-#define REGISTER_NAMES         \
+#ifndef MIPS_REGISTER_NAMES
+#define MIPS_REGISTER_NAMES    \
     {  "zero", "at",   "v0",   "v1",   "a0",   "a1",   "a2",   "a3", \
        "t0",   "t1",   "t2",   "t3",   "t4",   "t5",   "t6",   "t7", \
        "s0",   "s1",   "s2",   "s3",   "s4",   "s5",   "s6",   "s7", \
@@ -178,6 +171,7 @@ int mips_about_to_return PARAMS ((CORE_ADDR pc));
        "",     "",     "",     "",     "",     "",     "",     "", \
        "",     "",     "",     "",     "",     "",     "",     "", \
     }
+#endif
 
 /* Register numbers of various important registers.
    Note that some of these values are "real" register numbers,
@@ -190,32 +184,32 @@ int mips_about_to_return PARAMS ((CORE_ADDR pc));
 #define V0_REGNUM 2            /* Function integer return value */
 #define A0_REGNUM 4            /* Loc of first arg during a subr call */
 #if MIPS_EABI
-#  define MIPS_LAST_ARG_REGNUM 11 /* EABI uses R4 through R11 for args */
-#  define MIPS_NUM_ARG_REGS 8
+#define MIPS_LAST_ARG_REGNUM 11        /* EABI uses R4 through R11 for args */
+#define MIPS_NUM_ARG_REGS 8
 #else
-#  define MIPS_LAST_ARG_REGNUM 7  /* old ABI uses R4 through R7 for args */
-#  define MIPS_NUM_ARG_REGS 4
+#define MIPS_LAST_ARG_REGNUM 7 /* old ABI uses R4 through R7 for args */
+#define MIPS_NUM_ARG_REGS 4
 #endif
 #define T9_REGNUM 25           /* Contains address of callee in PIC */
 #define SP_REGNUM 29           /* Contains address of top of stack */
 #define RA_REGNUM 31           /* Contains return address value */
 #define PS_REGNUM 32           /* Contains processor status */
-#define HI_REGNUM 34            /* Multiple/divide temp */
-#define LO_REGNUM 33            /* ... */
+#define HI_REGNUM 34           /* Multiple/divide temp */
+#define LO_REGNUM 33           /* ... */
 #define BADVADDR_REGNUM 35     /* bad vaddr for addressing exception */
 #define CAUSE_REGNUM 36                /* describes last exception */
 #define PC_REGNUM 37           /* Contains program counter */
-#define FP0_REGNUM 38           /* Floating point register 0 (single float) */
-#define FPA0_REGNUM (FP0_REGNUM+12) /* First float argument register */
+#define FP0_REGNUM 38          /* Floating point register 0 (single float) */
+#define FPA0_REGNUM (FP0_REGNUM+12)    /* First float argument register */
 #if MIPS_EABI                  /* EABI uses F12 through F19 for args */
-#  define MIPS_LAST_FP_ARG_REGNUM (FP0_REGNUM+19)
-#  define MIPS_NUM_FP_ARG_REGS 8
-#else                          /* old ABI uses F12 through F15 for args */
-#  define MIPS_LAST_FP_ARG_REGNUM (FP0_REGNUM+15)
-#  define MIPS_NUM_FP_ARG_REGS 4
+#define MIPS_LAST_FP_ARG_REGNUM (FP0_REGNUM+19)
+#define MIPS_NUM_FP_ARG_REGS 8
+#else /* old ABI uses F12 through F15 for args */
+#define MIPS_LAST_FP_ARG_REGNUM (FP0_REGNUM+15)
+#define MIPS_NUM_FP_ARG_REGS 4
 #endif
-#define FCRCS_REGNUM 70         /* FP control/status */
-#define FCRIR_REGNUM 71         /* FP implementation/revision */
+#define FCRCS_REGNUM 70                /* FP control/status */
+#define FCRIR_REGNUM 71                /* FP implementation/revision */
 #define FP_REGNUM 72           /* Pseudo register that contains true address of executing stack frame */
 #define        UNUSED_REGNUM 73        /* Never used, FIXME */
 #define        FIRST_EMBED_REGNUM 74   /* First CP0 register for embedded use */
@@ -238,15 +232,36 @@ extern void mips_do_registers_info PARAMS ((int, int));
 
 #define REGISTER_BYTE(N) ((N) * MIPS_REGSIZE)
 
-/* Number of bytes of storage in the actual machine representation
-   for register N.  On mips, all regs are the same size.  */
+/* Number of bytes of storage in the actual machine representation for
+   register N.  NOTE: This indirectly defines the register size
+   transfered by the GDB protocol. */
 
-#define REGISTER_RAW_SIZE(N) MIPS_REGSIZE
+extern int mips_register_raw_size PARAMS ((int reg_nr));
+#define REGISTER_RAW_SIZE(N) (mips_register_raw_size ((N)))
+
+
+/* Covert between the RAW and VIRTUAL registers.
+
+   Some MIPS (SR, FSR, FIR) have a `raw' size of MIPS_REGSIZE but are
+   really 32 bit registers.  This is a legacy of the 64 bit MIPS GDB
+   protocol which transfers 64 bits for 32 bit registers. */
+
+extern int mips_register_convertible PARAMS ((int reg_nr));
+#define REGISTER_CONVERTIBLE(N) (mips_register_convertible ((N)))
+     
+
+void mips_register_convert_to_virtual PARAMS ((int reg_nr, struct type *virtual_type, char *raw_buf, char *virt_buf));
+#define REGISTER_CONVERT_TO_VIRTUAL(N,VIRTUAL_TYPE,RAW_BUF,VIRT_BUF) \
+  mips_register_convert_to_virtual (N,VIRTUAL_TYPE,RAW_BUF,VIRT_BUF)
+
+void mips_register_convert_to_raw PARAMS ((struct type *virtual_type, int reg_nr, char *virt_buf, char *raw_buf));
+#define REGISTER_CONVERT_TO_RAW(VIRTUAL_TYPE,N,VIRT_BUF,RAW_BUF) \
+  mips_register_convert_to_raw (VIRTUAL_TYPE,N,VIRT_BUF,RAW_BUF)
 
 /* Number of bytes of storage in the program's representation
-   for register N.  On mips, all regs are the same size.  */
+   for register N. */
 
-#define REGISTER_VIRTUAL_SIZE(N) MIPS_REGSIZE
+#define REGISTER_VIRTUAL_SIZE(N) TYPE_LENGTH (REGISTER_VIRTUAL_TYPE (N))
 
 /* Largest value REGISTER_RAW_SIZE can have.  */
 
@@ -256,42 +271,49 @@ extern void mips_do_registers_info PARAMS ((int, int));
 
 #define MAX_REGISTER_VIRTUAL_SIZE 8
 
-/* Return the GDB type object for the "standard" data type
-   of data in register N.  */
+/* Return the GDB type object for the "standard" data type of data in
+   register N.  */
 
 #ifndef REGISTER_VIRTUAL_TYPE
 #define REGISTER_VIRTUAL_TYPE(N) \
-       (((N) >= FP0_REGNUM && (N) < FP0_REGNUM+32)  \
-        ? builtin_type_float : builtin_type_int)
+       (((N) >= FP0_REGNUM && (N) < FP0_REGNUM+32) ? builtin_type_float \
+        : ((N) == 32 /*SR*/) ? builtin_type_uint32 \
+        : ((N) >= 70 && (N) <= 89) ? builtin_type_uint32 \
+        : builtin_type_int)
 #endif
 
-#if HOST_BYTE_ORDER == BIG_ENDIAN
 /* All mips targets store doubles in a register pair with the least
    significant register in the lower numbered register.
-   If the host is big endian, double register values need conversion between
-   memory and register formats.  */
+   If the target is big endian, double register values need conversion
+   between memory and register formats.  */
 
 #define REGISTER_CONVERT_TO_TYPE(n, type, buffer)                      \
-  do {if ((n) >= FP0_REGNUM && (n) < FP0_REGNUM + 32 &&                \
-         TYPE_CODE(type) == TYPE_CODE_FLT && TYPE_LENGTH(type) == 8) { \
+  do {if (TARGET_BYTE_ORDER == BIG_ENDIAN                              \
+         && REGISTER_RAW_SIZE (n) == 4                                 \
+         && (n) >= FP0_REGNUM && (n) < FP0_REGNUM + 32                 \
+         && TYPE_CODE(type) == TYPE_CODE_FLT                           \
+         && TYPE_LENGTH(type) == 8) {                                  \
         char __temp[4];                                                        \
        memcpy (__temp, ((char *)(buffer))+4, 4);                       \
        memcpy (((char *)(buffer))+4, (buffer), 4);                     \
        memcpy (((char *)(buffer)), __temp, 4); }} while (0)
 
 #define REGISTER_CONVERT_FROM_TYPE(n, type, buffer)                    \
-  do {if ((n) >= FP0_REGNUM && (n) < FP0_REGNUM + 32 &&                        \
-         TYPE_CODE(type) == TYPE_CODE_FLT && TYPE_LENGTH(type) == 8) { \
+  do {if (TARGET_BYTE_ORDER == BIG_ENDIAN                              \
+         && REGISTER_RAW_SIZE (n) == 4                                 \
+         && (n) >= FP0_REGNUM && (n) < FP0_REGNUM + 32                 \
+         && TYPE_CODE(type) == TYPE_CODE_FLT                           \
+         && TYPE_LENGTH(type) == 8) {                                  \
         char __temp[4];                                                        \
        memcpy (__temp, ((char *)(buffer))+4, 4);                       \
        memcpy (((char *)(buffer))+4, (buffer), 4);                     \
        memcpy (((char *)(buffer)), __temp, 4); }} while (0)
-#endif
 
 /* Store the address of the place in which to copy the structure the
    subroutine will return.  Handled by mips_push_arguments.  */
 
-#define STORE_STRUCT_RETURN(addr, sp)  /**/
+#define STORE_STRUCT_RETURN(addr, sp)
+/**/
 
 /* Extract from an array REGBUF containing the (raw) register state
    a function return value of type TYPE, and copy that, in virtual format,
@@ -300,7 +322,7 @@ extern void mips_do_registers_info PARAMS ((int, int));
 #define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
   mips_extract_return_value(TYPE, REGBUF, VALBUF)
 extern void
-mips_extract_return_value PARAMS ((struct type *, char [], char *));
+mips_extract_return_value PARAMS ((struct type *, char[], char *));
 
 /* Write into appropriate registers a function return value
    of type TYPE, given in virtual format.  */
@@ -321,9 +343,8 @@ extern void mips_store_return_value PARAMS ((struct type *, char *));
   (extract_address (REGBUF + REGISTER_BYTE (V0_REGNUM), \
                    REGISTER_RAW_SIZE (V0_REGNUM)))
 
-/* Structures are returned by ref in extra arg0 */
-#define USE_STRUCT_CONVENTION(gcc_p, type)     1
-
+extern use_struct_convention_fn mips_use_struct_convention;
+#define USE_STRUCT_CONVENTION(gcc_p, type) mips_use_struct_convention (gcc_p, type)
 \f
 /* Describe the pointer in each stack frame to the previous stack frame
    (its caller).  */
@@ -342,7 +363,7 @@ extern CORE_ADDR mips_frame_chain PARAMS ((struct frame_info *));
    does not, FRAMELESS is set to 1, else 0.  */
 /* We handle this differently for mips, and maybe we should not */
 
-#define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS)  {(FRAMELESS) = 0;}
+#define FRAMELESS_FUNCTION_INVOCATION(FI)  (0)
 
 /* Saved Pc.  */
 
@@ -356,7 +377,7 @@ extern CORE_ADDR mips_frame_saved_pc PARAMS ((struct frame_info *));
 /* Return number of args passed to a frame.
    Can return -1, meaning no way to tell.  */
 
-#define FRAME_NUM_ARGS(num, fi)        (num = mips_frame_num_args(fi))
+#define FRAME_NUM_ARGS(fi)     (mips_frame_num_args(fi))
 extern int mips_frame_num_args PARAMS ((struct frame_info *));
 
 /* Return number of bytes at start of arglist that are not really args.  */
@@ -369,26 +390,27 @@ extern int mips_frame_num_args PARAMS ((struct frame_info *));
    ways in the stack frame.  sp is even more special:
    the address we return for it IS the sp for the next frame.  */
 
-#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
+#define FRAME_INIT_SAVED_REGS(frame_info) \
   do { \
     if ((frame_info)->saved_regs == NULL) \
       mips_find_saved_regs (frame_info); \
-    (frame_saved_regs) = *(frame_info)->saved_regs; \
-    (frame_saved_regs).regs[SP_REGNUM] = (frame_info)->frame; \
+    (frame_info)->saved_regs[SP_REGNUM] = (frame_info)->frame; \
   } while (0)
 extern void mips_find_saved_regs PARAMS ((struct frame_info *));
-
 \f
+
 /* Things needed for making the inferior call functions.  */
 
 /* Stack must be aligned on 32-bit boundaries when synthesizing
    function calls.  We don't need STACK_ALIGN, PUSH_ARGUMENTS will
    handle it. */
 
+extern CORE_ADDR mips_push_arguments PARAMS ((int, struct value **, CORE_ADDR, int, CORE_ADDR));
 #define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
-    sp = mips_push_arguments((nargs), (args), (sp), (struct_return), (struct_addr))
-extern CORE_ADDR
-mips_push_arguments PARAMS ((int, struct value **, CORE_ADDR, int, CORE_ADDR));
+  (mips_push_arguments((nargs), (args), (sp), (struct_return), (struct_addr)))
+
+extern CORE_ADDR mips_push_return_address PARAMS ((CORE_ADDR pc, CORE_ADDR sp));
+#define PUSH_RETURN_ADDRESS(PC, SP) (mips_push_return_address ((PC), (SP)))
 
 /* Push an empty stack frame, to record the current PC, etc.  */
 
@@ -413,16 +435,17 @@ extern void mips_pop_frame PARAMS ((void));
 
 #define CALL_DUMMY_LOCATION AT_ENTRY_POINT
 
-#define CALL_DUMMY_ADDRESS() (entry_point_address ())
+#define CALL_DUMMY_ADDRESS() (mips_call_dummy_address ())
+extern CORE_ADDR mips_call_dummy_address PARAMS ((void));
 
 /* There's a mess in stack frame creation.  See comments in blockframe.c
    near reference to INIT_FRAME_PC_FIRST.  */
 
-#define        INIT_FRAME_PC(fromleaf, prev) /* nada */
+#define        INIT_FRAME_PC(fromleaf, prev)   /* nada */
 
 #define INIT_FRAME_PC_FIRST(fromleaf, prev) \
-  (prev)->pc = ((fromleaf) ? SAVED_PC_AFTER_CALL ((prev)->next) : \
-             (prev)->next ? FRAME_SAVED_PC ((prev)->next) : read_pc ());
+   mips_init_frame_pc_first(fromleaf, prev)
+extern void mips_init_frame_pc_first PARAMS ((int, struct frame_info *));
 
 /* Special symbol found in blocks associated with routines.  We can hang
    mips_extra_func_info_t's off of this.  */
@@ -434,27 +457,22 @@ extern void ecoff_relocate_efi PARAMS ((struct symbol *, CORE_ADDR));
    This overlays the MIPS's PDR records, 
    mipsread.c (ab)uses this to save memory */
 
-typedef struct mips_extra_func_info {
-       long    numargs;        /* number of args to procedure (was iopt) */
-       bfd_vma high_addr;      /* upper address bound */
-       PDR     pdr;            /* Procedure descriptor record */
-} *mips_extra_func_info_t;
-
-#define EXTRA_FRAME_INFO \
-  mips_extra_func_info_t proc_desc; \
-  int num_args;\
-  struct frame_saved_regs *saved_regs;
+typedef struct mips_extra_func_info
+  {
+    long numargs;              /* number of args to procedure (was iopt) */
+    bfd_vma high_addr;         /* upper address bound */
+    long frame_adjust;         /* offset of FP from SP (used on MIPS16) */
+    PDR pdr;                   /* Procedure descriptor record */
+  }
+ *mips_extra_func_info_t;
 
-#define INIT_EXTRA_FRAME_INFO(fromleaf, fci) init_extra_frame_info(fci)
-extern void init_extra_frame_info PARAMS ((struct frame_info *));
+extern void mips_init_extra_frame_info PARAMS ((int fromleaf, struct frame_info *));
+#define INIT_EXTRA_FRAME_INFO(fromleaf, fci) \
+  mips_init_extra_frame_info(fromleaf, fci)
 
+extern void mips_print_extra_frame_info PARAMS ((struct frame_info * frame));
 #define        PRINT_EXTRA_FRAME_INFO(fi) \
-  { \
-    if (fi && fi->proc_desc && fi->proc_desc->pdr.framereg < NUM_REGS) \
-      printf_filtered (" frame pointer is at %s+%d\n", \
-                       reg_names[fi->proc_desc->pdr.framereg], \
-                                 fi->proc_desc->pdr.frameoffset); \
-  }
+  mips_print_extra_frame_info (fi)
 
 /* It takes two values to specify a frame on the MIPS.
 
@@ -494,6 +512,11 @@ extern struct frame_info *setup_arbitrary_frame PARAMS ((int, CORE_ADDR *));
 
 #define COERCE_FLOAT_TO_DOUBLE (current_language -> la_language == language_c)
 
+/* Select the default mips disassembler */
+
+#define TM_PRINT_INSN_MACH 0
+
+
 /* These are defined in mdebugread.c and are used in mips-tdep.c  */
 extern CORE_ADDR sigtramp_address, sigtramp_end;
 extern void fixup_sigtramp PARAMS ((void));
@@ -501,8 +524,62 @@ extern void fixup_sigtramp PARAMS ((void));
 /* Defined in mips-tdep.c and used in remote-mips.c */
 extern char *mips_read_processor_type PARAMS ((void));
 
+/* Functions for dealing with MIPS16 call and return stubs.  */
+#define IN_SOLIB_CALL_TRAMPOLINE(pc, name)     mips_in_call_stub (pc, name)
+#define IN_SOLIB_RETURN_TRAMPOLINE(pc, name)   mips_in_return_stub (pc, name)
+#define SKIP_TRAMPOLINE_CODE(pc)               mips_skip_stub (pc)
+#define IGNORE_HELPER_CALL(pc)                 mips_ignore_helper (pc)
+extern int mips_in_call_stub PARAMS ((CORE_ADDR pc, char *name));
+extern int mips_in_return_stub PARAMS ((CORE_ADDR pc, char *name));
+extern CORE_ADDR mips_skip_stub PARAMS ((CORE_ADDR pc));
+extern int mips_ignore_helper PARAMS ((CORE_ADDR pc));
+
 #ifndef TARGET_MIPS
 #define TARGET_MIPS
 #endif
 
-#endif /* TM_MIPS_H */
+/* Definitions and declarations used by mips-tdep.c and remote-mips.c  */
+#define MIPS_INSTLEN 4         /* Length of an instruction */
+#define MIPS16_INSTLEN 2       /* Length of an instruction on MIPS16 */
+#define MIPS_NUMREGS 32                /* Number of integer or float registers */
+typedef unsigned long t_inst;  /* Integer big enough to hold an instruction */
+
+/* MIPS16 function addresses are odd (bit 0 is set).  Here are some
+   macros to test, set, or clear bit 0 of addresses.  */
+#define IS_MIPS16_ADDR(addr)    ((addr) & 1)
+#define MAKE_MIPS16_ADDR(addr)  ((addr) | 1)
+#define UNMAKE_MIPS16_ADDR(addr) ((addr) & ~1)
+
+#endif /* TM_MIPS_H */
+
+/* Macros for setting and testing a bit in a minimal symbol that
+   marks it as 16-bit function.  The MSB of the minimal symbol's
+   "info" field is used for this purpose. This field is already
+   being used to store the symbol size, so the assumption is
+   that the symbol size cannot exceed 2^31.
+
+   ELF_MAKE_MSYMBOL_SPECIAL
+   tests whether an ELF symbol is "special", i.e. refers
+   to a 16-bit function, and sets a "special" bit in a 
+   minimal symbol to mark it as a 16-bit function
+   MSYMBOL_IS_SPECIAL   tests the "special" bit in a minimal symbol
+   MSYMBOL_SIZE         returns the size of the minimal symbol, i.e.
+   the "info" field with the "special" bit masked out
+ */
+
+#define ELF_MAKE_MSYMBOL_SPECIAL(sym,msym) \
+ { \
+  if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_MIPS16) { \
+    MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) | 0x80000000); \
+    SYMBOL_VALUE_ADDRESS (msym) |= 1; \
+  } \
+ }
+
+#define MSYMBOL_IS_SPECIAL(msym) \
+  (((long) MSYMBOL_INFO (msym) & 0x80000000) != 0)
+#define MSYMBOL_SIZE(msym) \
+  ((long) MSYMBOL_INFO (msym) & 0x7fffffff)
+
+
+/* Command to set the processor type. */
+extern void mips_set_processor_type_command (char *, int);