style: This file hugely violated the M5 style.
Remove a bunch of unused cruft from the interface while we're at it
This commit is contained in:
parent
30bc897613
commit
496d3f2789
2 changed files with 75 additions and 119 deletions
|
@ -28,134 +28,109 @@
|
|||
* 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)
|
||||
|
||||
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++;
|
||||
int i = 0;
|
||||
bool Flag = false;
|
||||
*A = 0;
|
||||
*D = 0;
|
||||
int Digit = 0;
|
||||
unsigned Number = 0;
|
||||
|
||||
/* 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')
|
||||
{
|
||||
/* 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)
|
||||
} 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;
|
||||
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++;
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -28,50 +28,31 @@
|
|||
* 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__
|
||||
|
|
Loading…
Reference in a new issue