Back to index

cell-binutils  2.17cvs20070401
Classes | Defines | Typedefs | Functions | Variables
ppcboot.c File Reference
#include "safe-ctype.h"
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"

Go to the source code of this file.

Classes

struct  ppcboot_location
struct  ppcboot_partition
struct  ppcboot_hdr
struct  ppcboot_data

Defines

#define SIGNATURE0   0x55
#define SIGNATURE1   0xaa
#define PPC_IND   0x41
#define PPCBOOT_SYMS   3
#define ppcboot_set_tdata(abfd, ptr)   ((abfd)->tdata.any = (PTR) (ptr))
#define ppcboot_get_tdata(abfd)   ((ppcboot_data_t *) ((abfd)->tdata.any))
#define ppcboot_close_and_cleanup   _bfd_generic_close_and_cleanup
#define ppcboot_bfd_free_cached_info   _bfd_generic_bfd_free_cached_info
#define ppcboot_new_section_hook   _bfd_generic_new_section_hook
#define ppcboot_make_empty_symbol   _bfd_generic_make_empty_symbol
#define ppcboot_print_symbol   _bfd_nosymbols_print_symbol
#define ppcboot_bfd_is_target_special_symbol   ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
#define ppcboot_bfd_is_local_label_name   bfd_generic_is_local_label_name
#define ppcboot_get_lineno   _bfd_nosymbols_get_lineno
#define ppcboot_find_nearest_line   _bfd_nosymbols_find_nearest_line
#define ppcboot_find_inliner_info   _bfd_nosymbols_find_inliner_info
#define ppcboot_bfd_make_debug_symbol   _bfd_nosymbols_bfd_make_debug_symbol
#define ppcboot_read_minisymbols   _bfd_generic_read_minisymbols
#define ppcboot_minisymbol_to_symbol   _bfd_generic_minisymbol_to_symbol
#define ppcboot_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
#define ppcboot_bfd_relax_section   bfd_generic_relax_section
#define ppcboot_bfd_gc_sections   bfd_generic_gc_sections
#define ppcboot_bfd_merge_sections   bfd_generic_merge_sections
#define ppcboot_bfd_is_group_section   bfd_generic_is_group_section
#define ppcboot_bfd_discard_group   bfd_generic_discard_group
#define ppcboot_section_already_linked   _bfd_generic_section_already_linked
#define ppcboot_bfd_link_hash_table_create   _bfd_generic_link_hash_table_create
#define ppcboot_bfd_link_hash_table_free   _bfd_generic_link_hash_table_free
#define ppcboot_bfd_link_add_symbols   _bfd_generic_link_add_symbols
#define ppcboot_bfd_link_just_syms   _bfd_generic_link_just_syms
#define ppcboot_bfd_final_link   _bfd_generic_final_link
#define ppcboot_bfd_link_split_section   _bfd_generic_link_split_section
#define ppcboot_get_section_contents_in_window   _bfd_generic_get_section_contents_in_window
#define ppcboot_bfd_copy_private_bfd_data   _bfd_generic_bfd_copy_private_bfd_data
#define ppcboot_bfd_merge_private_bfd_data   _bfd_generic_bfd_merge_private_bfd_data
#define ppcboot_bfd_copy_private_section_data   _bfd_generic_bfd_copy_private_section_data
#define ppcboot_bfd_copy_private_symbol_data   _bfd_generic_bfd_copy_private_symbol_data
#define ppcboot_bfd_copy_private_header_data   _bfd_generic_bfd_copy_private_header_data
#define ppcboot_bfd_set_private_flags   _bfd_generic_bfd_set_private_flags
#define ppcboot_bfd_print_private_bfd_dat   ppcboot_bfd_print_private_bfd_data

Typedefs

typedef struct ppcboot_location ppcboot_location_t
typedef struct ppcboot_partition ppcboot_partition_t
typedef struct ppcboot_hdr ppcboot_hdr_t
typedef struct ppcboot_data ppcboot_data_t

Functions

static bfd_boolean ppcboot_mkobject PARAMS ((bfd *))
static bfd_boolean
ppcboot_set_arch_mach 
PARAMS ((bfd *, enum bfd_architecture, unsigned long))
static bfd_boolean
ppcboot_get_section_contents 
PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type))
static char *mangle_name PARAMS ((bfd *, char *))
static long
ppcboot_canonicalize_symtab 
PARAMS ((bfd *, asymbol **))
static void ppcboot_get_symbol_info PARAMS ((bfd *, asymbol *, symbol_info *))
static bfd_boolean
ppcboot_bfd_print_private_bfd_data 
PARAMS ((bfd *, PTR))
static bfd_boolean ppcboot_mkobject (bfd *abfd)
static bfd_boolean ppcboot_set_arch_mach (bfd *abfd, enum bfd_architecture arch, unsigned long machine)
static const bfd_targetppcboot_object_p (bfd *abfd)
static bfd_boolean ppcboot_get_section_contents (bfd *abfd, section, PTR location, file_ptr offset, bfd_size_type count)
static long ppcboot_get_symtab_upper_bound (abfd)
static char * mangle_name (bfd *abfd, char *suffix)
static long ppcboot_canonicalize_symtab (bfd *abfd, asymbol **alocation)
static void ppcboot_get_symbol_info (ignore_abfd, asymbol *symbol, symbol_info *ret)
static bfd_boolean ppcboot_set_section_contents (bfd *abfd, asection *sec, const PTR data, file_ptr offset, bfd_size_type size)
static int ppcboot_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info ATTRIBUTE_UNUSED)
static bfd_boolean ppcboot_bfd_print_private_bfd_data (bfd *abfd, PTR farg)

Variables

const bfd_target ppcboot_vec

Class Documentation

struct ppcboot_location

Definition at line 41 of file ppcboot.c.

Class Members
bfd_byte cylinder
bfd_byte head
bfd_byte ind
bfd_byte sector
struct ppcboot_partition

Definition at line 49 of file ppcboot.c.

Collaboration diagram for ppcboot_partition:
Class Members
ppcboot_location_t partition_begin
ppcboot_location_t partition_end
bfd_byte sector_begin
bfd_byte sector_length
struct ppcboot_hdr

Definition at line 57 of file ppcboot.c.

Collaboration diagram for ppcboot_hdr:
Class Members
bfd_byte entry_offset
bfd_byte flags
bfd_byte length
bfd_byte os_id
ppcboot_partition_t partition
char partition_name
bfd_byte pc_compatibility
bfd_byte reserved1
bfd_byte signature
struct ppcboot_data

Definition at line 81 of file ppcboot.c.

Collaboration diagram for ppcboot_data:
Class Members
ppcboot_hdr_t header
asection * sec

Define Documentation

#define PPC_IND   0x41

Definition at line 78 of file ppcboot.c.

Definition at line 481 of file ppcboot.c.

Definition at line 485 of file ppcboot.c.

Definition at line 483 of file ppcboot.c.

Definition at line 484 of file ppcboot.c.

Definition at line 469 of file ppcboot.c.

Definition at line 476 of file ppcboot.c.

Definition at line 226 of file ppcboot.c.

Definition at line 466 of file ppcboot.c.

Definition at line 463 of file ppcboot.c.

Definition at line 468 of file ppcboot.c.

Definition at line 350 of file ppcboot.c.

Definition at line 348 of file ppcboot.c.

Definition at line 474 of file ppcboot.c.

Definition at line 472 of file ppcboot.c.

Definition at line 473 of file ppcboot.c.

Definition at line 475 of file ppcboot.c.

Definition at line 477 of file ppcboot.c.

Definition at line 354 of file ppcboot.c.

Definition at line 482 of file ppcboot.c.

Definition at line 467 of file ppcboot.c.

Definition at line 487 of file ppcboot.c.

Definition at line 465 of file ppcboot.c.

Definition at line 486 of file ppcboot.c.

Definition at line 225 of file ppcboot.c.

Definition at line 353 of file ppcboot.c.

Definition at line 352 of file ppcboot.c.

Definition at line 351 of file ppcboot.c.

Definition at line 478 of file ppcboot.c.

#define ppcboot_get_tdata (   abfd)    ((ppcboot_data_t *) ((abfd)->tdata.any))

Definition at line 105 of file ppcboot.c.

Definition at line 334 of file ppcboot.c.

Definition at line 356 of file ppcboot.c.

Definition at line 227 of file ppcboot.c.

Definition at line 335 of file ppcboot.c.

Definition at line 355 of file ppcboot.c.

Definition at line 470 of file ppcboot.c.

#define ppcboot_set_tdata (   abfd,
  ptr 
)    ((abfd)->tdata.any = (PTR) (ptr))

Definition at line 104 of file ppcboot.c.

#define PPCBOOT_SYMS   3

Definition at line 88 of file ppcboot.c.

#define SIGNATURE0   0x55

Definition at line 74 of file ppcboot.c.

#define SIGNATURE1   0xaa

Definition at line 75 of file ppcboot.c.


Typedef Documentation


Function Documentation

static char* mangle_name ( bfd abfd,
char *  suffix 
) [static]

Definition at line 260 of file ppcboot.c.

{
  bfd_size_type size;
  char *buf;
  char *p;

  size = (strlen (bfd_get_filename (abfd))
         + strlen (suffix)
         + sizeof "_ppcboot__");

  buf = (char *) bfd_alloc (abfd, size);
  if (buf == NULL)
    return "";

  sprintf (buf, "_ppcboot_%s_%s", bfd_get_filename (abfd), suffix);

  /* Change any non-alphanumeric characters to underscores.  */
  for (p = buf; *p; p++)
    if (! ISALNUM (*p))
      *p = '_';

  return buf;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_boolean ppcboot_mkobject PARAMS ( (bfd *)  ) [static]
static char* mangle_name PARAMS ( (bfd *, char *)  ) [static]
static long ppcboot_canonicalize_symtab PARAMS ( (bfd *, asymbol **)  ) [static]
static void ppcboot_get_symbol_info PARAMS ( (bfd *, asymbol *, symbol_info *)  ) [static]
static bfd_boolean ppcboot_bfd_print_private_bfd_data ( bfd abfd,
PTR  farg 
) [static]

Definition at line 402 of file ppcboot.c.

{
  FILE *f = (FILE *)farg;
  ppcboot_data_t *tdata = ppcboot_get_tdata (abfd);
  long entry_offset = bfd_getl_signed_32 ((PTR) tdata->header.entry_offset);
  long length = bfd_getl_signed_32 ((PTR) tdata->header.length);
  int i;

  fprintf (f, _("\nppcboot header:\n"));
  fprintf (f, _("Entry offset        = 0x%.8lx (%ld)\n"), entry_offset, entry_offset);
  fprintf (f, _("Length              = 0x%.8lx (%ld)\n"), length, length);

  if (tdata->header.flags)
    fprintf (f, _("Flag field          = 0x%.2x\n"), tdata->header.flags);

  if (tdata->header.os_id)
    fprintf (f, "OS_ID               = 0x%.2x\n", tdata->header.os_id);

  if (tdata->header.partition_name)
    fprintf (f, _("Partition name      = \"%s\"\n"), tdata->header.partition_name);

  for (i = 0; i < 4; i++)
    {
      long sector_begin  = bfd_getl_signed_32 ((PTR) tdata->header.partition[i].sector_begin);
      long sector_length = bfd_getl_signed_32 ((PTR) tdata->header.partition[i].sector_length);

      /* Skip all 0 entries */
      if (!tdata->header.partition[i].partition_begin.ind
         && !tdata->header.partition[i].partition_begin.head
         && !tdata->header.partition[i].partition_begin.sector
         && !tdata->header.partition[i].partition_begin.cylinder
         && !tdata->header.partition[i].partition_end.ind
         && !tdata->header.partition[i].partition_end.head
         && !tdata->header.partition[i].partition_end.sector
         && !tdata->header.partition[i].partition_end.cylinder
         && !sector_begin && !sector_length)
       continue;

      fprintf (f, _("\nPartition[%d] start  = { 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x }\n"), i,
              tdata->header.partition[i].partition_begin.ind,
              tdata->header.partition[i].partition_begin.head,
              tdata->header.partition[i].partition_begin.sector,
              tdata->header.partition[i].partition_begin.cylinder);

      fprintf (f, _("Partition[%d] end    = { 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x }\n"), i,
              tdata->header.partition[i].partition_end.ind,
              tdata->header.partition[i].partition_end.head,
              tdata->header.partition[i].partition_end.sector,
              tdata->header.partition[i].partition_end.cylinder);

      fprintf (f, _("Partition[%d] sector = 0x%.8lx (%ld)\n"), i, sector_begin, sector_begin);
      fprintf (f, _("Partition[%d] length = 0x%.8lx (%ld)\n"), i, sector_length, sector_length);
    }

  fprintf (f, "\n");
  return TRUE;
}

Here is the call graph for this function:

static long ppcboot_canonicalize_symtab ( bfd abfd,
asymbol **  alocation 
) [static]

Definition at line 290 of file ppcboot.c.

{
  asection *sec = ppcboot_get_tdata (abfd)->sec;
  asymbol *syms;
  unsigned int i;
  bfd_size_type amt = PPCBOOT_SYMS * sizeof (asymbol);

  syms = (asymbol *) bfd_alloc (abfd, amt);
  if (syms == NULL)
    return FALSE;

  /* Start symbol.  */
  syms[0].the_bfd = abfd;
  syms[0].name = mangle_name (abfd, "start");
  syms[0].value = 0;
  syms[0].flags = BSF_GLOBAL;
  syms[0].section = sec;
  syms[0].udata.p = NULL;

  /* End symbol.  */
  syms[1].the_bfd = abfd;
  syms[1].name = mangle_name (abfd, "end");
  syms[1].value = sec->size;
  syms[1].flags = BSF_GLOBAL;
  syms[1].section = sec;
  syms[1].udata.p = NULL;

  /* Size symbol.  */
  syms[2].the_bfd = abfd;
  syms[2].name = mangle_name (abfd, "size");
  syms[2].value = sec->size;
  syms[2].flags = BSF_GLOBAL;
  syms[2].section = bfd_abs_section_ptr;
  syms[2].udata.p = NULL;

  for (i = 0; i < PPCBOOT_SYMS; i++)
    *alocation++ = syms++;
  *alocation = NULL;

  return PPCBOOT_SYMS;
}

Here is the call graph for this function:

static bfd_boolean ppcboot_get_section_contents ( bfd abfd,
section  ,
PTR  location,
file_ptr  offset,
bfd_size_type  count 
) [static]

Definition at line 233 of file ppcboot.c.

{
  if (bfd_seek (abfd, offset + (file_ptr) sizeof (ppcboot_hdr_t), SEEK_SET) != 0
      || bfd_bread (location, count, abfd) != count)
    return FALSE;
  return TRUE;
}

Here is the call graph for this function:

static void ppcboot_get_symbol_info ( ignore_abfd  ,
asymbol symbol,
symbol_info ret 
) [static]

Definition at line 340 of file ppcboot.c.

{
  bfd_symbol_info (symbol, ret);
}

Here is the call graph for this function:

static long ppcboot_get_symtab_upper_bound ( abfd  ) [static]

Definition at line 250 of file ppcboot.c.

{
  return (PPCBOOT_SYMS + 1) * sizeof (asymbol *);
}
static bfd_boolean ppcboot_mkobject ( bfd abfd) [static]

Definition at line 110 of file ppcboot.c.

{
  if (!ppcboot_get_tdata (abfd))
    {
      bfd_size_type amt = sizeof (ppcboot_data_t);
      ppcboot_set_tdata (abfd, bfd_zalloc (abfd, amt));
    }

  return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static const bfd_target* ppcboot_object_p ( bfd abfd) [static]

Definition at line 145 of file ppcboot.c.

{
  struct stat statbuf;
  asection *sec;
  ppcboot_hdr_t hdr;
  size_t i;
  ppcboot_data_t *tdata;
  flagword flags;

  BFD_ASSERT (sizeof (ppcboot_hdr_t) == 1024);

  if (abfd->target_defaulted)
    {
      bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  /* Find the file size.  */
  if (bfd_stat (abfd, &statbuf) < 0)
    {
      bfd_set_error (bfd_error_system_call);
      return NULL;
    }

  if ((size_t) statbuf.st_size < sizeof (ppcboot_hdr_t))
    {
      bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  if (bfd_bread ((PTR) &hdr, (bfd_size_type) sizeof (hdr), abfd)
      != sizeof (hdr))
    {
      if (bfd_get_error () != bfd_error_system_call)
       bfd_set_error (bfd_error_wrong_format);

      return NULL;
    }

  /* Now do some basic checks.  */
  for (i = 0; i < sizeof (hdr.pc_compatibility); i++)
    if (hdr.pc_compatibility[i])
      {
       bfd_set_error (bfd_error_wrong_format);
       return NULL;
      }

  if (hdr.signature[0] != SIGNATURE0 || hdr.signature[1] != SIGNATURE1)
    {
      bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  if (hdr.partition[0].partition_end.ind != PPC_IND)
    {
      bfd_set_error (bfd_error_wrong_format);
      return NULL;
    }

  abfd->symcount = PPCBOOT_SYMS;

  /* One data section.  */
  flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_CODE | SEC_HAS_CONTENTS;
  sec = bfd_make_section_with_flags (abfd, ".data", flags);
  if (sec == NULL)
    return NULL;
  sec->vma = 0;
  sec->size = statbuf.st_size - sizeof (ppcboot_hdr_t);
  sec->filepos = sizeof (ppcboot_hdr_t);

  ppcboot_mkobject (abfd);
  tdata = ppcboot_get_tdata (abfd);
  tdata->sec = sec;
  memcpy ((PTR) &tdata->header, (PTR) &hdr, sizeof (ppcboot_hdr_t));

  ppcboot_set_arch_mach (abfd, bfd_arch_powerpc, 0L);
  return abfd->xvec;
}

Here is the call graph for this function:

static bfd_boolean ppcboot_set_arch_mach ( bfd abfd,
enum bfd_architecture  arch,
unsigned long  machine 
) [static]

Definition at line 125 of file ppcboot.c.

{
  if (arch == bfd_arch_unknown)
    arch = bfd_arch_powerpc;

  else if (arch != bfd_arch_powerpc)
    return FALSE;

  return bfd_default_set_arch_mach (abfd, arch, machine);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_boolean ppcboot_set_section_contents ( bfd abfd,
asection sec,
const PTR  data,
file_ptr  offset,
bfd_size_type  size 
) [static]

Definition at line 361 of file ppcboot.c.

{
  if (! abfd->output_has_begun)
    {
      bfd_vma low;
      asection *s;

      /* The lowest section VMA sets the virtual address of the start
         of the file.  We use the set the file position of all the
         sections.  */
      low = abfd->sections->vma;
      for (s = abfd->sections->next; s != NULL; s = s->next)
       if (s->vma < low)
         low = s->vma;

      for (s = abfd->sections; s != NULL; s = s->next)
       s->filepos = s->vma - low;

      abfd->output_has_begun = TRUE;
    }

  return _bfd_generic_set_section_contents (abfd, sec, data, offset, size);
}

Here is the call graph for this function:

static int ppcboot_sizeof_headers ( bfd *abfd  ATTRIBUTE_UNUSED,
struct bfd_link_info *info  ATTRIBUTE_UNUSED 
) [static]

Definition at line 392 of file ppcboot.c.

{
  return sizeof (ppcboot_hdr_t);
}

Variable Documentation

Definition at line 489 of file ppcboot.c.