ppcboot.c revision 61843
1226048Sobrien/* BFD back-end for PPCbug boot records.
268349Sobrien   Copyright 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
3360521Sdelphij   Written by Michael Meissner, Cygnus Support, <meissner@cygnus.com>
468349Sobrien
568349SobrienThis file is part of BFD, the Binary File Descriptor library.
668349Sobrien
768349SobrienThis program is free software; you can redistribute it and/or modify
868349Sobrienit under the terms of the GNU General Public License as published by
968349Sobrienthe Free Software Foundation; either version 2 of the License, or
1068349Sobrien(at your option) any later version.
1168349Sobrien
12133359SobrienThis program is distributed in the hope that it will be useful,
13186690Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1468349SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15186690SobrienGNU General Public License for more details.
1668349Sobrien
17186690SobrienYou should have received a copy of the GNU General Public License
1868349Sobrienalong with this program; if not, write to the Free Software
19186690SobrienFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
2068349Sobrien
21186690Sobrien/* This is a BFD backend which may be used to write PowerPCBug boot objects.
2268349Sobrien   It may only be used for output, not input.  The intention is that this may
23186690Sobrien   be used as an output format for objcopy in order to generate raw binary
2468349Sobrien   data.
25186690Sobrien
26133359Sobrien   This is very simple.  The only complication is that the real data
27133359Sobrien   will start at some address X, and in some cases we will not want to
28133359Sobrien   include X zeroes just to get to that point.  Since the start
29133359Sobrien   address is not meaningful for this object file format, we use it
30133359Sobrien   instead to indicate the number of zeroes to skip at the start of
31133359Sobrien   the file.  objcopy cooperates by specially setting the start
32133359Sobrien   address to zero by default.  */
33133359Sobrien
34133359Sobrien#include <ctype.h>
35133359Sobrien
36169942Sobrien#include "bfd.h"
37186690Sobrien#include "sysdep.h"
38133359Sobrien#include "libbfd.h"
39133359Sobrien
40133359Sobrien/* PPCbug location structure */
41133359Sobrientypedef struct ppcboot_location {
4268349Sobrien  bfd_byte	ind;
4368349Sobrien  bfd_byte	head;
4468349Sobrien  bfd_byte	sector;
4568349Sobrien  bfd_byte	cylinder;
4668349Sobrien} ppcboot_location_t;
4768349Sobrien
4868349Sobrien/* PPCbug partition table layout */
4968349Sobrientypedef struct ppcboot_partition {
50133359Sobrien  ppcboot_location_t	partition_begin;	/* partition begin */
51186690Sobrien  ppcboot_location_t	partition_end;		/* partition end */
5268349Sobrien  bfd_byte		sector_begin[4];	/* 32-bit start RBA (zero-based), little endian */
53186690Sobrien  bfd_byte		sector_length[4];	/* 32-bit RBA count (one-based), little endian */
5468349Sobrien} ppcboot_partition_t;
55186690Sobrien
5668349Sobrien/* PPCbug boot layout.  */
57186690Sobrientypedef struct ppcboot_hdr {
5868349Sobrien  bfd_byte		pc_compatibility[446];	/* x86 instruction field */
59186690Sobrien  ppcboot_partition_t	partition[4];		/* partition information */
6068349Sobrien  bfd_byte		signature[2];		/* 0x55 and 0xaa */
61186690Sobrien  bfd_byte		entry_offset[4];	/* entry point offset, little endian */
6268349Sobrien  bfd_byte		length[4];		/* load image length, little endian */
63186690Sobrien  bfd_byte		flags;			/* flag field */
64133359Sobrien  bfd_byte		os_id;			/* OS_ID */
65133359Sobrien  char			partition_name[32];	/* partition name */
66133359Sobrien  bfd_byte		reserved1[470];		/* reserved */
67133359Sobrien}
68133359Sobrien#ifdef __GNUC__
69133359Sobrien  __attribute__ ((packed))
70133359Sobrien#endif
71133359Sobrienppcboot_hdr_t;
72133359Sobrien
73133359Sobrien/* Signature bytes for last 2 bytes of the 512 byte record */
74169942Sobrien#define SIGNATURE0 0x55
75186690Sobrien#define SIGNATURE1 0xaa
76133359Sobrien
77133359Sobrien/* PowerPC boot type */
78133359Sobrien#define PPC_IND 0x41
79133359Sobrien
8068349Sobrien/* Information needed for ppcboot header */
8168349Sobrientypedef struct ppcboot_data {
8268349Sobrien  ppcboot_hdr_t	header;				/* raw header */
8368349Sobrien  asection *sec;				/* single section */
8468349Sobrien} ppcboot_data_t;
8568349Sobrien
8668349Sobrien/* Any bfd we create by reading a ppcboot file has three symbols:
87186690Sobrien   a start symbol, an end symbol, and an absolute length symbol.  */
88133359Sobrien#define PPCBOOT_SYMS 3
89133359Sobrien
90133359Sobrienstatic boolean ppcboot_mkobject PARAMS ((bfd *));
91133359Sobrienstatic const bfd_target *ppcboot_object_p PARAMS ((bfd *));
92133359Sobrienstatic boolean ppcboot_set_arch_mach
93133359Sobrien  PARAMS ((bfd *, enum bfd_architecture, unsigned long));
9468349Sobrienstatic boolean ppcboot_get_section_contents
95186690Sobrien  PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
9668349Sobrienstatic long ppcboot_get_symtab_upper_bound PARAMS ((bfd *));
97186690Sobrienstatic char *mangle_name PARAMS ((bfd *, char *));
9868349Sobrienstatic long ppcboot_get_symtab PARAMS ((bfd *, asymbol **));
99186690Sobrienstatic asymbol *ppcboot_make_empty_symbol PARAMS ((bfd *));
10068349Sobrienstatic void ppcboot_get_symbol_info PARAMS ((bfd *, asymbol *, symbol_info *));
10168349Sobrienstatic boolean ppcboot_set_section_contents
10268349Sobrien  PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
10368349Sobrienstatic int ppcboot_sizeof_headers PARAMS ((bfd *, boolean));
10468349Sobrienstatic boolean ppcboot_bfd_print_private_bfd_data PARAMS ((bfd *, PTR));
10568349Sobrien
10668349Sobrien#define ppcboot_set_tdata(abfd, ptr) ((abfd)->tdata.any = (PTR) (ptr))
107267843Sdelphij#define ppcboot_get_tdata(abfd) ((ppcboot_data_t *) ((abfd)->tdata.any))
10868349Sobrien
10968349Sobrien/* Create a ppcboot object.  Invoked via bfd_set_format.  */
11068349Sobrien
11168349Sobrienstatic boolean
11268349Sobrienppcboot_mkobject (abfd)
11368349Sobrien     bfd *abfd;
11468349Sobrien{
11568349Sobrien  if (!ppcboot_get_tdata (abfd))
11668349Sobrien    ppcboot_set_tdata (abfd, bfd_zalloc (abfd, sizeof (ppcboot_data_t)));
11768349Sobrien
11868349Sobrien  return true;
11968349Sobrien}
120186690Sobrien
121226048Sobrien
122186690Sobrien/* Set the architecture to PowerPC */
123186690Sobrienstatic boolean
124186690Sobrienppcboot_set_arch_mach (abfd, arch, machine)
125186690Sobrien     bfd *abfd;
126186690Sobrien     enum bfd_architecture arch;
12768349Sobrien     unsigned long machine;
12868349Sobrien{
12968349Sobrien  if (arch == bfd_arch_unknown)
130133359Sobrien    arch = bfd_arch_powerpc;
131133359Sobrien
132133359Sobrien  else if (arch != bfd_arch_powerpc)
13368349Sobrien    return false;
134133359Sobrien
13568349Sobrien  return bfd_default_set_arch_mach (abfd, arch, machine);
136133359Sobrien}
137133359Sobrien
138133359Sobrien
139133359Sobrien/* Any file may be considered to be a ppcboot file, provided the target
14068349Sobrien   was not defaulted.  That is, it must be explicitly specified as
141133359Sobrien   being ppcboot.  */
142360521Sdelphij
14368349Sobrienstatic const bfd_target *
144360521Sdelphijppcboot_object_p (abfd)
145360521Sdelphij     bfd *abfd;
146360521Sdelphij{
147360521Sdelphij  struct stat statbuf;
14868349Sobrien  asection *sec;
14968349Sobrien  ppcboot_hdr_t hdr;
15068349Sobrien  size_t i;
15168349Sobrien  ppcboot_data_t *tdata;
15268349Sobrien
15368349Sobrien  BFD_ASSERT (sizeof (ppcboot_hdr_t) == 1024);
154186690Sobrien
155186690Sobrien  if (abfd->target_defaulted)
156186690Sobrien    {
157186690Sobrien      bfd_set_error (bfd_error_wrong_format);
158186690Sobrien      return NULL;
159186690Sobrien    }
160186690Sobrien
161186690Sobrien  /* Find the file size.  */
162186690Sobrien  if (bfd_stat (abfd, &statbuf) < 0)
163186690Sobrien    {
16468349Sobrien      bfd_set_error (bfd_error_system_call);
16568349Sobrien      return NULL;
16668349Sobrien    }
167133359Sobrien
16868349Sobrien  if ((size_t) statbuf.st_size < sizeof (ppcboot_hdr_t))
16968349Sobrien    {
170186690Sobrien      bfd_set_error (bfd_error_wrong_format);
171186690Sobrien      return NULL;
172133359Sobrien    }
17368349Sobrien
174133359Sobrien  if (bfd_read ((PTR) &hdr, sizeof (hdr), 1, abfd) != sizeof (hdr))
17568349Sobrien    {
176186690Sobrien      if (bfd_get_error () != bfd_error_system_call)
177186690Sobrien	bfd_set_error (bfd_error_wrong_format);
178133359Sobrien
179133359Sobrien      return NULL;
180159764Sobrien    }
181186690Sobrien
182186690Sobrien  /* Now do some basic checks.  */
183133359Sobrien  for (i = 0; i < sizeof (hdr.pc_compatibility); i++)
184186690Sobrien    if (hdr.pc_compatibility[i])
185186690Sobrien      {
18668349Sobrien	bfd_set_error (bfd_error_wrong_format);
187186690Sobrien	return NULL;
188186690Sobrien      }
189133359Sobrien
19068349Sobrien  if (hdr.signature[0] != SIGNATURE0 || hdr.signature[1] != SIGNATURE1)
191186690Sobrien    {
192186690Sobrien      bfd_set_error (bfd_error_wrong_format);
193133359Sobrien      return NULL;
19468349Sobrien    }
195186690Sobrien
196186690Sobrien  if (hdr.partition[0].partition_end.ind != PPC_IND)
197133359Sobrien    {
198133359Sobrien      bfd_set_error (bfd_error_wrong_format);
199186690Sobrien      return NULL;
200186690Sobrien    }
201133359Sobrien
20268349Sobrien  abfd->symcount = PPCBOOT_SYMS;
203186690Sobrien
204186690Sobrien  /* One data section.  */
205133359Sobrien  sec = bfd_make_section (abfd, ".data");
20668349Sobrien  if (sec == NULL)
207186690Sobrien    return NULL;
208186690Sobrien  sec->flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_CODE | SEC_HAS_CONTENTS;
209133359Sobrien  sec->vma = 0;
21068349Sobrien  sec->_raw_size = statbuf.st_size - sizeof (ppcboot_hdr_t);
211186690Sobrien  sec->filepos = sizeof (ppcboot_hdr_t);
212186690Sobrien
213133359Sobrien  ppcboot_mkobject (abfd);
214133359Sobrien  tdata = ppcboot_get_tdata (abfd);
215186690Sobrien  tdata->sec = sec;
216186690Sobrien  memcpy ((PTR) &tdata->header, (PTR) &hdr, sizeof (ppcboot_hdr_t));
217133359Sobrien
218186690Sobrien  ppcboot_set_arch_mach (abfd, bfd_arch_powerpc, 0);
219186690Sobrien  return abfd->xvec;
220186690Sobrien}
221133359Sobrien
22269216Sobrien#define ppcboot_close_and_cleanup _bfd_generic_close_and_cleanup
22369216Sobrien#define ppcboot_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
22469216Sobrien#define ppcboot_new_section_hook _bfd_generic_new_section_hook
22568349Sobrien
226186690Sobrien
227186690Sobrien/* Get contents of the only section.  */
228133359Sobrien
22968349Sobrienstatic boolean
230186690Sobrienppcboot_get_section_contents (abfd, section, location, offset, count)
231186690Sobrien     bfd *abfd;
232133359Sobrien     asection *section ATTRIBUTE_UNUSED;
23368349Sobrien     PTR location;
23468349Sobrien     file_ptr offset;
23568349Sobrien     bfd_size_type count;
23668349Sobrien{
23768349Sobrien  if (bfd_seek (abfd, offset + sizeof(ppcboot_hdr_t), SEEK_SET) != 0
23868349Sobrien      || bfd_read (location, 1, count, abfd) != count)
239133359Sobrien    return false;
24068349Sobrien  return true;
241133359Sobrien}
24268349Sobrien
24368349Sobrien
24468349Sobrien/* Return the amount of memory needed to read the symbol table.  */
24568349Sobrien
24668349Sobrienstatic long
247133359Sobrienppcboot_get_symtab_upper_bound (abfd)
248133359Sobrien     bfd *abfd ATTRIBUTE_UNUSED;
249133359Sobrien{
25069216Sobrien  return (PPCBOOT_SYMS + 1) * sizeof (asymbol *);
251133359Sobrien}
252133359Sobrien
253133359Sobrien
254133359Sobrien/* Create a symbol name based on the bfd's filename.  */
255133359Sobrien
256133359Sobrienstatic char *
257133359Sobrienmangle_name (abfd, suffix)
258133359Sobrien     bfd *abfd;
259133359Sobrien     char *suffix;
260226048Sobrien{
261226048Sobrien  int size;
262226048Sobrien  char *buf;
263226048Sobrien  char *p;
264226048Sobrien
265226048Sobrien  size = (strlen (bfd_get_filename (abfd))
26669216Sobrien	  + strlen (suffix)
267226048Sobrien	  + sizeof "_ppcboot__");
268226048Sobrien
269226048Sobrien  buf = (char *) bfd_alloc (abfd, size);
270226048Sobrien  if (buf == NULL)
27169216Sobrien    return "";
27269216Sobrien
27369216Sobrien  sprintf (buf, "_ppcboot_%s_%s", bfd_get_filename (abfd), suffix);
27469216Sobrien
27569216Sobrien  /* Change any non-alphanumeric characters to underscores.  */
27669216Sobrien  for (p = buf; *p; p++)
27769216Sobrien    if (! isalnum ((unsigned char) *p))
278133359Sobrien      *p = '_';
279133359Sobrien
280133359Sobrien  return buf;
281133359Sobrien}
282133359Sobrien
283133359Sobrien
284133359Sobrien/* Return the symbol table.  */
285133359Sobrien
286133359Sobrienstatic long
287133359Sobrienppcboot_get_symtab (abfd, alocation)
288186690Sobrien     bfd *abfd;
289133359Sobrien     asymbol **alocation;
290133359Sobrien{
291226048Sobrien  asection *sec = ppcboot_get_tdata (abfd)->sec;
292226048Sobrien  asymbol *syms;
293133359Sobrien  unsigned int i;
294133359Sobrien
295133359Sobrien  syms = (asymbol *) bfd_alloc (abfd, PPCBOOT_SYMS * sizeof (asymbol));
296133359Sobrien  if (syms == NULL)
29769216Sobrien    return false;
29880588Sobrien
29980588Sobrien  /* Start symbol.  */
300103373Sobrien  syms[0].the_bfd = abfd;
301191736Sobrien  syms[0].name = mangle_name (abfd, "start");
302191736Sobrien  syms[0].value = 0;
303191736Sobrien  syms[0].flags = BSF_GLOBAL;
304191736Sobrien  syms[0].section = sec;
305191736Sobrien  syms[0].udata.p = NULL;
306191736Sobrien
307191736Sobrien  /* End symbol.  */
308328874Seadler  syms[1].the_bfd = abfd;
309103373Sobrien  syms[1].name = mangle_name (abfd, "end");
310103373Sobrien  syms[1].value = sec->_raw_size;
311103373Sobrien  syms[1].flags = BSF_GLOBAL;
312103373Sobrien  syms[1].section = sec;
313103373Sobrien  syms[1].udata.p = NULL;
314103373Sobrien
315103373Sobrien  /* Size symbol.  */
316103373Sobrien  syms[2].the_bfd = abfd;
317103373Sobrien  syms[2].name = mangle_name (abfd, "size");
318103373Sobrien  syms[2].value = sec->_raw_size;
319103373Sobrien  syms[2].flags = BSF_GLOBAL;
320103373Sobrien  syms[2].section = bfd_abs_section_ptr;
321284237Sdelphij  syms[2].udata.p = NULL;
322328874Seadler
323284237Sdelphij  for (i = 0; i < PPCBOOT_SYMS; i++)
324284237Sdelphij    *alocation++ = syms++;
325284237Sdelphij  *alocation = NULL;
326284237Sdelphij
327284237Sdelphij  return PPCBOOT_SYMS;
328284237Sdelphij}
329284237Sdelphij
330284237Sdelphij
331284237Sdelphij/* Make an empty symbol.  */
332284237Sdelphij
333284237Sdelphijstatic asymbol *
334284237Sdelphijppcboot_make_empty_symbol (abfd)
335284237Sdelphij     bfd *abfd;
336226048Sobrien{
337226048Sobrien  return (asymbol *) bfd_alloc (abfd, sizeof (asymbol));
338226048Sobrien}
339226048Sobrien
340226048Sobrien
341226048Sobrien#define ppcboot_print_symbol _bfd_nosymbols_print_symbol
342226048Sobrien
343226048Sobrien/* Get information about a symbol.  */
344226048Sobrien
345159764Sobrienstatic void
346103373Sobrienppcboot_get_symbol_info (ignore_abfd, symbol, ret)
347186690Sobrien     bfd *ignore_abfd ATTRIBUTE_UNUSED;
348103373Sobrien     asymbol *symbol;
349110949Sobrien     symbol_info *ret;
350110949Sobrien{
351103373Sobrien  bfd_symbol_info (symbol, ret);
352103373Sobrien}
353103373Sobrien
354103373Sobrien#define ppcboot_bfd_is_local_label_name bfd_generic_is_local_label_name
355110949Sobrien#define ppcboot_get_lineno _bfd_nosymbols_get_lineno
356110949Sobrien#define ppcboot_find_nearest_line _bfd_nosymbols_find_nearest_line
357110949Sobrien#define ppcboot_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
358110949Sobrien#define ppcboot_read_minisymbols _bfd_generic_read_minisymbols
359110949Sobrien#define ppcboot_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
360110949Sobrien
361110949Sobrien#define ppcboot_get_reloc_upper_bound \
362110949Sobrien  ((long (*) PARAMS ((bfd *, asection *))) bfd_0l)
363110949Sobrien#define ppcboot_canonicalize_reloc \
364110949Sobrien  ((long (*) PARAMS ((bfd *, asection *, arelent **, asymbol **))) bfd_0l)
365110949Sobrien#define ppcboot_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
366110949Sobrien
367110949Sobrien/* Write section contents of a ppcboot file.  */
368110949Sobrien
369110949Sobrienstatic boolean
370110949Sobrienppcboot_set_section_contents (abfd, sec, data, offset, size)
371110949Sobrien     bfd *abfd;
372110949Sobrien     asection *sec;
373110949Sobrien     PTR data;
374110949Sobrien     file_ptr offset;
375110949Sobrien     bfd_size_type size;
376110949Sobrien{
377110949Sobrien  if (! abfd->output_has_begun)
378110949Sobrien    {
379110949Sobrien      bfd_vma low;
380110949Sobrien      asection *s;
381110949Sobrien
382110949Sobrien      /* The lowest section VMA sets the virtual address of the start
383110949Sobrien         of the file.  We use the set the file position of all the
384110949Sobrien         sections.  */
385110949Sobrien      low = abfd->sections->vma;
386110949Sobrien      for (s = abfd->sections->next; s != NULL; s = s->next)
387110949Sobrien	if (s->vma < low)
388110949Sobrien	  low = s->vma;
389110949Sobrien
390110949Sobrien      for (s = abfd->sections; s != NULL; s = s->next)
391110949Sobrien	s->filepos = s->vma - low;
392110949Sobrien
393110949Sobrien      abfd->output_has_begun = true;
394110949Sobrien    }
395110949Sobrien
396110949Sobrien  return _bfd_generic_set_section_contents (abfd, sec, data, offset, size);
397110949Sobrien}
398110949Sobrien
399110949Sobrien
400110949Sobrienstatic int
401354939Sdelphijppcboot_sizeof_headers (abfd, exec)
402354939Sdelphij     bfd *abfd ATTRIBUTE_UNUSED;
403110949Sobrien     boolean exec ATTRIBUTE_UNUSED;
404110949Sobrien{
405110949Sobrien  return sizeof (ppcboot_hdr_t);
406354939Sdelphij}
407354939Sdelphij
408354939Sdelphij
409354939Sdelphij/* Print out the program headers.  */
410110949Sobrien
411110949Sobrienstatic boolean
412110949Sobrienppcboot_bfd_print_private_bfd_data (abfd, farg)
413110949Sobrien     bfd *abfd;
414110949Sobrien     PTR farg;
415110949Sobrien{
416110949Sobrien  FILE *f = (FILE *)farg;
417110949Sobrien  ppcboot_data_t *tdata = ppcboot_get_tdata (abfd);
418110949Sobrien  long entry_offset = bfd_getl_signed_32 ((PTR) tdata->header.entry_offset);
419110949Sobrien  long length = bfd_getl_signed_32 ((PTR) tdata->header.length);
420110949Sobrien  int i;
421110949Sobrien
422110949Sobrien  fprintf (f, _("\nppcboot header:\n"));
423110949Sobrien  fprintf (f, _("Entry offset        = 0x%.8lx (%ld)\n"), entry_offset, entry_offset);
424110949Sobrien  fprintf (f, _("Length              = 0x%.8lx (%ld)\n"), length, length);
425110949Sobrien
426110949Sobrien  if (tdata->header.flags)
427110949Sobrien    fprintf (f, _("Flag field          = 0x%.2x\n"), tdata->header.flags);
428133359Sobrien
429133359Sobrien  if (tdata->header.os_id)
430133359Sobrien    fprintf (f, "OS_ID               = 0x%.2x\n", tdata->header.os_id);
431133359Sobrien
432133359Sobrien  if (tdata->header.partition_name)
433133359Sobrien    fprintf (f, _("Partition name      = \"%s\"\n"), tdata->header.partition_name);
434133359Sobrien
435133359Sobrien  for (i = 0; i < 4; i++)
436133359Sobrien    {
437133359Sobrien      long sector_begin  = bfd_getl_signed_32 ((PTR) tdata->header.partition[i].sector_begin);
438133359Sobrien      long sector_length = bfd_getl_signed_32 ((PTR) tdata->header.partition[i].sector_length);
439133359Sobrien
440133359Sobrien      /* Skip all 0 entries */
441133359Sobrien      if (!tdata->header.partition[i].partition_begin.ind
442133359Sobrien	  && !tdata->header.partition[i].partition_begin.head
443133359Sobrien	  && !tdata->header.partition[i].partition_begin.sector
444133359Sobrien	  && !tdata->header.partition[i].partition_begin.cylinder
445133359Sobrien	  && !tdata->header.partition[i].partition_end.ind
446133359Sobrien	  && !tdata->header.partition[i].partition_end.head
447133359Sobrien	  && !tdata->header.partition[i].partition_end.sector
448133359Sobrien	  && !tdata->header.partition[i].partition_end.cylinder
449133359Sobrien	  && !sector_begin && !sector_length)
450133359Sobrien	continue;
451110949Sobrien
452110949Sobrien      fprintf (f, _("\nPartition[%d] start  = { 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x }\n"), i,
453110949Sobrien	       tdata->header.partition[i].partition_begin.ind,
454110949Sobrien	       tdata->header.partition[i].partition_begin.head,
455110949Sobrien	       tdata->header.partition[i].partition_begin.sector,
456110949Sobrien	       tdata->header.partition[i].partition_begin.cylinder);
457110949Sobrien
458110949Sobrien      fprintf (f, _("Partition[%d] end    = { 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x }\n"), i,
459110949Sobrien	       tdata->header.partition[i].partition_end.ind,
460110949Sobrien	       tdata->header.partition[i].partition_end.head,
461133359Sobrien	       tdata->header.partition[i].partition_end.sector,
462133359Sobrien	       tdata->header.partition[i].partition_end.cylinder);
463133359Sobrien
464337827Seadler      fprintf (f, _("Partition[%d] sector = 0x%.8lx (%ld)\n"), i, sector_begin, sector_begin);
465133359Sobrien      fprintf (f, _("Partition[%d] length = 0x%.8lx (%ld)\n"), i, sector_length, sector_length);
466133359Sobrien    }
467133359Sobrien
468133359Sobrien  fprintf (f, "\n");
469133359Sobrien  return true;
470133359Sobrien}
471133359Sobrien
472133359Sobrien
473133359Sobrien#define ppcboot_bfd_get_relocated_section_contents \
474133359Sobrien  bfd_generic_get_relocated_section_contents
475133359Sobrien#define ppcboot_bfd_relax_section bfd_generic_relax_section
476133359Sobrien#define ppcboot_bfd_gc_sections bfd_generic_gc_sections
477133359Sobrien#define ppcboot_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
478133359Sobrien#define ppcboot_bfd_link_add_symbols _bfd_generic_link_add_symbols
479133359Sobrien#define ppcboot_bfd_final_link _bfd_generic_final_link
480133359Sobrien#define ppcboot_bfd_link_split_section _bfd_generic_link_split_section
481133359Sobrien#define ppcboot_get_section_contents_in_window \
482337827Seadler  _bfd_generic_get_section_contents_in_window
483337827Seadler
484337827Seadler#define ppcboot_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
485337827Seadler#define ppcboot_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
486337827Seadler#define ppcboot_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
487337827Seadler#define ppcboot_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
488337827Seadler#define ppcboot_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
489337827Seadler#define ppcboot_bfd_print_private_bfd_dat ppcboot_bfd_print_private_bfd_data
490337827Seadler
491337827Seadlerconst bfd_target ppcboot_vec =
492337827Seadler{
493337827Seadler  "ppcboot",			/* name */
494337827Seadler  bfd_target_unknown_flavour,	/* flavour */
495337827Seadler  BFD_ENDIAN_BIG,		/* byteorder is big endian for code */
496337827Seadler  BFD_ENDIAN_LITTLE,		/* header_byteorder */
497337827Seadler  EXEC_P,			/* object_flags */
498337827Seadler  (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_DATA
499337827Seadler   | SEC_ROM | SEC_HAS_CONTENTS), /* section_flags */
500337827Seadler  0,				/* symbol_leading_char */
501133359Sobrien  ' ',				/* ar_pad_char */
502133359Sobrien  16,				/* ar_max_namelen */
503133359Sobrien  bfd_getb64, bfd_getb_signed_64, bfd_putb64,
504133359Sobrien  bfd_getb32, bfd_getb_signed_32, bfd_putb32,
505110949Sobrien  bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* data */
506133359Sobrien  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
507133359Sobrien  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
508133359Sobrien  bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* hdrs */
509133359Sobrien  {				/* bfd_check_format */
510133359Sobrien    _bfd_dummy_target,
511133359Sobrien    ppcboot_object_p,		/* bfd_check_format */
512133359Sobrien    _bfd_dummy_target,
513133359Sobrien    _bfd_dummy_target,
514133359Sobrien  },
515133359Sobrien  {				/* bfd_set_format */
516133359Sobrien    bfd_false,
517133359Sobrien    ppcboot_mkobject,
518133359Sobrien    bfd_false,
519133359Sobrien    bfd_false,
520133359Sobrien  },
521133359Sobrien  {				/* bfd_write_contents */
522139368Sobrien    bfd_false,
523159764Sobrien    bfd_true,
524139368Sobrien    bfd_false,
525159764Sobrien    bfd_false,
526159764Sobrien  },
527234250Sobrien
528159764Sobrien  BFD_JUMP_TABLE_GENERIC (ppcboot),
529159764Sobrien  BFD_JUMP_TABLE_COPY (ppcboot),
530159764Sobrien  BFD_JUMP_TABLE_CORE (_bfd_nocore),
531159764Sobrien  BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
532159764Sobrien  BFD_JUMP_TABLE_SYMBOLS (ppcboot),
533159764Sobrien  BFD_JUMP_TABLE_RELOCS (ppcboot),
534159764Sobrien  BFD_JUMP_TABLE_WRITE (ppcboot),
535159764Sobrien  BFD_JUMP_TABLE_LINK (ppcboot),
536159764Sobrien  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
537159764Sobrien
538159764Sobrien  NULL,
539159764Sobrien
540159764Sobrien  NULL
541159764Sobrien};
542159764Sobrien