Back to index

cell-binutils  2.17cvs20070401
Classes | Defines | Functions | Variables
netbsd-core.c File Reference
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
#include "libaout.h"
#include <sys/param.h>
#include <sys/dir.h>
#include <signal.h>
#include <sys/core.h>

Go to the source code of this file.

Classes

struct  netbsd_core_struct

Defines

#define M_SPARC64_OPENBSD   M_MIPS1
#define SPARC_WCOOKIE_OFFSET   344
#define SPARC64_WCOOKIE_OFFSET   832
#define netbsd_core_file_matches_executable_p   generic_core_file_matches_executable_p
#define NO_GET   ((bfd_vma (*) (const void *)) swap_abort)
#define NO_PUT   ((void (*) (bfd_vma, void *)) swap_abort)
#define NO_GETS   ((bfd_signed_vma (*) (const void *)) swap_abort)
#define NO_GET64   ((bfd_uint64_t (*) (const void *)) swap_abort)
#define NO_PUT64   ((void (*) (bfd_uint64_t, void *)) swap_abort)
#define NO_GETS64   ((bfd_int64_t (*) (const void *)) swap_abort)

Functions

static const bfd_targetnetbsd_core_file_p (bfd *abfd)
static char * netbsd_core_file_failing_command (bfd *abfd)
static int netbsd_core_file_failing_signal (bfd *abfd)
static void swap_abort (void)

Variables

struct netbsd_core_structrawptr
const bfd_target netbsd_core_vec

Class Documentation

struct netbsd_core_struct

Definition at line 47 of file netbsd-core.c.


Define Documentation

#define M_SPARC64_OPENBSD   M_MIPS1

Definition at line 35 of file netbsd-core.c.

Definition at line 45 of file netbsd-core.c.

#define NO_GET   ((bfd_vma (*) (const void *)) swap_abort)

Definition at line 261 of file netbsd-core.c.

#define NO_GET64   ((bfd_uint64_t (*) (const void *)) swap_abort)

Definition at line 264 of file netbsd-core.c.

#define NO_GETS   ((bfd_signed_vma (*) (const void *)) swap_abort)

Definition at line 263 of file netbsd-core.c.

#define NO_GETS64   ((bfd_int64_t (*) (const void *)) swap_abort)

Definition at line 266 of file netbsd-core.c.

#define NO_PUT   ((void (*) (bfd_vma, void *)) swap_abort)

Definition at line 262 of file netbsd-core.c.

#define NO_PUT64   ((void (*) (bfd_uint64_t, void *)) swap_abort)

Definition at line 265 of file netbsd-core.c.

#define SPARC64_WCOOKIE_OFFSET   832

Definition at line 43 of file netbsd-core.c.

#define SPARC_WCOOKIE_OFFSET   344

Definition at line 39 of file netbsd-core.c.


Function Documentation

static char* netbsd_core_file_failing_command ( bfd abfd) [static]

Definition at line 239 of file netbsd-core.c.

{
  /*return core_command (abfd);*/
  return abfd->tdata.netbsd_core_data->core.c_name;
}
static int netbsd_core_file_failing_signal ( bfd abfd) [static]

Definition at line 246 of file netbsd-core.c.

{
  /*return core_signal (abfd);*/
  return abfd->tdata.netbsd_core_data->core.c_signo;
}
static const bfd_target* netbsd_core_file_p ( bfd abfd) [static]

Definition at line 55 of file netbsd-core.c.

{
  int val;
  unsigned i;
  file_ptr offset;
  asection *asect;
  struct core core;
  struct coreseg coreseg;
  bfd_size_type amt = sizeof core;

  val = bfd_bread (&core, amt, abfd);
  if (val != sizeof core)
    {
      /* Too small to be a core file.  */
      bfd_set_error (bfd_error_wrong_format);
      return 0;
    }

  if (CORE_GETMAGIC (core) != COREMAGIC)
    {
      bfd_set_error (bfd_error_wrong_format);
      return 0;
    }

  amt = sizeof (struct netbsd_core_struct);
  rawptr = (struct netbsd_core_struct *) bfd_zalloc (abfd, amt);
  if (rawptr == NULL)
    return 0;

  rawptr->core = core;
  abfd->tdata.netbsd_core_data = rawptr;

  offset = core.c_hdrsize;
  for (i = 0; i < core.c_nseg; i++)
    {
      const char *sname;
      flagword flags;

      if (bfd_seek (abfd, offset, SEEK_SET) != 0)
       goto punt;

      val = bfd_bread (&coreseg, sizeof coreseg, abfd);
      if (val != sizeof coreseg)
       {
         bfd_set_error (bfd_error_file_truncated);
         goto punt;
       }
      if (CORE_GETMAGIC (coreseg) != CORESEGMAGIC)
       {
         bfd_set_error (bfd_error_wrong_format);
         goto punt;
       }

      offset += core.c_seghdrsize;

      switch (CORE_GETFLAG (coreseg))
       {
       case CORE_CPU:
         sname = ".reg";
         flags = SEC_ALLOC + SEC_HAS_CONTENTS;
         break;
       case CORE_DATA:
         sname = ".data";
         flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
         break;
       case CORE_STACK:
         sname = ".stack";
         flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
         break;
       default:
         sname = ".unknown";
         flags = SEC_ALLOC + SEC_HAS_CONTENTS;
         break;
       }
      asect = bfd_make_section_anyway_with_flags (abfd, sname, flags);
      if (asect == NULL)
       goto punt;

      asect->size = coreseg.c_size;
      asect->vma = coreseg.c_addr;
      asect->filepos = offset;
      asect->alignment_power = 2;

      if (CORE_GETFLAG (coreseg) == CORE_CPU)
       {
         bfd_size_type wcookie_offset;

         switch (CORE_GETMID (core))
           {
           case M_SPARC_NETBSD:
             wcookie_offset = SPARC_WCOOKIE_OFFSET;
             break;
           case M_SPARC64_OPENBSD:
             wcookie_offset = SPARC64_WCOOKIE_OFFSET;
             break;
           default:
             wcookie_offset = 0;
             break;
           }

         if (wcookie_offset > 0 && coreseg.c_size > wcookie_offset)
           {
             /* Truncate the .reg section.  */
             asect->size = wcookie_offset;

             /* And create the .wcookie section.  */
             flags = SEC_ALLOC + SEC_HAS_CONTENTS;
             asect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
                                                   flags);
             if (asect == NULL)
              goto punt;

             asect->size = coreseg.c_size - wcookie_offset;
             asect->vma = 0;
             asect->filepos = offset + wcookie_offset;
             asect->alignment_power = 2;
           }
       }

      offset += coreseg.c_size;
    }

  /* Set architecture from machine ID.  */
  switch (CORE_GETMID (core))
    {
    case M_ALPHA_NETBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0);
      break;

    case M_ARM6_NETBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_3);
      break;

    case M_X86_64_NETBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
      break;

    case M_386_NETBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386);
      break;

    case M_68K_NETBSD:
    case M_68K4K_NETBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0);
      break;

    case M_88K_OPENBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_m88k, 0);
      break;

    case M_HPPA_OPENBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_hppa, bfd_mach_hppa11);
      break;

    case M_POWERPC_NETBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_powerpc, bfd_mach_ppc);
      break;

    case M_SPARC_NETBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
      break;

    case M_SPARC64_NETBSD:
    case M_SPARC64_OPENBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9);
      break;

    case M_VAX_NETBSD:
    case M_VAX4K_NETBSD:
      bfd_default_set_arch_mach (abfd, bfd_arch_vax, 0);
      break;
    }

  /* OK, we believe you.  You're a core file (sure, sure).  */
  return abfd->xvec;

 punt:
  bfd_release (abfd, abfd->tdata.any);
  abfd->tdata.any = NULL;
  bfd_section_list_clear (abfd);
  return 0;
}

Here is the call graph for this function:

static void swap_abort ( void  ) [static]

Definition at line 255 of file netbsd-core.c.

{
 /* This way doesn't require any declaration for ANSI to fuck up.  */
  abort ();
}

Variable Documentation

Definition at line 268 of file netbsd-core.c.