* mips-linux-nat.c: No longer include "gdbcore.h".
[deliverable/binutils-gdb.git] / gdb / mips-linux-nat.c
index 7796146ddc8ed287a9aeee026e8fb07058666513..b4c275a3445c44469058e275fefb437b7d2a1d99 100644 (file)
@@ -1,6 +1,6 @@
 /* Native-dependent code for GNU/Linux on MIPS processors.
 
-   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -86,6 +86,75 @@ mips_linux_cannot_store_register (int regno)
     return 1;
 }
 
+/* Map gdb internal register number to ptrace ``address''.
+   These ``addresses'' are normally defined in <asm/ptrace.h>.  */
+
+static CORE_ADDR
+mips_linux_register_addr (int regno)
+{
+  int regaddr;
+
+  if (regno < 0 || regno >= NUM_REGS)
+    error (_("Bogon register number %d."), regno);
+
+  if (regno < 32)
+    regaddr = regno;
+  else if ((regno >= mips_regnum (current_gdbarch)->fp0)
+          && (regno < mips_regnum (current_gdbarch)->fp0 + 32))
+    regaddr = FPR_BASE + (regno - mips_regnum (current_gdbarch)->fp0);
+  else if (regno == mips_regnum (current_gdbarch)->pc)
+    regaddr = PC;
+  else if (regno == mips_regnum (current_gdbarch)->cause)
+    regaddr = CAUSE;
+  else if (regno == mips_regnum (current_gdbarch)->badvaddr)
+    regaddr = BADVADDR;
+  else if (regno == mips_regnum (current_gdbarch)->lo)
+    regaddr = MMLO;
+  else if (regno == mips_regnum (current_gdbarch)->hi)
+    regaddr = MMHI;
+  else if (regno == mips_regnum (current_gdbarch)->fp_control_status)
+    regaddr = FPC_CSR;
+  else if (regno == mips_regnum (current_gdbarch)->fp_implementation_revision)
+    regaddr = FPC_EIR;
+  else
+    error (_("Unknowable register number %d."), regno);
+
+  return regaddr;
+}
+
+static CORE_ADDR
+mips64_linux_register_addr (int regno)
+{
+  int regaddr;
+
+  if (regno < 0 || regno >= NUM_REGS)
+    error (_("Bogon register number %d."), regno);
+
+  if (regno < 32)
+    regaddr = regno;
+  else if ((regno >= mips_regnum (current_gdbarch)->fp0)
+          && (regno < mips_regnum (current_gdbarch)->fp0 + 32))
+    regaddr = MIPS64_FPR_BASE + (regno - FP0_REGNUM);
+  else if (regno == mips_regnum (current_gdbarch)->pc)
+    regaddr = MIPS64_PC;
+  else if (regno == mips_regnum (current_gdbarch)->cause)
+    regaddr = MIPS64_CAUSE;
+  else if (regno == mips_regnum (current_gdbarch)->badvaddr)
+    regaddr = MIPS64_BADVADDR;
+  else if (regno == mips_regnum (current_gdbarch)->lo)
+    regaddr = MIPS64_MMLO;
+  else if (regno == mips_regnum (current_gdbarch)->hi)
+    regaddr = MIPS64_MMHI;
+  else if (regno == mips_regnum (current_gdbarch)->fp_control_status)
+    regaddr = MIPS64_FPC_CSR;
+  else if (regno == mips_regnum (current_gdbarch)->fp_implementation_revision)
+    regaddr = MIPS64_FPC_EIR;
+  else
+    error (_("Unknowable register number %d."), regno);
+
+  return regaddr;
+}
+
 /* Fetch the thread-local storage pointer for libthread_db.  */
 
 ps_err_e
@@ -246,12 +315,24 @@ mips64_linux_store_registers (int regnum)
     super_store_registers (regnum);
 }
 
+/* Return the address in the core dump or inferior of register
+   REGNO.  */
+
+static CORE_ADDR
+mips_linux_register_u_offset (int regno)
+{
+  if (mips_abi_regsize (current_gdbarch) == 8)
+    return mips64_linux_register_addr (regno);
+  else
+    return mips_linux_register_addr (regno);
+}
+
 void _initialize_mips_linux_nat (void);
 
 void
 _initialize_mips_linux_nat (void)
 {
-  struct target_ops *t = linux_target ();
+  struct target_ops *t = linux_trad_target (mips_linux_register_u_offset);
 
   super_fetch_registers = t->to_fetch_registers;
   super_store_registers = t->to_store_registers;
This page took 0.024742 seconds and 4 git commands to generate.