* Makefile.in (OPTIONAL_BACKENDS): Add lynx-core.o.
authorStu Grossman <grossman@cygnus>
Wed, 22 Sep 1993 14:54:50 +0000 (14:54 +0000)
committerStu Grossman <grossman@cygnus>
Wed, 22 Sep 1993 14:54:50 +0000 (14:54 +0000)
* bfd-in2.h (tdata):  Add lynx_core_data;
* config.bfd configure.host:  Get rid of superfluous netbsd and
lynxos entries.
* configure.in:  Add lynx-core.o to Lynx config.
* i386lynx.c:  Add defs for core file support.
* lynx-core.c:  New file with Lynx core file support.
* hosts/i386lynx.h:  Move lots of host specific includes to here.
Add def of HOST_LYNX.  Remove unnecessary defs.

bfd/bfd-in2.h
bfd/config.bfd
bfd/hosts/i386lynx.h
bfd/lynx-core.c [new file with mode: 0644]

index c7ca34e..2054de7 100644 (file)
@@ -188,9 +188,6 @@ typedef enum bfd_symclass {
            } symclass;
 
 
-typedef int symtype;           /* Who knows, yet? */
-
-
 /* general purpose part of a symbol;
    target specific parts will be found in libcoff.h, liba.out.h etc */
 
@@ -406,6 +403,27 @@ CAT(NAME,_bfd_make_debug_symbol)
 
 #define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
 
+/* Byte swapping routines.  */
+
+bfd_vma                bfd_getb64         PARAMS ((unsigned char *));
+bfd_vma        bfd_getl64         PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getb_signed_64 PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getl_signed_64 PARAMS ((unsigned char *));
+bfd_vma                bfd_getb32         PARAMS ((unsigned char *));
+bfd_vma                bfd_getl32         PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getb_signed_32 PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getl_signed_32 PARAMS ((unsigned char *));
+bfd_vma                bfd_getb16         PARAMS ((unsigned char *));
+bfd_vma                bfd_getl16         PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getb_signed_16 PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getl_signed_16 PARAMS ((unsigned char *));
+void           bfd_putb64         PARAMS ((bfd_vma, unsigned char *));
+void           bfd_putl64         PARAMS ((bfd_vma, unsigned char *));
+void           bfd_putb32         PARAMS ((bfd_vma, unsigned char *));
+void           bfd_putl32         PARAMS ((bfd_vma, unsigned char *));
+void           bfd_putb16         PARAMS ((bfd_vma, unsigned char *));
+void           bfd_putl16         PARAMS ((bfd_vma, unsigned char *));
+
 /* And more from the source.  */
 void 
 bfd_init PARAMS ((void));
@@ -1539,6 +1557,7 @@ struct _bfd
       struct hppa_data_struct *hppa_data;
       struct hpux_core_struct *hpux_core_data;
       struct sgi_core_struct *sgi_core_data;
+      struct lynx_core_struct *lynx_core_data;
       PTR any;
       } tdata;
   
index 47e9f6e..1f5407a 100755 (executable)
@@ -29,11 +29,9 @@ case "${canon}" in
   i[34]86-*-sysv4*)    bfd_name=i386-elf ;;
   i[34]86-*-solaris2*) bfd_name=i386-elf ;;
   i[34]86-*-sysv*)     bfd_name=i386-coff ;;
-  i[34]86-*-isc*)      bfd_name=i386-sco ;; # gets core dump reading right
-  i[34]86-*-sco*)      bfd_name=i386-sco ;;
+  i[34]86-*-isc*)      bfd_name=i386-coff ;;
+  i[34]86-*-sco*)      bfd_name=i386-coff ;;
   i[34]86-*-bsd*)      bfd_name=i386-bsd ;;
-  i[34]86-*-netbsd)    bfd_name=i386-netbsd ;; # CYGNUS LOCAL
-  i[34]86-*-lynxos*)   bfd_name=i386-lynx ;;
   i[34]86-*-coff)      bfd_name=i386-coff ;;
   i[34]86-*-aix*)      bfd_name=i386-coff ;;
   i[34]86-*-elf)       bfd_name=i386-elf ;;
index 59adeff..b399533 100644 (file)
@@ -1,35 +1,32 @@
-/* Intel 386 running any BSD Unix */
+/* Intel 386 running Lynx OS */
+
+#ifndef hosts_i386lynx_h
+#define hosts_i386lynx_h
 
-#ifndef        hosts_i386bsd_H
 #include <fcntl.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 #include <ctype.h>
 #include <string.h>
-#include <sys/file.h>
 
-#ifndef        O_ACCMODE
-#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR)
-#endif
-
-#define SEEK_SET 0
-#define SEEK_CUR 1
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/mem.h>
+#include <sys/signal.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/itimer.h>
+#include <sys/file.h>
+#include <sys/proc.h>
 
 #define        HOST_PAGE_SIZE          NBPG
 #define        HOST_MACHINE_ARCH       bfd_arch_i386
-#define        HOST_TEXT_START_ADDR            USRTEXT
+#define        HOST_TEXT_START_ADDR    USRTEXT
 
-#define u_comm u_kproc.kp_proc.p_comm
+#define HOST_LYNX
 
 #include "fopen-same.h"
-#define hosts_i386bsd_H
 #undef I386                    /* Lynx defines this for some reason */
-#endif
 
-/* From ANSI C <stddef.h>, which we can't depend upon the existence of */
-#ifndef        offsetof
-#define        offsetof(type,memb)     ((size_t)&(((type *)0)->memb))
-#endif
+#endif         /* hosts_i386lynx_h */
diff --git a/bfd/lynx-core.c b/bfd/lynx-core.c
new file mode 100644 (file)
index 0000000..5c5e2be
--- /dev/null
@@ -0,0 +1,205 @@
+/* BFD back end for Lynx core files
+   Copyright 1993 Free Software Foundation, Inc.
+   Written by Stu Grossman of Cygnus Support.
+
+This file is part of BFD, the Binary File Descriptor library.
+
+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.
+
+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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#include "bfd.h"
+#include "sysdep.h"
+#include "libbfd.h"
+
+#ifdef HOST_LYNX               /* Core files only work locally for now */
+
+/* These are stored in the bfd's tdata */
+
+struct lynx_core_struct 
+{
+  int sig;
+  char cmd[PNMLEN + 1];
+};
+
+#define core_hdr(bfd) ((bfd)->tdata.lynx_core_data)
+#define core_signal(bfd) (core_hdr(bfd)->sig)
+#define core_command(bfd) (core_hdr(bfd)->cmd)
+
+/* Handle Lynx core dump file.  */
+
+static asection *
+make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos)
+     bfd *abfd;
+     CONST char *name;
+     flagword flags;
+     bfd_size_type _raw_size;
+     bfd_vma vma;
+     file_ptr filepos;
+{
+  asection *asect;
+  char *newname;
+
+  newname = bfd_alloc (abfd, strlen (name) + 1);
+  if (!newname)
+    return NULL;
+
+  strcpy (newname, name);
+
+  asect = bfd_make_section (abfd, newname);
+  if (!asect)
+    return NULL;
+
+  asect->flags = flags;
+  asect->_raw_size = _raw_size;
+  asect->vma = vma;
+  asect->filepos = filepos;
+  asect->alignment_power = 2;
+
+  return asect;
+}
+
+/* ARGSUSED */
+bfd_target *
+lynx_core_file_p (abfd)
+     bfd *abfd;
+{
+  int val;
+  int secnum;
+  struct pssentry pss;
+  size_t tcontext_size;
+  core_st_t *threadp;
+  int pagesize;
+  asection *newsect;
+
+  pagesize = getpagesize ();   /* Serious cross-target issue here...  This
+                                  really needs to come from a system-specific
+                                  header file.  */
+
+  /* Get the pss entry from the core file */
+
+  bfd_seek (abfd, 0, SEEK_SET);
+
+  val = bfd_read ((void *)&pss, 1, sizeof pss, abfd);
+  if (val != sizeof pss)
+    {
+      /* Too small to be a core file */
+      bfd_error = wrong_format;
+      return NULL;
+  }
+
+  core_hdr (abfd) = (struct lynx_core_struct *)
+    bfd_zalloc (abfd, sizeof (struct lynx_core_struct));
+
+  if (!core_hdr (abfd))
+    {
+      bfd_error = no_memory;
+      return NULL;
+    }
+
+  strncpy (core_command (abfd), pss.pname, PNMLEN + 1);
+
+  /* Compute the size of the thread contexts */
+
+  tcontext_size = pss.threadcnt * sizeof (core_st_t);
+
+  /* Allocate space for the thread contexts */
+
+  threadp = (core_st_t *)bfd_zalloc (abfd, tcontext_size);
+  if (!threadp)
+    {
+      bfd_error = no_memory;
+      return NULL;
+    }
+
+  /* Save thread contexts */
+
+  bfd_seek (abfd, pagesize, SEEK_SET);
+
+  val = bfd_read ((void *)threadp, pss.threadcnt, sizeof (core_st_t), abfd);
+
+  if (val != tcontext_size)
+    {
+      /* Probably too small to be a core file */
+      bfd_error = wrong_format;
+      return NULL;
+    }
+  
+  core_signal (abfd) = threadp->currsig;
+
+  newsect = make_bfd_asection (abfd, ".stack",
+                              SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS,
+                              pss.ssize,
+                              pss.slimit,
+                              pagesize + tcontext_size);
+  if (!newsect)
+    {
+      bfd_error = no_memory;
+      return NULL;
+    }
+
+  newsect = make_bfd_asection (abfd, ".data",
+                              SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS,
+                              pss.data_len + pss.bss_len,
+                              pss.data_start,
+                              pagesize + tcontext_size + pss.ssize);
+  if (!newsect)
+    {
+      bfd_error = no_memory;
+      return NULL;
+    }
+
+  for (secnum = 0; secnum < pss.threadcnt; secnum++)
+    {
+      char secname[100];
+
+      sprintf (secname, ".reg%d", threadp[secnum].tid);
+      newsect = make_bfd_asection (abfd, secname,
+                                  SEC_ALLOC + SEC_HAS_CONTENTS,
+                                  sizeof (core_st_t),
+                                  0,
+                                  pagesize + secnum * sizeof (core_st_t));
+      if (!newsect)
+       {
+         bfd_error = no_memory;
+         return NULL;
+       }
+    }
+
+  return abfd->xvec;
+}
+
+char *
+lynx_core_file_failing_command (abfd)
+     bfd *abfd;
+{
+  return core_command (abfd);
+}
+
+/* ARGSUSED */
+int
+lynx_core_file_failing_signal (abfd)
+     bfd *abfd;
+{
+  return core_signal (abfd);
+}
+
+/* ARGSUSED */
+boolean
+lynx_core_file_matches_executable_p  (core_bfd, exec_bfd)
+     bfd *core_bfd, *exec_bfd;
+{
+  return true;         /* FIXME, We have no way of telling at this point */
+}
+
+#endif /* HOST_LYNX */