Loader: Use address mask provided to load*Symbols when loading the symbols from the...
[gem5.git] / src / base / loader / hex_file.cc
index 1855ebe0c6211e1e64b3f4bfead3a0a7e8368b70..61d6c80096da2515ae242140aa458ad123b6fc45 100755 (executable)
  * 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)) {
+        char *ret = fgets(Line, sizeof(Line), fp);
+        if (!ret)
+            panic("malformed file");
+        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);
 }