diff options
Diffstat (limited to 'src/base/loader')
-rwxr-xr-x | src/base/loader/hex_file.cc | 161 | ||||
-rwxr-xr-x | src/base/loader/hex_file.cc~ | 162 | ||||
-rwxr-xr-x | src/base/loader/hex_file.hh | 77 | ||||
-rw-r--r-- | src/base/loader/object_file.cc | 1 |
4 files changed, 401 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..1855ebe0c --- /dev/null +++ b/src/base/loader/hex_file.cc @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2007 MIPS Technologies, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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) + { + panic("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); +} 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); +} diff --git a/src/base/loader/hex_file.hh b/src/base/loader/hex_file.hh new file mode 100755 index 000000000..1dbfd034f --- /dev/null +++ b/src/base/loader/hex_file.hh @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2002-2004 The Regents of The University of Michigan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Jaidev Patwardhan + */ + +#ifndef __HEX_FILE_HH__ +#define __HEX_FILE_HH__ + +#include <limits> +#include <string> + +#include "sim/host.hh" // for Addr +#include <fstream> + +class Port; + +class HexFile +{ + public: + + + protected: + const std::string filename; + FILE *fp; + + public: + virtual ~HexFile(); + HexFile(const std::string _filename); + + void close(); + + bool loadSections(Port *memPort, Addr addrMask = + std::numeric_limits<Addr>::max()); + + protected: + + typedef struct { + Addr MemAddr; + uint32_t Data; + } HexLine; + + Addr entry; + Addr globalPtr; + + public: + void parseLine(char *,Addr *,uint32_t *); + Addr entryPoint() const { return entry; } + Addr globalPointer() const { return globalPtr; } + +}; + +#endif // __HEX_FILE_HH__ diff --git a/src/base/loader/object_file.cc b/src/base/loader/object_file.cc index 2273b6c4e..828a9a635 100644 --- a/src/base/loader/object_file.cc +++ b/src/base/loader/object_file.cc @@ -71,6 +71,7 @@ ObjectFile::loadSection(Section *sec, Port *memPort, Addr addrMask) { if (sec->size != 0) { Addr addr = sec->baseAddr & addrMask; + warn("attempting load @ section addr: %#x", addr); if (sec->fileImage) { memPort->writeBlob(addr, sec->fileImage, sec->size); } |