summaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
Diffstat (limited to 'base')
-rw-r--r--base/loader/elf_object.cc43
-rw-r--r--base/loader/elf_object.hh2
-rw-r--r--base/loader/object_file.hh4
-rw-r--r--base/traceflags.py1
4 files changed, 45 insertions, 5 deletions
diff --git a/base/loader/elf_object.cc b/base/loader/elf_object.cc
index 2925817cd..b9636b454 100644
--- a/base/loader/elf_object.cc
+++ b/base/loader/elf_object.cc
@@ -92,7 +92,7 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data)
arch = ObjectFile::SPARC;
} else if (ehdr.e_machine == EM_MIPS
&& ehdr.e_ident[EI_CLASS] == ELFCLASS32) {
- arch = ObjectFile::MIPS;
+ arch = ObjectFile::Mips;
} else if (ehdr.e_ident[EI_CLASS] == ELFCLASS64) {
arch = ObjectFile::Alpha;
} else {
@@ -156,14 +156,49 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data)
section = elf_getscn(elf, ++secIdx);
} // while sections
}
+
+ int32_t global_ptr;
+ if (arch == ObjectFile::Mips) {
+ Elf_Scn *section;
+ GElf_Shdr shdr;
+ Elf_Data *rdata;
+ int secIdx = 1;
+
+ // Get the first section
+ section = elf_getscn(elf, secIdx);
+
+ // While there are no more sections
+ while (section != NULL) {
+ gelf_getshdr(section, &shdr);
+ /*shdr.sh_type == SHT_MIPS_REGINFO && */
+ if (!strcmp(".reginfo",elf_strptr(elf, ehdr.e_shstrndx, shdr.sh_name))) {
+ // We have found MIPS reginfo section:
+ // -------------------------------
+ // Check the 6th 32bit word for the initialized global pointer value
+ // -------------------------------
+ rdata = elf_rawdata(section, NULL);
+ assert(rdata->d_buf);
+
+ if(ehdr.e_ident[EI_DATA] == ELFDATA2LSB)
+ global_ptr = htole(((int32_t*)rdata->d_buf)[5]);
+ else
+ global_ptr = htobe(((int32_t*)rdata->d_buf)[5]);
+ break;
+ }
+
+ section = elf_getscn(elf, ++secIdx);
+ } // if section found
+
+ }
+
elf_end(elf);
- return new ElfObject(fname, fd, len, data, arch, opSys);
+ return new ElfObject(fname, fd, len, data, global_ptr,arch, opSys);
}
}
ElfObject::ElfObject(const string &_filename, int _fd,
- size_t _len, uint8_t *_data,
+ size_t _len, uint8_t *_data,Addr global_ptr,
Arch _arch, OpSys _opSys)
: ObjectFile(_filename, _fd, _len, _data, _arch, _opSys)
@@ -187,6 +222,8 @@ ElfObject::ElfObject(const string &_filename, int _fd,
entry = ehdr.e_entry;
+ globalPtr = global_ptr;
+
// initialize segment sizes to 0 in case they're not present
text.size = data.size = bss.size = 0;
diff --git a/base/loader/elf_object.hh b/base/loader/elf_object.hh
index 72c265edd..d1fd32fd0 100644
--- a/base/loader/elf_object.hh
+++ b/base/loader/elf_object.hh
@@ -39,7 +39,7 @@ class ElfObject : public ObjectFile
bool loadSomeSymbols(SymbolTable *symtab, int binding);
ElfObject(const std::string &_filename, int _fd,
- size_t _len, uint8_t *_data,
+ size_t _len, uint8_t *_data,Addr global_ptr,
Arch _arch, OpSys _opSys);
public:
diff --git a/base/loader/object_file.hh b/base/loader/object_file.hh
index 08a51863e..309089728 100644
--- a/base/loader/object_file.hh
+++ b/base/loader/object_file.hh
@@ -44,7 +44,7 @@ class ObjectFile
UnknownArch,
Alpha,
SPARC,
- MIPS
+ Mips
};
enum OpSys {
@@ -95,9 +95,11 @@ class ObjectFile
Section bss;
bool loadSection(Section *sec, TranslatingPort *memPort, bool loadPhys);
+ void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; }
public:
Addr entryPoint() const { return entry; }
+
Addr globalPointer() const { return globalPtr; }
Addr textBase() const { return text.baseAddr; }
diff --git a/base/traceflags.py b/base/traceflags.py
index e814a00fb..c3b878027 100644
--- a/base/traceflags.py
+++ b/base/traceflags.py
@@ -142,6 +142,7 @@ baseFlags = [
'OoOCPU',
'HWPrefetch',
'Stack',
+ 'SimpleCPU',
]
#