* remote.c (remote_write_bytes): Take a const buffer argument.
[deliverable/binutils-gdb.git] / gdb / nto-tdep.c
index 631290c56f1d4bdf4987d617973ce232c1657a72..5a8dd996073a637819ba36596f00414e9c93e80a 100644 (file)
@@ -1,6 +1,6 @@
 /* nto-tdep.c - general QNX Neutrino target functionality.
 
-   Copyright 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
 
    Contributed by QNX Software Systems Ltd.
 
@@ -18,8 +18,8 @@
 
    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.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "gdb_stat.h"
 #include "gdb_string.h"
@@ -65,6 +65,19 @@ nto_target (void)
 #endif
 }
 
+void
+nto_set_target (struct nto_target_ops *targ)
+{
+  nto_regset_id = targ->regset_id;
+  nto_supply_gregset = targ->supply_gregset;
+  nto_supply_fpregset = targ->supply_fpregset;
+  nto_supply_altregset = targ->supply_altregset;
+  nto_supply_regset = targ->supply_regset;
+  nto_register_area = targ->register_area;
+  nto_regset_fill = targ->regset_fill;
+  nto_fetch_link_map_offsets = targ->fetch_link_map_offsets;
+}
+
 /* Take a string such as i386, rs6000, etc. and map it onto CPUTYPE_X86,
    CPUTYPE_PPC, etc. as defined in nto-share/dsmsgs.h.  */
 int
@@ -72,7 +85,7 @@ nto_map_arch_to_cputype (const char *arch)
 {
   if (!strcmp (arch, "i386") || !strcmp (arch, "x86"))
     return CPUTYPE_X86;
-  if (!strcmp (arch, "rs6000") || !strcmp (arch, "ppc"))
+  if (!strcmp (arch, "rs6000") || !strcmp (arch, "powerpc"))
     return CPUTYPE_PPC;
   if (!strcmp (arch, "mips"))
     return CPUTYPE_MIPS;
@@ -86,10 +99,10 @@ nto_map_arch_to_cputype (const char *arch)
 int
 nto_find_and_open_solib (char *solib, unsigned o_flags, char **temp_pathname)
 {
-  char *buf, arch_path[PATH_MAX], *nto_root, *endian;
+  char *buf, *arch_path, *nto_root, *endian, *base;
   const char *arch;
-  char *path_fmt = "%s/lib:%s/usr/lib:%s/usr/photon/lib\
-:%s/usr/photon/dll:%s/lib/dll";
+  int ret;
+#define PATH_FMT "%s/lib:%s/usr/lib:%s/usr/photon/lib:%s/usr/photon/dll:%s/lib/dll"
 
   nto_root = nto_target ();
   if (strcmp (TARGET_ARCHITECTURE->arch_name, "i386") == 0)
@@ -97,7 +110,8 @@ nto_find_and_open_solib (char *solib, unsigned o_flags, char **temp_pathname)
       arch = "x86";
       endian = "";
     }
-  else if (strcmp (TARGET_ARCHITECTURE->arch_name, "rs6000") == 0)
+  else if (strcmp (TARGET_ARCHITECTURE->arch_name, "rs6000") == 0
+          || strcmp (TARGET_ARCHITECTURE->arch_name, "powerpc") == 0)
     {
       arch = "ppc";
       endian = "be";
@@ -108,13 +122,38 @@ nto_find_and_open_solib (char *solib, unsigned o_flags, char **temp_pathname)
       endian = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? "be" : "le";
     }
 
+  /* In case nto_root is short, add strlen(solib)
+     so we can reuse arch_path below.  */
+  arch_path =
+    alloca (strlen (nto_root) + strlen (arch) + strlen (endian) + 2 +
+           strlen (solib));
   sprintf (arch_path, "%s/%s%s", nto_root, arch, endian);
 
-  buf = alloca (strlen (path_fmt) + strlen (arch_path) * 5 + 1);
-  sprintf (buf, path_fmt, arch_path, arch_path, arch_path, arch_path,
+  buf = alloca (strlen (PATH_FMT) + strlen (arch_path) * 5 + 1);
+  sprintf (buf, PATH_FMT, arch_path, arch_path, arch_path, arch_path,
           arch_path);
 
-  return openp (buf, 1, solib, o_flags, 0, temp_pathname);
+  /* Don't assume basename() isn't destructive.  */
+  base = strrchr (solib, '/');
+  if (!base)
+    base = solib;
+  else
+    base++;                    /* Skip over '/'.  */
+
+  ret = openp (buf, 1, base, o_flags, 0, temp_pathname);
+  if (ret < 0 && base != solib)
+    {
+      sprintf (arch_path, "/%s", solib);
+      ret = open (arch_path, o_flags, 0);
+      if (temp_pathname)
+       {
+         if (ret >= 0)
+           *temp_pathname = gdb_realpath (arch_path);
+         else
+           **temp_pathname = '\0';
+       }
+    }
+  return ret;
 }
 
 void
@@ -130,7 +169,8 @@ nto_init_solib_absolute_prefix (void)
       arch = "x86";
       endian = "";
     }
-  else if (strcmp (TARGET_ARCHITECTURE->arch_name, "rs6000") == 0)
+  else if (strcmp (TARGET_ARCHITECTURE->arch_name, "rs6000") == 0
+          || strcmp (TARGET_ARCHITECTURE->arch_name, "powerpc") == 0)
     {
       arch = "ppc";
       endian = "be";
@@ -264,32 +304,35 @@ nto_relocate_section_addresses (struct so_list *so, struct section_table *sec)
   sec->endaddr = nto_truncate_ptr (sec->endaddr + LM_ADDR (so) - vaddr);
 }
 
-static void
-fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
-                     int which, CORE_ADDR reg_addr)
+/* This is cheating a bit because our linker code is in libc.so.  If we
+   ever implement lazy linking, this may need to be re-examined.  */
+int
+nto_in_dynsym_resolve_code (CORE_ADDR pc)
 {
-  nto_regset_t regset;
+  if (in_plt_section (pc, NULL))
+    return 1;
+  return 0;
+}
 
-  nto_init_solib_absolute_prefix ();
+void
+nto_generic_supply_gpregset (const struct regset *regset,
+                            struct regcache *regcache, int regnum,
+                            const void *gregs, size_t len)
+{
+}
 
-  if (which == NTO_REG_GENERAL)
-    {
-      memcpy ((char *) &regset, core_reg_sect,
-             min (core_reg_size, sizeof (regset)));
-      nto_supply_gregset ((char *) &regset);
-    }
-  else if (which == NTO_REG_FLOAT)
-    {
-      memcpy ((char *) &regset, core_reg_sect,
-             min (core_reg_size, sizeof (regset)));
-      nto_supply_fpregset ((char *) &regset);
-    }
-  else if (which == NTO_REG_ALT)
-    {
-      memcpy ((char *) &regset, core_reg_sect,
-             min (core_reg_size, sizeof (regset)));
-      nto_supply_altregset ((char *) &regset);
-    }
+void
+nto_generic_supply_fpregset (const struct regset *regset,
+                            struct regcache *regcache, int regnum,
+                            const void *fpregs, size_t len)
+{
+}
+
+void
+nto_generic_supply_altregset (const struct regset *regset,
+                             struct regcache *regcache, int regnum,
+                             const void *altregs, size_t len)
+{
 }
 
 void
@@ -298,33 +341,17 @@ nto_dummy_supply_regset (char *regs)
   /* Do nothing.  */
 }
 
-/* Register that we are able to handle ELF file formats using standard
-   procfs "regset" structures.  */
-static struct core_fns regset_core_fns = {
-  bfd_target_elf_flavour,      /* core_flavour */
-  default_check_format,                /* check_format */
-  default_core_sniffer,                /* core_sniffer */
-  fetch_core_registers,                /* core_read_registers */
-  NULL                         /* next */
-};
+enum gdb_osabi
+nto_elf_osabi_sniffer (bfd *abfd)
+{
+  if (nto_is_nto_target)
+    return nto_is_nto_target (abfd);
+  return GDB_OSABI_UNKNOWN;
+}
 
 void
-_initialize_nto_tdep (void)
+nto_initialize_signals (void)
 {
-       /*
-  add_show_from_set (add_set_cmd ("nto-debug", class_maintenance, var_zinteger, (char *) &nto_internal_debugging, "Set QNX NTO internal debugging.\n\
-When non-zero, nto specific debug info is\n\
-displayed. Different information is displayed\n\
-for different positive values.", &setdebuglist),
-                    &showdebuglist);
-                    */
-  add_setshow_cmd ("nto-debug", class_maintenance, var_zinteger,
-                 &nto_internal_debugging, "Set QNX NTO internal debugging.\n\
-When non-zero, nto specific debug info is\n\
-displayed. Different information is displayed\n\
-for different positive values.",  "Show QNX NTO internal debugging.\n",
-                 NULL, NULL, &setdebuglist, &showdebuglist);
-
   /* We use SIG45 for pulses, or something, so nostop, noprint
      and pass them.  */
   signal_stop_update (target_signal_from_name ("SIG45"), 0);
@@ -343,7 +370,19 @@ for different positive values.",  "Show QNX NTO internal debugging.\n",
   signal_print_update (SIGPHOTON, 0);
   signal_pass_update (SIGPHOTON, 1);
 #endif
+}
 
-  /* Register core file support.  */
-  add_core_fns (&regset_core_fns);
+void
+_initialize_nto_tdep (void)
+{
+  add_setshow_zinteger_cmd ("nto-debug", class_maintenance,
+                           &nto_internal_debugging, _("\
+Set QNX NTO internal debugging."), _("\
+Show QNX NTO internal debugging."), _("\
+When non-zero, nto specific debug info is\n\
+displayed. Different information is displayed\n\
+for different positive values."),
+                           NULL,
+                           NULL, /* FIXME: i18n: QNX NTO internal debugging is %s.  */
+                           &setdebuglist, &showdebuglist);
 }
This page took 0.026876 seconds and 4 git commands to generate.