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