1/* Target-dependent header for the MIPS architecture, for GDB, the GNU Debugger.
2
3   Copyright (C) 2002, 2003, 2007 Free Software Foundation, Inc.
4
5   This file is part of GDB.
6
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 3 of the License, or
10   (at your option) any later version.
11
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.
16
17   You should have received a copy of the GNU General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20#ifndef MIPS_TDEP_H
21#define MIPS_TDEP_H
22
23struct gdbarch;
24
25/* All the possible MIPS ABIs. */
26enum mips_abi
27  {
28    MIPS_ABI_UNKNOWN = 0,
29    MIPS_ABI_N32,
30    MIPS_ABI_O32,
31    MIPS_ABI_N64,
32    MIPS_ABI_O64,
33    MIPS_ABI_EABI32,
34    MIPS_ABI_EABI64,
35    MIPS_ABI_LAST
36  };
37
38/* Return the MIPS ABI associated with GDBARCH.  */
39enum mips_abi mips_abi (struct gdbarch *gdbarch);
40
41/* Return the MIPS ISA's register size.  Just a short cut to the BFD
42   architecture's word size.  */
43extern int mips_isa_regsize (struct gdbarch *gdbarch);
44
45/* Return the current index for various MIPS registers.  */
46struct mips_regnum
47{
48  int pc;
49  int fp0;
50  int fp_implementation_revision;
51  int fp_control_status;
52  int badvaddr;		/* Bad vaddr for addressing exception.  */
53  int cause;		/* Describes last exception.  */
54  int hi;		/* Multiply/divide temp.  */
55  int lo;		/* ...  */
56};
57extern const struct mips_regnum *mips_regnum (struct gdbarch *gdbarch);
58
59/* Register numbers of various important registers.  */
60
61enum
62{
63  MIPS_ZERO_REGNUM = 0,		/* Read-only register, always 0.  */
64  MIPS_AT_REGNUM = 1,
65  MIPS_V0_REGNUM = 2,		/* Function integer return value.  */
66  MIPS_A0_REGNUM = 4,		/* Loc of first arg during a subr call */
67  MIPS_T9_REGNUM = 25,		/* Contains address of callee in PIC.  */
68  MIPS_SP_REGNUM = 29,
69  MIPS_RA_REGNUM = 31,
70  MIPS_PS_REGNUM = 32,		/* Contains processor status.  */
71  MIPS_EMBED_LO_REGNUM = 33,
72  MIPS_EMBED_HI_REGNUM = 34,
73  MIPS_EMBED_BADVADDR_REGNUM = 35,
74  MIPS_EMBED_CAUSE_REGNUM = 36,
75  MIPS_EMBED_PC_REGNUM = 37,
76  MIPS_EMBED_FP0_REGNUM = 38,
77  MIPS_UNUSED_REGNUM = 73,	/* Never used, FIXME */
78  MIPS_FIRST_EMBED_REGNUM = 74,	/* First CP0 register for embedded use.  */
79  MIPS_PRID_REGNUM = 89,	/* Processor ID.  */
80  MIPS_LAST_EMBED_REGNUM = 89	/* Last one.  */
81};
82
83/* Defined in mips-tdep.c and used in remote-mips.c */
84extern void deprecated_mips_set_processor_regs_hack (void);
85
86/* Instruction sizes and other useful constants.  */
87enum
88{
89  MIPS_INSN16_SIZE = 2,
90  MIPS_INSN32_SIZE = 4,
91  /* The number of floating-point or integer registers.  */
92  MIPS_NUMREGS = 32
93};
94
95/* Single step based on where the current instruction will take us.  */
96extern int mips_software_single_step (struct frame_info *frame);
97
98/* Tell if the program counter value in MEMADDR is in a MIPS16
99   function.  */
100extern int mips_pc_is_mips16 (bfd_vma memaddr);
101
102/* Return the currently configured (or set) saved register size. */
103extern unsigned int mips_abi_regsize (struct gdbarch *gdbarch);
104
105#endif /* MIPS_TDEP_H */
106