diff options
Diffstat (limited to 'src/base/loader/hex_file.cc~')
-rwxr-xr-x | src/base/loader/hex_file.cc~ | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/base/loader/hex_file.cc~ b/src/base/loader/hex_file.cc~ new file mode 100755 index 000000000..54e3b1977 --- /dev/null +++ b/src/base/loader/hex_file.cc~ @@ -0,0 +1,162 @@ + /* + * Copyright (c) 2002, 2003, 2004 + * The Regents of The University of Michigan + * All Rights Reserved + * + * This code is part of the M5 simulator. + * + * Permission is granted to use, copy, create derivative works and + * redistribute this software and such derivative works for any + * purpose, so long as the copyright notice above, this grant of + * permission, and the disclaimer below appear in all copies made; and + * so long as the name of The University of Michigan is not used in + * any advertising or publicity pertaining to the use or distribution + * of this software without specific, written prior authorization. + * + * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE + * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND + * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE + * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, + * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM + * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN + * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGES. + * + * Authors: Jaidev Patwardhan + * + */ + +#include <list> +#include <string> + +#include <sys/types.h> +#include <sys/mman.h> +#include <fcntl.h> +#include <stdio.h> +#include <unistd.h> + +#include "base/cprintf.hh" +#include "base/loader/hex_file.hh" +#include "base/loader/symtab.hh" + + +#include "mem/translating_port.hh" + +using namespace std; +/* Load a Hex File into memory. + Currently only used with MIPS BARE_IRON mode. + A hex file consists of [Address Data] tuples that get directly loaded into + physical memory. The address specified is a word address (i.e., to get the byte address, shift left by 2) + The data is a full 32-bit hex value. +*/ +HexFile::HexFile(const string _filename) + : filename(_filename) +{ + fp = fopen(filename.c_str(),"r"); + if(fp == NULL) + { + fatal("Unable to open %s\n",filename.c_str()); + } + +} + +HexFile::~HexFile() +{ +} + + +bool +HexFile::loadSections(Port *memPort, Addr addrMask) +{ + char Line[64]; + Addr MemAddr; + uint32_t Data; + while(!feof(fp)) + { + fgets(Line,64,fp); + parseLine(Line,&MemAddr,&Data); + // printf("Hex:%u\n",Data); + + if(MemAddr != 0) + { + // Now, write to memory + memPort->writeBlob(MemAddr<<2,(uint8_t *)&Data,sizeof(Data)); + } + } + return true; +} +void HexFile::parseLine(char *Str,Addr *A, uint32_t *D) +{ + int i=0; + bool Flag = false; + *A = 0; + *D = 0; + int Digit = 0; + unsigned Number = 0; + /* Skip white spaces */ + while(Str[i] != '\0' && Str[i]==' ') + i++; + + /* Ok, we're at some character...process things */ + while(Str[i] != '\0') + { + if(Str[i]>='0' && Str[i]<='9') + { + Digit=Str[i]-'0'; + } + else if(Str[i]>='a' && Str[i]<='f') + { + Digit=Str[i]-'a'+10; + } + else if(Str[i]>='A' && Str[i]<='F') + { + Digit=Str[i]-'A'+10; + } + else if(Str[i] == ' ' || Str[i]=='\n') + { + if(Number == 0) + return; + if(Flag == false) + { + *A = Number; + Number = 0; + Flag = true; + } + else + { + *D = Number; + return; + } + } + else + { + // Ok, we've encountered a non-hex character, cannot be a valid line, skip and return 0's + *A = 0; + *D = 0; + return; + } + Number<<=4; + Number+=Digit; + i++; + + } + if(Flag != true) + { + *A = 0; + *D = 0; + } + else + *D = Number; + +} + + + +void +HexFile::close() +{ + fclose(fp); +} |