* Authors: Jaidev Patwardhan
*/
+#include <cctype>
+#include <cstdio>
#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.
+/*
+ * 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());
- }
-
+ 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)
+HexFile::loadSections(Port *memPort)
{
- 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));
+ char Line[64];
+ Addr MemAddr;
+ uint32_t Data;
+ while (!feof(fp)) {
+ fgets(Line, 64, fp);
+ parseLine(Line, &MemAddr, &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')
- {
+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 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;
}
- 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++;
+ Number <<= 4;
+ Number += Digit;
+ i++;
}
- if(Flag != true)
- {
- *A = 0;
- *D = 0;
- }
- else
- *D = Number;
+ if (Flag != true) {
+ *A = 0;
+ *D = 0;
+ } else {
+ *D = Number;
+ }
}
-
-
void
HexFile::close()
{
- fclose(fp);
+ fclose(fp);
}
* Authors: Jaidev Patwardhan
*/
-#ifndef __HEX_FILE_HH__
-#define __HEX_FILE_HH__
+#ifndef __BASE_LOADER_HEX_FILE_HH__
+#define __BASE_LOADER_HEX_FILE_HH__
+#include <cstdio>
#include <limits>
#include <string>
#include "sim/host.hh" // for Addr
-#include <fstream>
class Port;
class HexFile
{
- public:
-
-
protected:
const std::string filename;
FILE *fp;
+ void parseLine(char *, Addr *, uint32_t *);
+
public:
- virtual ~HexFile();
HexFile(const std::string _filename);
+ virtual ~HexFile();
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; }
-
+ bool loadSections(Port *memPort);
};
-#endif // __HEX_FILE_HH__
+#endif // __BASE_LOADER_HEX_FILE_HH__