summaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2006-03-04 03:09:23 -0500
committerGabe Black <gblack@eecs.umich.edu>2006-03-04 03:09:23 -0500
commit7c4c623302dca7da95b1c95d4968f4ef76de391d (patch)
treee7fe108cc927ef7381683ae2e7509ea17d272856 /base
parentdd0d8e628742c824cd5074433dc97ff7ebd92497 (diff)
downloadgem5-7c4c623302dca7da95b1c95d4968f4ef76de391d.tar.xz
Filled out the object file loader so it can load object files for several OSs and architectures.
SConscript: Added ./libelf as an include search directory. There might be a better spot for this than where I put it. arch/SConscript: Combined the linux_process.h and tru64_process.h into process.h. This allows each ISA to support processes from arbitrary OSs. arch/alpha/SConscript: Added process.cc as a source file. It provides an implementation of createProcess, which takes an object_file object and creates the appropriate process object, or dies. base/loader/elf_object.cc: Actually extract the OS and architecture from the elf file, rather than always guessing Alpha and Linux. base/loader/object_file.hh: Added constants for SPARC, MIPS, and Solaris, and changed the include for the Addr type. sim/process.cc: Pushed creation of specific process objects into the ISA specific code. --HG-- extra : convert_revision : b4754e7ca8328672d07e1394c4d162e199606b53
Diffstat (limited to 'base')
-rw-r--r--base/loader/elf_object.cc45
-rw-r--r--base/loader/object_file.hh11
2 files changed, 49 insertions, 7 deletions
diff --git a/base/loader/elf_object.cc b/base/loader/elf_object.cc
index b74d537af..9dd9f9d00 100644
--- a/base/loader/elf_object.cc
+++ b/base/loader/elf_object.cc
@@ -56,6 +56,8 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data)
{
Elf *elf;
GElf_Ehdr ehdr;
+ Arch arch = UnknownArch;
+ OpSys opSys = UnknownOpSys;
// check that header matches library version
if (elf_version(EV_CURRENT) == EV_NONE)
@@ -73,8 +75,8 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data)
return NULL;
}
else {
- if (ehdr.e_ident[EI_CLASS] == ELFCLASS32)
- panic("32 bit ELF Binary, Not Supported");
+// if (ehdr.e_ident[EI_CLASS] == ELFCLASS32)
+// panic("32 bit ELF Binary, Not Supported");
/* @todo this emachine value isn't offical yet.
* so we probably shouldn't check it. */
// if (ehdr.e_machine != EM_ALPHA)
@@ -82,8 +84,43 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data)
elf_end(elf);
- return new ElfObject(fname, fd, len, data,
- ObjectFile::Alpha, ObjectFile::Linux);
+ //Detect the architecture
+ //Versioning issues in libelf need to be resolved to get the correct
+ //SPARC constants.
+ //If MIPS supports 32 bit executables, this may need to be changed.
+ //Also, there are other MIPS constants which may be used, like
+ //EM_MIPS_RS3_LE and EM_MIPS_X
+ //Since we don't know how to check for alpha right now, we'll
+ //just assume if it wasn't something else and it's 64 bit, that's
+ //what it must be.
+ if (ehdr.e_machine == EM_SPARC64 ||
+ ehdr.e_machine == EM_SPARC ||
+ ehdr.e_machine == EM_SPARCV9) {
+ arch = ObjectFile::SPARC;
+ } else if (ehdr.e_machine == EM_MIPS
+ && ehdr.e_ident[EI_CLASS] == ELFCLASS32) {
+ arch = ObjectFile::MIPS;
+ } else if (ehdr.e_ident[EI_CLASS] == ELFCLASS64) {
+ arch = ObjectFile::Alpha;
+ } else {
+ arch = ObjectFile::UnknownArch;
+ }
+
+ //Detect the operating system
+ switch (ehdr.e_ident[EI_OSABI])
+ {
+ case ELFOSABI_LINUX:
+ opSys = ObjectFile::Linux;
+ break;
+ case ELFOSABI_SOLARIS:
+ opSys = ObjectFile::Solaris;
+ case ELFOSABI_TRU64:
+ opSys = ObjectFile::Tru64;
+ default:
+ opSys = ObjectFile::UnknownOpSys;
+ }
+
+ return new ElfObject(fname, fd, len, data, arch, opSys);
}
}
diff --git a/base/loader/object_file.hh b/base/loader/object_file.hh
index 3c8659e18..1b44ae14f 100644
--- a/base/loader/object_file.hh
+++ b/base/loader/object_file.hh
@@ -29,7 +29,9 @@
#ifndef __OBJECT_FILE_HH__
#define __OBJECT_FILE_HH__
-#include "arch/isa_traits.hh" // for Addr
+#include <string>
+
+#include "sim/host.hh" // for Addr
class FunctionalMemory;
class SymbolTable;
@@ -40,13 +42,16 @@ class ObjectFile
enum Arch {
UnknownArch,
- Alpha
+ Alpha,
+ SPARC,
+ MIPS
};
enum OpSys {
UnknownOpSys,
Tru64,
- Linux
+ Linux,
+ Solaris
};
protected: