Add a functional port that is used to load the original binaries in FS
SE mode now has a port that goes to whatever toplevel mem object the
CPU sees that does the appropriate translation for syscall emulation
SConscript:
translating port is a syscall emu only source
arch/alpha/system.cc:
base/loader/object_file.cc:
base/loader/object_file.hh:
Use the new functional port to write the binaries into memory
cpu/cpu_exec_context.cc:
cpu/cpu_exec_context.hh:
cpu/simple/cpu.cc:
We aren't always going to be writing straight to memory with syscalls
support writing to a cache
mem/port.hh:
Add a simple unidirectional functional port that panics on any incoming requests
mem/translating_port.hh:
make translating port inherit from the simple port
sim/system.cc:
sim/system.hh:
Add a functional port that is used to load the original binaries
--HG--
extra : convert_revision : 9096866d0b23e3aceea68394abb76e63c0f8fd8d
This commit is contained in:
@@ -63,16 +63,10 @@ ObjectFile::~ObjectFile()
|
||||
|
||||
|
||||
bool
|
||||
ObjectFile::loadSection(Section *sec, Port *memPort, bool loadPhys)
|
||||
ObjectFile::loadSection(Section *sec, Port *memPort, Addr addrMask)
|
||||
{
|
||||
if (sec->size != 0) {
|
||||
Addr addr = sec->baseAddr;
|
||||
if (loadPhys) {
|
||||
// this is Alpha-specific... going to have to fix this
|
||||
// for other architectures
|
||||
addr &= (ULL(1) << 40) - 1;
|
||||
}
|
||||
|
||||
Addr addr = sec->baseAddr & addrMask;
|
||||
if (sec->fileImage) {
|
||||
memPort->writeBlob(addr, sec->fileImage, sec->size);
|
||||
}
|
||||
@@ -86,11 +80,11 @@ ObjectFile::loadSection(Section *sec, Port *memPort, bool loadPhys)
|
||||
|
||||
|
||||
bool
|
||||
ObjectFile::loadSections(Port *memPort, bool loadPhys)
|
||||
ObjectFile::loadSections(Port *memPort, Addr addrMask)
|
||||
{
|
||||
return (loadSection(&text, memPort, loadPhys)
|
||||
&& loadSection(&data, memPort, loadPhys)
|
||||
&& loadSection(&bss, memPort, loadPhys));
|
||||
return (loadSection(&text, memPort, addrMask)
|
||||
&& loadSection(&data, memPort, addrMask)
|
||||
&& loadSection(&bss, memPort, addrMask));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#ifndef __OBJECT_FILE_HH__
|
||||
#define __OBJECT_FILE_HH__
|
||||
|
||||
#include <limits>
|
||||
#include <string>
|
||||
|
||||
#include "sim/host.hh" // for Addr
|
||||
@@ -72,7 +73,8 @@ class ObjectFile
|
||||
|
||||
void close();
|
||||
|
||||
virtual bool loadSections(Port *memPort, bool loadPhys = false);
|
||||
virtual bool loadSections(Port *memPort, Addr addrMask =
|
||||
std::numeric_limits<Addr>::max());
|
||||
virtual bool loadGlobalSymbols(SymbolTable *symtab) = 0;
|
||||
virtual bool loadLocalSymbols(SymbolTable *symtab) = 0;
|
||||
|
||||
@@ -94,7 +96,7 @@ class ObjectFile
|
||||
Section data;
|
||||
Section bss;
|
||||
|
||||
bool loadSection(Section *sec, Port *memPort, bool loadPhys);
|
||||
bool loadSection(Section *sec, Port *memPort, Addr addrMask);
|
||||
void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; }
|
||||
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user