summaryrefslogtreecommitdiffstats
path: root/main/common/tfsloader.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/common/tfsloader.c')
-rw-r--r--main/common/tfsloader.c760
1 files changed, 400 insertions, 360 deletions
diff --git a/main/common/tfsloader.c b/main/common/tfsloader.c
index 1b3d8ac..ae1feb6 100644
--- a/main/common/tfsloader.c
+++ b/main/common/tfsloader.c
@@ -1,7 +1,7 @@
/**************************************************************************
*
* Copyright (c) 2013 Alcatel-Lucent
- *
+ *
* Alcatel Lucent licenses this file to You under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. A copy of the License is contained the
@@ -23,7 +23,7 @@
* This file contains the code that is specific to each of the file types
* supported by TFS as the binary executable type.
* Currently, COFF, ELF, A.OUT and MSBIN are supported. This requires that
- * TFS_EBIN_COFF, TFS_EBIN_ELF, TFS_EBIN_AOUT or TFS_EBIN_MSBIN
+ * TFS_EBIN_COFF, TFS_EBIN_ELF, TFS_EBIN_AOUT or TFS_EBIN_MSBIN
* respectively, be set in the monitor's config.h file. Also, defining
* TFS_EBIN_ELFMSBIN will allow TFS to support both ELF and MSBIN.
*
@@ -61,298 +61,327 @@ extern int tfsld_memcpy(char *to,char *from,int count,int verbose,int verify);
int
tfsld_memcpy(char *to, char *from, int count, int verbose, int verify)
{
- int rc;
+ int rc;
- if (verbose <= 1) {
- if (inUmonBssSpace(to,to+count-1))
- return(-1);
- }
+ if(verbose <= 1) {
+ if(inUmonBssSpace(to,to+count-1)) {
+ return(-1);
+ }
+ }
- rc = s_memcpy(to,from,count,verbose,verify);
+ rc = s_memcpy(to,from,count,verbose,verify);
- if (verbose <= 1) {
- flushDcache(to,count);
- invalidateIcache(to,count);
- }
+ if(verbose <= 1) {
+ flushDcache(to,count);
+ invalidateIcache(to,count);
+ }
- return(rc);
+ return(rc);
}
#endif
int
tfsld_memset(uchar *to,uchar val,int count,int verbose,int verifyonly)
{
- int rc;
+ int rc;
- if (verbose <= 1) {
- if (inUmonBssSpace((char *)to, (char *)to+count-1))
- return(-1);
- }
+ if(verbose <= 1) {
+ if(inUmonBssSpace((char *)to, (char *)to+count-1)) {
+ return(-1);
+ }
+ }
- rc = s_memset(to,val,count,verbose,verifyonly);
+ rc = s_memset(to,val,count,verbose,verifyonly);
- if (verbose <= 1) {
- flushDcache((char *)to, count);
- invalidateIcache((char *)to, count);
- }
+ if(verbose <= 1) {
+ flushDcache((char *)to, count);
+ invalidateIcache((char *)to, count);
+ }
- return(rc);
+ return(rc);
}
void
showEntrypoint(unsigned long entrypoint)
{
- printf(" entrypoint: 0x%lx\n",entrypoint);
+ printf(" entrypoint: 0x%lx\n",entrypoint);
}
void
showSection(char *sname)
{
- printf(" %-10s: ",sname);
+ printf(" %-10s: ",sname);
}
#if TFS_EBIN_AOUT
/* tfsloadaout():
- * The file pointed to by fp is assumed to be an AOUT
- * formatted file. This function loads the sections of that file into
- * the designated locations and returns the address of the entry point.
+ * The file pointed to by fp is assumed to be an AOUT
+ * formatted file. This function loads the sections of that file into
+ * the designated locations and returns the address of the entry point.
*/
int
tfsloadaout(TFILE *fp,int verbose,long *entrypoint,char *sname,int verifyonly)
{
- uchar *tfrom, *dfrom;
- struct exec *ehdr;
-
- if (tfsTrace)
- printf("tfsloadaout(%s)\n",TFS_NAME(fp));
-
- /* Establish file header pointer... */
- ehdr = (struct exec *)(tfsBase(fp));
-
- /* Return error if relocatable... */
- if ((ehdr->a_trsize) || (ehdr->a_drsize))
- return(TFSERR_BADHDR);
-
- /* Establish locations from which text and data are to be */
- /* copied from ... */
- tfrom = (uchar *)(ehdr+1);
- dfrom = tfrom+ehdr->a_text;
-
- /* Copy/verify text and data sections to RAM: */
- if (verbose)
- showSection("text");
-
- if (tfsld_memcpy((char *)(ehdr->a_entry),(char *)tfrom,
- ehdr->a_text,verbose,verifyonly) != 0)
- return(TFSERR_MEMFAIL);
-
- if (verbose)
- showSection("data");
-
- if (tfsld_memcpy((char *)(ehdr->a_entry+ehdr->a_text),(char *)dfrom,
- ehdr->a_data,verbose,verifyonly) != 0)
- return(TFSERR_MEMFAIL);
-
- /* Clear out bss space: */
- if (verbose)
- showSection("bss");
-
- if (tfsld_memset((char *)(ehdr->a_entry+ehdr->a_text+ehdr->a_data),
- 0,ehdr->a_bss,verbose,verifyonly) != 0)
- return(TFSERR_MEMFAIL);
-
-
- if (verbose & !verifyonly)
- showEntrypoint(ehdr->a_entry);
-
- /* Store entry point: */
- if (entrypoint)
- *entrypoint = (long)(ehdr->a_entry);
-
- return(TFS_OKAY);
+ uchar *tfrom, *dfrom;
+ struct exec *ehdr;
+
+ if(tfsTrace) {
+ printf("tfsloadaout(%s)\n",TFS_NAME(fp));
+ }
+
+ /* Establish file header pointer... */
+ ehdr = (struct exec *)(tfsBase(fp));
+
+ /* Return error if relocatable... */
+ if((ehdr->a_trsize) || (ehdr->a_drsize)) {
+ return(TFSERR_BADHDR);
+ }
+
+ /* Establish locations from which text and data are to be */
+ /* copied from ... */
+ tfrom = (uchar *)(ehdr+1);
+ dfrom = tfrom+ehdr->a_text;
+
+ /* Copy/verify text and data sections to RAM: */
+ if(verbose) {
+ showSection("text");
+ }
+
+ if(tfsld_memcpy((char *)(ehdr->a_entry),(char *)tfrom,
+ ehdr->a_text,verbose,verifyonly) != 0) {
+ return(TFSERR_MEMFAIL);
+ }
+
+ if(verbose) {
+ showSection("data");
+ }
+
+ if(tfsld_memcpy((char *)(ehdr->a_entry+ehdr->a_text),(char *)dfrom,
+ ehdr->a_data,verbose,verifyonly) != 0) {
+ return(TFSERR_MEMFAIL);
+ }
+
+ /* Clear out bss space: */
+ if(verbose) {
+ showSection("bss");
+ }
+
+ if(tfsld_memset((char *)(ehdr->a_entry+ehdr->a_text+ehdr->a_data),
+ 0,ehdr->a_bss,verbose,verifyonly) != 0) {
+ return(TFSERR_MEMFAIL);
+ }
+
+
+ if(verbose & !verifyonly) {
+ showEntrypoint(ehdr->a_entry);
+ }
+
+ /* Store entry point: */
+ if(entrypoint) {
+ *entrypoint = (long)(ehdr->a_entry);
+ }
+
+ return(TFS_OKAY);
}
#endif
#if TFS_EBIN_COFF
/* tfsloadcoff():
- * The file pointed to by fp is assumed to be a COFF file.
- * This function loads the sections of that file into the designated
- * locations.
+ * The file pointed to by fp is assumed to be a COFF file.
+ * This function loads the sections of that file into the designated
+ * locations.
*/
int
tfsloadcoff(TFILE *fp,int verbose,long *entrypoint,char *sname,int verifyonly)
{
- int i, err;
- FILHDR *fhdr;
- AOUTHDR *ahdr;
- SCNHDR *shdr;
-
- if (tfsTrace)
- printf("tfsloadcoff(%s)\n",TFS_NAME(fp));
-
- /* Establish file header pointers... */
- fhdr = (FILHDR *)(tfsBase(fp));
- if ((fhdr->f_opthdr == 0) || ((fhdr->f_flags & F_EXEC) == 0))
- return(TFSERR_BADHDR);
-
- err = 0;
- ahdr = (AOUTHDR *)(fhdr+1);
- shdr = (SCNHDR *)((uchar *)ahdr + fhdr->f_opthdr);
-
- /* For each section header, relocate or clear if necessary... */
- for (i=0;!err && i<fhdr->f_nscns;i++) {
- if (shdr->s_size == 0) {
- shdr++;
- continue;
- }
-
- /* If incoming section name is specified, then we only load the
- * section with that name...
- */
- if ((sname != 0) && (strcmp(sname,shdr->s_name) != 0))
- continue;
-
- if (verbose)
- showSection(shdr->s_name);
-
- if (ISLOADABLE(shdr->s_flags)) {
- if (tfsld_memcpy((char *)(shdr->s_paddr),
- (char *)(shdr->s_scnptr+(int)fhdr),
- shdr->s_size,verbose,verifyonly) != 0)
- err++;
- }
- else if (ISBSS(shdr->s_flags)) {
- if (tfsld_memset((char *)(shdr->s_paddr),0,shdr->s_size,
- verbose,verifyonly) != 0)
- err++;
- }
- else if (verbose)
- printf("???\n");
- shdr++;
- }
-
- if (verbose && !verifyonly && !sname)
- showEntrypoint(ahdr->entry);
-
- if (err)
- return(TFSERR_MEMFAIL);
-
- /* Store entry point: */
- if (entrypoint)
- *entrypoint = (long)(ahdr->entry);
-
- return(TFS_OKAY);
+ int i, err;
+ FILHDR *fhdr;
+ AOUTHDR *ahdr;
+ SCNHDR *shdr;
+
+ if(tfsTrace) {
+ printf("tfsloadcoff(%s)\n",TFS_NAME(fp));
+ }
+
+ /* Establish file header pointers... */
+ fhdr = (FILHDR *)(tfsBase(fp));
+ if((fhdr->f_opthdr == 0) || ((fhdr->f_flags & F_EXEC) == 0)) {
+ return(TFSERR_BADHDR);
+ }
+
+ err = 0;
+ ahdr = (AOUTHDR *)(fhdr+1);
+ shdr = (SCNHDR *)((uchar *)ahdr + fhdr->f_opthdr);
+
+ /* For each section header, relocate or clear if necessary... */
+ for(i=0; !err && i<fhdr->f_nscns; i++) {
+ if(shdr->s_size == 0) {
+ shdr++;
+ continue;
+ }
+
+ /* If incoming section name is specified, then we only load the
+ * section with that name...
+ */
+ if((sname != 0) && (strcmp(sname,shdr->s_name) != 0)) {
+ continue;
+ }
+
+ if(verbose) {
+ showSection(shdr->s_name);
+ }
+
+ if(ISLOADABLE(shdr->s_flags)) {
+ if(tfsld_memcpy((char *)(shdr->s_paddr),
+ (char *)(shdr->s_scnptr+(int)fhdr),
+ shdr->s_size,verbose,verifyonly) != 0) {
+ err++;
+ }
+ } else if(ISBSS(shdr->s_flags)) {
+ if(tfsld_memset((char *)(shdr->s_paddr),0,shdr->s_size,
+ verbose,verifyonly) != 0) {
+ err++;
+ }
+ } else if(verbose) {
+ printf("???\n");
+ }
+ shdr++;
+ }
+
+ if(verbose && !verifyonly && !sname) {
+ showEntrypoint(ahdr->entry);
+ }
+
+ if(err) {
+ return(TFSERR_MEMFAIL);
+ }
+
+ /* Store entry point: */
+ if(entrypoint) {
+ *entrypoint = (long)(ahdr->entry);
+ }
+
+ return(TFS_OKAY);
}
#endif
#if TFS_EBIN_ELF | TFS_EBIN_ELFMSBIN
/* tfsloadelf():
- * The file pointed to by fp is assumed to be an ELF file.
- * This function loads the sections of that file into the designated
- * locations.
+ * The file pointed to by fp is assumed to be an ELF file.
+ * This function loads the sections of that file into the designated
+ * locations.
*/
int
tfsloadelf(TFILE *fp,int verbose,long *entrypoint,char *sname,int verifyonly)
{
- Elf32_Word size, notproctot;
- int i, j, err;
- char *shname_strings, *name;
- Elf32_Addr sh_addr;
- ELFFHDR *ehdr;
- ELFSHDR *shdr;
- ELFPHDR *phdr;
-
- if (tfsTrace)
- printf("tfsloadelf(%s)\n",TFS_NAME(fp));
-
- /* Establish file header pointers... */
- /* If the first reserved entry isn't 0xffffffff, then assume this is a
- * 'fake' header, and it contains the base address of the file data...
- * See tfsld() for more info.
- */
- ehdr = (ELFFHDR *)(tfsBase(fp));
- shdr = (ELFSHDR *)((int)ehdr + ehdr->e_shoff);
- err = 0;
-
- /* Verify basic file sanity... */
- if ((ehdr->e_ident[0] != 0x7f) || (ehdr->e_ident[1] != 'E') ||
- (ehdr->e_ident[2] != 'L') || (ehdr->e_ident[3] != 'F'))
- return(TFSERR_BADHDR);
-
- /* Store the section name string table base: */
- shname_strings = (char *)ehdr + shdr[ehdr->e_shstrndx].sh_offset;
- notproctot = 0;
-
- /* For each section header, relocate or clear if necessary... */
- for (i=0;!err && i<ehdr->e_shnum;i++,shdr++) {
- if ((size = shdr->sh_size) == 0)
- continue;
-
- name = shname_strings + shdr->sh_name;
-
- /* If incoming section name is specified, then we only load the
- * section with that name...
- */
- if ((sname != 0) && (strcmp(sname,name) != 0))
- continue;
-
- if ((verbose) && (ehdr->e_shstrndx != SHN_UNDEF))
- showSection(shname_strings + shdr->sh_name);
-
- if (!(shdr->sh_flags & SHF_ALLOC)) {
- notproctot += size;
- if (verbose)
- printf(" %7ld bytes not processed (tot=%ld)\n",
- size,notproctot);
- continue;
- }
-
- sh_addr = shdr->sh_addr;
-
- /* Look to the program header to see if the destination address
- * of this section needs to be adjusted. If this section is
- * within a program header and that program header's members
- * p_vaddr & p_paddr are not equal, then adjust the section
- * address based on the delta between p_vaddr and p_paddr...
- */
- phdr = (ELFPHDR *)((int)ehdr + ehdr->e_phoff);
- for (j=0;j<ehdr->e_phnum;j++,phdr++) {
- if ((phdr->p_type == PT_LOAD) &&
- (sh_addr >= phdr->p_vaddr) &&
- (sh_addr < phdr->p_vaddr+phdr->p_filesz) &&
- (phdr->p_vaddr != phdr->p_paddr)) {
- sh_addr += (phdr->p_paddr - phdr->p_vaddr);
- break;
- }
- }
-
- if (shdr->sh_type == SHT_NOBITS) {
- if (tfsld_memset((uchar *)(sh_addr),0,size,
- verbose,verifyonly) != 0)
- err++;
- }
- else {
- if (tfsld_memcpy((char *)(sh_addr),
- (char *)((int)ehdr+shdr->sh_offset),
- size,verbose,verifyonly) != 0)
- err++;
- }
- }
-
- if (err)
- return(TFSERR_MEMFAIL);
-
- if (verbose && !verifyonly && !sname)
- showEntrypoint(ehdr->e_entry);
-
- /* Store entry point: */
- if (entrypoint)
- *entrypoint = (long)(ehdr->e_entry);
-
- return(TFS_OKAY);
+ Elf32_Word size, notproctot;
+ int i, j, err;
+ char *shname_strings, *name;
+ Elf32_Addr sh_addr;
+ ELFFHDR *ehdr;
+ ELFSHDR *shdr;
+ ELFPHDR *phdr;
+
+ if(tfsTrace) {
+ printf("tfsloadelf(%s)\n",TFS_NAME(fp));
+ }
+
+ /* Establish file header pointers... */
+ /* If the first reserved entry isn't 0xffffffff, then assume this is a
+ * 'fake' header, and it contains the base address of the file data...
+ * See tfsld() for more info.
+ */
+ ehdr = (ELFFHDR *)(tfsBase(fp));
+ shdr = (ELFSHDR *)((int)ehdr + ehdr->e_shoff);
+ err = 0;
+
+ /* Verify basic file sanity... */
+ if((ehdr->e_ident[0] != 0x7f) || (ehdr->e_ident[1] != 'E') ||
+ (ehdr->e_ident[2] != 'L') || (ehdr->e_ident[3] != 'F')) {
+ return(TFSERR_BADHDR);
+ }
+
+ /* Store the section name string table base: */
+ shname_strings = (char *)ehdr + shdr[ehdr->e_shstrndx].sh_offset;
+ notproctot = 0;
+
+ /* For each section header, relocate or clear if necessary... */
+ for(i=0; !err && i<ehdr->e_shnum; i++,shdr++) {
+ if((size = shdr->sh_size) == 0) {
+ continue;
+ }
+
+ name = shname_strings + shdr->sh_name;
+
+ /* If incoming section name is specified, then we only load the
+ * section with that name...
+ */
+ if((sname != 0) && (strcmp(sname,name) != 0)) {
+ continue;
+ }
+
+ if((verbose) && (ehdr->e_shstrndx != SHN_UNDEF)) {
+ showSection(shname_strings + shdr->sh_name);
+ }
+
+ if(!(shdr->sh_flags & SHF_ALLOC)) {
+ notproctot += size;
+ if(verbose)
+ printf(" %7ld bytes not processed (tot=%ld)\n",
+ size,notproctot);
+ continue;
+ }
+
+ sh_addr = shdr->sh_addr;
+
+ /* Look to the program header to see if the destination address
+ * of this section needs to be adjusted. If this section is
+ * within a program header and that program header's members
+ * p_vaddr & p_paddr are not equal, then adjust the section
+ * address based on the delta between p_vaddr and p_paddr...
+ */
+ phdr = (ELFPHDR *)((int)ehdr + ehdr->e_phoff);
+ for(j=0; j<ehdr->e_phnum; j++,phdr++) {
+ if((phdr->p_type == PT_LOAD) &&
+ (sh_addr >= phdr->p_vaddr) &&
+ (sh_addr < phdr->p_vaddr+phdr->p_filesz) &&
+ (phdr->p_vaddr != phdr->p_paddr)) {
+ sh_addr += (phdr->p_paddr - phdr->p_vaddr);
+ break;
+ }
+ }
+
+ if(shdr->sh_type == SHT_NOBITS) {
+ if(tfsld_memset((uchar *)(sh_addr),0,size,
+ verbose,verifyonly) != 0) {
+ err++;
+ }
+ } else {
+ if(tfsld_memcpy((char *)(sh_addr),
+ (char *)((int)ehdr+shdr->sh_offset),
+ size,verbose,verifyonly) != 0) {
+ err++;
+ }
+ }
+ }
+
+ if(err) {
+ return(TFSERR_MEMFAIL);
+ }
+
+ if(verbose && !verifyonly && !sname) {
+ showEntrypoint(ehdr->e_entry);
+ }
+
+ /* Store entry point: */
+ if(entrypoint) {
+ *entrypoint = (long)(ehdr->e_entry);
+ }
+
+ return(TFS_OKAY);
}
#endif
@@ -367,121 +396,130 @@ tfsloadelf(TFILE *fp,int verbose,long *entrypoint,char *sname,int verifyonly)
* The MSBIN loader supports a few additional options because of the
* fact that WinCE files can be formatted as .bin or .nbo. When
* the file is the ".bin" type, then this loader is used similar to
- * the AOUT, COFF & ELF loaders. When the file is the ".nbo" type,
+ * the AOUT, COFF & ELF loaders. When the file is the ".nbo" type,
* then it is simply loaded into the starting address of the target's
* DRAM and the entrypoint is that base address.
* To support this scheme, TFS uses both the 'c' flag (compressed)
* and the extension on the filename as follows...
- *
+ *
* 1 filename.bin with 'c' flag inactive:
- * Load the file as specified by the sections within the file
- * header.
+ * Load the file as specified by the sections within the file
+ * header.
* 2 filename.bin with 'c' flag active:
- * Load the file as specified by the sections within the file
- * header and assume each section is compressed.
+ * Load the file as specified by the sections within the file
+ * header and assume each section is compressed.
* 3 filename.nbo with 'c' flag inactive:
- * Copy the entire content of the file from TFS flash space to
- * APPRAMBASE and return the address APPRAMBASE as the entrypoint.
+ * Copy the entire content of the file from TFS flash space to
+ * APPRAMBASE and return the address APPRAMBASE as the entrypoint.
* 4 filename.nbo with 'c' flag active:
- * Decompress the entire content of the file from TFS flash space
- * to APPRAMBASE and return the address APPRAMBASE as the entrypoint.
+ * Decompress the entire content of the file from TFS flash space
+ * to APPRAMBASE and return the address APPRAMBASE as the entrypoint.
*
- * In three of the 4 cases above (1,2&3) some level of sanity checking
- * can be done on the file prior to beginning the load. For the 4th
- * case there is no sanity check, this function assumes the file is
- * compressed and is destined for the base of DRAM.
+ * In three of the 4 cases above (1,2&3) some level of sanity checking
+ * can be done on the file prior to beginning the load. For the 4th
+ * case there is no sanity check, this function assumes the file is
+ * compressed and is destined for the base of DRAM.
*/
int
tfsloadmsbin(TFILE *fp,int verbose,long *entrypoint,char *sname,int verifyonly)
{
- ulong offset;
- MSBINFHDR filhdr;
- MSBINSHDR scnhdr;
- char *dot;
- int err, snum;
-
- if (tfsTrace)
- printf("tfsloadmsbin(%s)\n",TFS_NAME(fp));
-
- dot = strrchr(TFS_NAME(fp),'.');
- if (!dot)
- return(TFSERR_BADEXTENSION);
-
- /* Check the filename extension for ".bin" or ".nbo" and process
- * accordingly...
- */
- if (strcmp(dot,".bin") == 0) {
- /* Verify basic file sanity... */
- if (memcmp((char *)tfsBase(fp),MSBIN_SYNC_DATA,MSBIN_SYNC_SIZE) != 0)
- return(TFSERR_BADHDR);
-
- /* The file header is at offset MSBIN_SYNC_SIZE in the
- * file, so copy it from the file to a local structure...
- */
- memcpy((char *)&filhdr,(tfsBase(fp) + MSBIN_SYNC_SIZE),
- sizeof(MSBINFHDR));
-
- /* Start by clearing the entire image space to zero...
- */
- if (verbose)
- printf("MsbinImage: ");
-
- tfsld_memset((uchar *)filhdr.imageaddr,0,(int)filhdr.imagelen,verbose,
- verifyonly);
-
- err = snum = 0;
- offset = (ulong)(tfsBase(fp) + MSBIN_SYNC_SIZE + sizeof(MSBINFHDR));
-
- /* Walk through all sections within the file. For each section,
- * copy the structure out of TFS to local space, then process it.
- */
- for(snum = 1;err==0;snum++) {
- memcpy((char *)&scnhdr,(char *)offset,sizeof(MSBINSHDR));
- offset += sizeof(MSBINSHDR);
-
- /* The image terminates with an image record header with the
- * physical address and checksum set to zero...
- */
- if ((scnhdr.addr == 0) && (scnhdr.csum == 0))
- break;
-
- if (verbose)
- printf("section %02d: ", snum);
-
- if (tfsld_memcpy((char *)(scnhdr.addr),
- (char *)offset,scnhdr.len,verbose,verifyonly) != 0)
- err++;
-
- offset += scnhdr.len;
- }
-
- if (err)
- return(TFSERR_MEMFAIL);
-
- if (verbose && !verifyonly && !sname)
- showEntrypoint(filhdr.imageaddr);
-
- /* Store entry point: */
- if (entrypoint)
- *entrypoint = (long)(filhdr.imageaddr);
- }
- else if (strcmp(dot,".nb0") == 0) {
- char *drambase;
-
- drambase = (char *)getAppRamStart();
-
- tfsld_memcpy(drambase,(char *)tfsBase(fp),(int)TFS_SIZE(fp),
- verbose,verifyonly);
-
- /* Store entry point: */
- if (entrypoint)
- *entrypoint = (long)(drambase);
- }
- else {
- return(TFSERR_BADEXTENSION);
- }
-
- return(TFS_OKAY);
+ ulong offset;
+ MSBINFHDR filhdr;
+ MSBINSHDR scnhdr;
+ char *dot;
+ int err, snum;
+
+ if(tfsTrace) {
+ printf("tfsloadmsbin(%s)\n",TFS_NAME(fp));
+ }
+
+ dot = strrchr(TFS_NAME(fp),'.');
+ if(!dot) {
+ return(TFSERR_BADEXTENSION);
+ }
+
+ /* Check the filename extension for ".bin" or ".nbo" and process
+ * accordingly...
+ */
+ if(strcmp(dot,".bin") == 0) {
+ /* Verify basic file sanity... */
+ if(memcmp((char *)tfsBase(fp),MSBIN_SYNC_DATA,MSBIN_SYNC_SIZE) != 0) {
+ return(TFSERR_BADHDR);
+ }
+
+ /* The file header is at offset MSBIN_SYNC_SIZE in the
+ * file, so copy it from the file to a local structure...
+ */
+ memcpy((char *)&filhdr,(tfsBase(fp) + MSBIN_SYNC_SIZE),
+ sizeof(MSBINFHDR));
+
+ /* Start by clearing the entire image space to zero...
+ */
+ if(verbose) {
+ printf("MsbinImage: ");
+ }
+
+ tfsld_memset((uchar *)filhdr.imageaddr,0,(int)filhdr.imagelen,verbose,
+ verifyonly);
+
+ err = snum = 0;
+ offset = (ulong)(tfsBase(fp) + MSBIN_SYNC_SIZE + sizeof(MSBINFHDR));
+
+ /* Walk through all sections within the file. For each section,
+ * copy the structure out of TFS to local space, then process it.
+ */
+ for(snum = 1; err==0; snum++) {
+ memcpy((char *)&scnhdr,(char *)offset,sizeof(MSBINSHDR));
+ offset += sizeof(MSBINSHDR);
+
+ /* The image terminates with an image record header with the
+ * physical address and checksum set to zero...
+ */
+ if((scnhdr.addr == 0) && (scnhdr.csum == 0)) {
+ break;
+ }
+
+ if(verbose) {
+ printf("section %02d: ", snum);
+ }
+
+ if(tfsld_memcpy((char *)(scnhdr.addr),
+ (char *)offset,scnhdr.len,verbose,verifyonly) != 0) {
+ err++;
+ }
+
+ offset += scnhdr.len;
+ }
+
+ if(err) {
+ return(TFSERR_MEMFAIL);
+ }
+
+ if(verbose && !verifyonly && !sname) {
+ showEntrypoint(filhdr.imageaddr);
+ }
+
+ /* Store entry point: */
+ if(entrypoint) {
+ *entrypoint = (long)(filhdr.imageaddr);
+ }
+ } else if(strcmp(dot,".nb0") == 0) {
+ char *drambase;
+
+ drambase = (char *)getAppRamStart();
+
+ tfsld_memcpy(drambase,(char *)tfsBase(fp),(int)TFS_SIZE(fp),
+ verbose,verifyonly);
+
+ /* Store entry point: */
+ if(entrypoint) {
+ *entrypoint = (long)(drambase);
+ }
+ } else {
+ return(TFSERR_BADEXTENSION);
+ }
+
+ return(TFS_OKAY);
}
#endif
@@ -490,34 +528,36 @@ int
tfsloadebin(TFILE *fp,int verbose,long *entrypoint,char *sname,int verifyonly)
{
#if TFS_EBIN_ELFMSBIN
- int err;
+ int err;
#endif
- /* If verbosity is greater than one and verifyonly is not set, then
- * we are simply dumping a map, so start with an appropriate
- * header...
- */
- if ((verbose > 1) && (verifyonly == 0))
- printf("Load map:\n");
+ /* If verbosity is greater than one and verifyonly is not set, then
+ * we are simply dumping a map, so start with an appropriate
+ * header...
+ */
+ if((verbose > 1) && (verifyonly == 0)) {
+ printf("Load map:\n");
+ }
#if TFS_EBIN_AOUT
- return(tfsloadaout(fp,verbose,entrypoint,sname,verifyonly));
+ return(tfsloadaout(fp,verbose,entrypoint,sname,verifyonly));
#elif TFS_EBIN_COFF
- return(tfsloadcoff(fp,verbose,entrypoint,sname,verifyonly));
+ return(tfsloadcoff(fp,verbose,entrypoint,sname,verifyonly));
#elif TFS_EBIN_ELF
- return(tfsloadelf(fp,verbose,entrypoint,sname,verifyonly));
+ return(tfsloadelf(fp,verbose,entrypoint,sname,verifyonly));
#elif TFS_EBIN_MSBIN
- return(tfsloadmsbin(fp,verbose,entrypoint,sname,verifyonly));
+ return(tfsloadmsbin(fp,verbose,entrypoint,sname,verifyonly));
#elif TFS_EBIN_ELFMSBIN
- err = tfsloadelf(fp,verbose,entrypoint,sname,verifyonly);
- if (err == TFSERR_BADHDR)
- return(tfsloadmsbin(fp,verbose,entrypoint,sname,verifyonly));
- else
- return(err);
+ err = tfsloadelf(fp,verbose,entrypoint,sname,verifyonly);
+ if(err == TFSERR_BADHDR) {
+ return(tfsloadmsbin(fp,verbose,entrypoint,sname,verifyonly));
+ } else {
+ return(err);
+ }
#else
#error Invalid TFS_EBIN type.
#endif
}
-#endif /* INCLUDE_TFS */
+#endif /* INCLUDE_TFS */