SE/FS: Build the base process class in FS.

This commit is contained in:
Gabe Black 2011-10-30 00:32:54 -07:00
parent ca36c01f7e
commit 5b433568f0
16 changed files with 37 additions and 145 deletions

View file

@ -267,7 +267,7 @@ InOrderCPU::InOrderCPU(Params *params)
#if FULL_SYSTEM
// SMT is not supported in FS mode yet.
assert(numThreads == 1);
thread[tid] = new Thread(this, 0);
thread[tid] = new Thread(this, 0, NULL);
#else
if (tid < (ThreadID)params->workload.size()) {
DPRINTF(InOrderCPU, "Workload[%i] process is %#x\n",

View file

@ -48,8 +48,8 @@ class FunctionProfile;
class ProfileNode;
#else
class FunctionalMemory;
class Process;
#endif
class Process;
/**
* Class that has various thread state, such as the status, the
@ -76,24 +76,15 @@ class InOrderThreadState : public ThreadState {
*/
bool trapPending;
#if FULL_SYSTEM
InOrderThreadState(InOrderCPU *_cpu, ThreadID _thread_num)
: ThreadState(reinterpret_cast<BaseCPU*>(_cpu), _thread_num),
cpu(_cpu), inSyscall(0), trapPending(0), lastGradIsBranch(false)
{ }
#else
InOrderThreadState(InOrderCPU *_cpu, ThreadID _thread_num,
Process *_process)
: ThreadState(reinterpret_cast<BaseCPU*>(_cpu), _thread_num,
_process),
cpu(_cpu), inSyscall(0), trapPending(0), lastGradIsBranch(false)
{ }
#endif
#if !FULL_SYSTEM
/** Handles the syscall. */
void syscall(int64_t callnum) { process->syscall(callnum, tc); }
#endif
#if FULL_SYSTEM
void dumpFuncProfile();

View file

@ -357,7 +357,7 @@ FullO3CPU<Impl>::FullO3CPU(DerivO3CPUParams *params)
#if FULL_SYSTEM
// SMT is not supported in FS mode yet.
assert(this->numThreads == 1);
this->thread[tid] = new Thread(this, 0);
this->thread[tid] = new Thread(this, 0, NULL);
#else
if (tid < params->workload.size()) {
DPRINTF(O3CPU, "Workload[%i] process is %#x",

View file

@ -75,11 +75,11 @@ struct O3ThreadState : public ThreadState {
*/
bool trapPending;
#if FULL_SYSTEM
O3ThreadState(O3CPU *_cpu, int _thread_num)
: ThreadState(_cpu, _thread_num),
O3ThreadState(O3CPU *_cpu, int _thread_num, Process *_process)
: ThreadState(_cpu, _thread_num, _process),
cpu(_cpu), inSyscall(0), trapPending(0)
{
#if FULL_SYSTEM
if (cpu->params()->profile) {
profile = new FunctionProfile(cpu->params()->system->kernelSymtab);
Callback *cb =
@ -93,13 +93,8 @@ struct O3ThreadState : public ThreadState {
static ProfileNode dummyNode;
profileNode = &dummyNode;
profilePC = 3;
}
#else
O3ThreadState(O3CPU *_cpu, int _thread_num, Process *_process)
: ThreadState(_cpu, _thread_num, _process),
cpu(_cpu), inSyscall(0), trapPending(0)
{ }
#endif
}
/** Pointer to the ThreadContext of this thread. */
ThreadContext *tc;

View file

@ -62,11 +62,20 @@
using namespace std;
// constructor
#if FULL_SYSTEM
#if !FULL_SYSTEM
SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, Process *_process,
TheISA::TLB *_itb, TheISA::TLB *_dtb)
: ThreadState(_cpu, _thread_num, _process),
cpu(_cpu), itb(_itb), dtb(_dtb)
{
clearArchRegs();
tc = new ProxyThreadContext<SimpleThread>(this);
}
#else
SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys,
TheISA::TLB *_itb, TheISA::TLB *_dtb,
bool use_kernel_stats)
: ThreadState(_cpu, _thread_num),
: ThreadState(_cpu, _thread_num, NULL),
cpu(_cpu), system(_sys), itb(_itb), dtb(_dtb)
{
@ -93,24 +102,10 @@ SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys,
if (use_kernel_stats)
kernelStats = new TheISA::Kernel::Statistics(system);
}
#else
SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, Process *_process,
TheISA::TLB *_itb, TheISA::TLB *_dtb)
: ThreadState(_cpu, _thread_num, _process),
cpu(_cpu), itb(_itb), dtb(_dtb)
{
clearArchRegs();
tc = new ProxyThreadContext<SimpleThread>(this);
}
#endif
SimpleThread::SimpleThread()
#if FULL_SYSTEM
: ThreadState(NULL, -1)
#else
: ThreadState(NULL, -1, NULL)
#endif
{
tc = new ProxyThreadContext<SimpleThread>(this);
}

View file

@ -42,32 +42,24 @@
#include "cpu/quiesce_event.hh"
#endif
#if FULL_SYSTEM
ThreadState::ThreadState(BaseCPU *cpu, ThreadID _tid)
#else
ThreadState::ThreadState(BaseCPU *cpu, ThreadID _tid, Process *_process)
#endif
: numInst(0), numLoad(0), _status(ThreadContext::Halted),
baseCpu(cpu), _threadId(_tid), lastActivate(0), lastSuspend(0),
#if FULL_SYSTEM
profile(NULL), profileNode(NULL), profilePC(0), quiesceEvent(NULL),
kernelStats(NULL),
#else
process(_process),
#endif
port(NULL), virtPort(NULL), physPort(NULL), funcExeInst(0),
storeCondFailures(0)
process(_process), port(NULL), virtPort(NULL), physPort(NULL),
funcExeInst(0), storeCondFailures(0)
{
}
ThreadState::~ThreadState()
{
#if !FULL_SYSTEM
if (port) {
delete port->getPeer();
delete port;
}
#endif
}
void
@ -164,11 +156,7 @@ ThreadState::getMemPort()
/* Use this port to for syscall emulation writes to memory. */
port = new TranslatingPort(csprintf("%s-%d-funcport", baseCpu->name(),
_threadId),
#if !FULL_SYSTEM
process,
#endif
TranslatingPort::NextPage);
_threadId), process, TranslatingPort::NextPage);
connectToMemFunc(port);

View file

@ -36,11 +36,8 @@
#include "cpu/base.hh"
#include "cpu/profile.hh"
#include "cpu/thread_context.hh"
#if !FULL_SYSTEM
#include "mem/mem_object.hh"
#include "sim/process.hh"
#endif
#if FULL_SYSTEM
class EndQuiesceEvent;
@ -66,11 +63,7 @@ class TranslatingPort;
struct ThreadState {
typedef ThreadContext::Status Status;
#if FULL_SYSTEM
ThreadState(BaseCPU *cpu, ThreadID _tid);
#else
ThreadState(BaseCPU *cpu, ThreadID _tid, Process *_process);
#endif
~ThreadState();
@ -185,10 +178,9 @@ struct ThreadState {
EndQuiesceEvent *quiesceEvent;
TheISA::Kernel::Statistics *kernelStats;
protected:
#else
Process *process;
#endif
protected:
Process *process;
TranslatingPort *port;

View file

@ -52,15 +52,9 @@
using namespace std;
using namespace TheISA;
PageTable::PageTable(
#if !FULL_SYSTEM
Process *_process,
#endif
Addr _pageSize)
: pageSize(_pageSize), offsetMask(mask(floorLog2(_pageSize)))
#if !FULL_SYSTEM
, process(_process)
#endif
PageTable::PageTable(Process *_process, Addr _pageSize)
: pageSize(_pageSize), offsetMask(mask(floorLog2(_pageSize))),
process(_process)
{
assert(isPowerOf2(pageSize));
pTableCache[0].vaddr = 0;
@ -89,11 +83,9 @@ PageTable::allocate(Addr vaddr, int64_t size)
vaddr);
}
#if !FULL_SYSTEM
pTable[vaddr] = TheISA::TlbEntry(process->M5_pid, vaddr,
process->system->new_page());
updateCache(vaddr, pTable[vaddr]);
#endif
}
}
@ -204,9 +196,7 @@ PageTable::serialize(std::ostream &os)
PTableItr iter = pTable.begin();
PTableItr end = pTable.end();
while (iter != end) {
#if !FULL_SYSTEM
os << "\n[" << csprintf("%s.Entry%d", process->name(), count) << "]\n";
#endif
paramOut(os, "vaddr", iter->first);
iter->second.serialize(os);
@ -226,7 +216,6 @@ PageTable::unserialize(Checkpoint *cp, const std::string &section)
pTable.clear();
while (i < count) {
#if !FULL_SYSTEM
TheISA::TlbEntry *entry;
Addr vaddr;
@ -235,7 +224,6 @@ PageTable::unserialize(Checkpoint *cp, const std::string &section)
entry->unserialize(cp, csprintf("%s.Entry%d", process->name(), i));
pTable[vaddr] = *entry;
++i;
#endif
}
}

View file

@ -47,9 +47,7 @@
#include "mem/request.hh"
#include "sim/serialize.hh"
#if !FULL_SYSTEM
class Process;
#endif
/**
* Page Table Declaration.
@ -71,17 +69,11 @@ class PageTable
const Addr pageSize;
const Addr offsetMask;
#if !FULL_SYSTEM
Process *process;
#endif
public:
PageTable(
#if !FULL_SYSTEM
Process *_process,
#endif
Addr _pageSize = TheISA::VMPageSize);
PageTable(Process *_process, Addr _pageSize = TheISA::VMPageSize);
~PageTable();

View file

@ -33,27 +33,17 @@
#include "arch/isa_traits.hh"
#include "base/chunk_generator.hh"
#include "config/full_system.hh"
#include "config/the_isa.hh"
#include "mem/page_table.hh"
#include "mem/port.hh"
#include "mem/translating_port.hh"
#if !FULL_SYSTEM
#include "sim/process.hh"
#endif
using namespace TheISA;
TranslatingPort::TranslatingPort(const std::string &_name,
#if !FULL_SYSTEM
Process *p,
#endif
TranslatingPort::TranslatingPort(const std::string &_name, Process *p,
AllocType alloc)
: FunctionalPort(_name),
#if !FULL_SYSTEM
pTable(p->pTable), process(p),
#endif
allocating(alloc)
: FunctionalPort(_name), pTable(p->pTable), process(p), allocating(alloc)
{ }
TranslatingPort::~TranslatingPort()
@ -99,11 +89,9 @@ TranslatingPort::tryWriteBlob(Addr addr, uint8_t *p, int size)
VMPageSize);
} else if (allocating == NextPage) {
// check if we've accessed the next page on the stack
#if !FULL_SYSTEM
if (!process->fixupStackFault(gen.addr()))
panic("Page table fault when accessing virtual address %#x "
"during functional write\n", gen.addr());
#endif
} else {
return false;
}

View file

@ -32,13 +32,10 @@
#ifndef __MEM_TRANSLATING_PROT_HH__
#define __MEM_TRANSLATING_PROT_HH__
#include "config/full_system.hh"
#include "mem/port.hh"
class PageTable;
#if !FULL_SYSTEM
class Process;
#endif
class TranslatingPort : public FunctionalPort
{
@ -51,17 +48,11 @@ class TranslatingPort : public FunctionalPort
private:
PageTable *pTable;
#if !FULL_SYSTEM
Process *process;
#endif
AllocType allocating;
public:
TranslatingPort(const std::string &_name,
#if !FULL_SYSTEM
Process *p,
#endif
AllocType alloc);
TranslatingPort(const std::string &_name, Process *p, AllocType alloc);
virtual ~TranslatingPort();
bool tryReadBlob(Addr addr, uint8_t *p, int size);

View file

@ -48,8 +48,10 @@ Source('simulate.cc')
Source('stat_control.cc')
if env['TARGET_ISA'] != 'no':
SimObject('Process.py')
SimObject('System.py')
Source('faults.cc')
Source('process.cc')
Source('pseudo_inst.cc')
Source('system.cc')
@ -57,9 +59,7 @@ if env['FULL_SYSTEM']:
Source('arguments.cc')
elif env['TARGET_ISA'] != 'no':
Source('tlb.cc')
SimObject('Process.py')
Source('process.cc')
Source('syscall_emul.cc')
DebugFlag('Checkpoint')

View file

@ -77,15 +77,6 @@
using namespace std;
using namespace TheISA;
//
// The purpose of this code is to fake the loader & syscall mechanism
// when there's no OS: thus there's no resone to use it in FULL_SYSTEM
// mode when we do have an OS
//
#if FULL_SYSTEM
#error "process.cc not compatible with FULL_SYSTEM"
#endif
// current number of allocated processes
int num_processes = 0;
@ -579,6 +570,7 @@ LiveProcess::LiveProcess(LiveProcessParams * params, ObjectFile *_objFile)
void
LiveProcess::syscall(int64_t callnum, ThreadContext *tc)
{
#if !FULL_SYSTEM
num_syscalls++;
SyscallDesc *desc = getDesc(callnum);
@ -586,6 +578,7 @@ LiveProcess::syscall(int64_t callnum, ThreadContext *tc)
fatal("Syscall %d out of range", callnum);
desc->doSyscall(callnum, this, tc);
#endif
}
IntReg
@ -611,6 +604,7 @@ LiveProcess::create(LiveProcessParams * params)
"executables are supported!\n Please recompile your "
"executable as a static binary and try again.\n");
#if !FULL_SYSTEM
#if THE_ISA == ALPHA_ISA
if (objFile->getArch() != ObjectFile::Alpha)
fatal("Object file architecture does not match compiled ISA (Alpha).");
@ -721,7 +715,7 @@ LiveProcess::create(LiveProcessParams * params)
#else
#error "THE_ISA not set"
#endif
#endif
if (process == NULL)
fatal("Unknown error creating process object.");

View file

@ -32,15 +32,6 @@
#ifndef __PROCESS_HH__
#define __PROCESS_HH__
//
// The purpose of this code is to fake the loader & syscall mechanism
// when there's no OS: thus there's no reason to use it in FULL_SYSTEM
// mode when we do have an OS.
//
#include "config/full_system.hh"
#if !FULL_SYSTEM
#include <string>
#include <vector>
@ -317,6 +308,4 @@ class LiveProcess : public Process
};
#endif // !FULL_SYSTEM
#endif // __PROCESS_HH__

View file

@ -32,15 +32,6 @@
#ifndef __SIM_PROCESS_IMPL_HH__
#define __SIM_PROCESS_IMPL_HH__
//
// The purpose of this code is to fake the loader & syscall mechanism
// when there's no OS: thus there's no reason to use it in FULL_SYSTEM
// mode when we do have an OS.
//
#include "config/full_system.hh"
#if !FULL_SYSTEM
#include <string>
#include <vector>
@ -69,7 +60,4 @@ copyStringArray(std::vector<std::string> &strings,
memPort->writeBlob(array_ptr, (uint8_t*)&data_ptr, sizeof(AddrType));
}
#endif // !FULL_SYSTEM
#endif

View file

@ -65,6 +65,7 @@
#include "mem/translating_port.hh"
#include "sim/byteswap.hh"
#include "sim/process.hh"
#include "sim/syscallreturn.hh"
#include "sim/system.hh"
///