arch,cpu,mem,sim: Reimplement the SE translating proxy using the FS one.

The only functional difference between them was that the SE one might
have optionally fixed up missing translations for demand paging.

This lets us get rid of some code recreating the proxy ports in
setProcessPtr since the SE translating port no longer keeps a copy of
the process object pointer.

Change-Id: Id97df1874f1de138ffd4f2dbb5846dda79d9e4ac
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/26550
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Matthew Poremba <matthew.poremba@amd.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2020-03-09 16:50:32 -07:00
parent 8e0e7da5ab
commit 7342bccd8d
15 changed files with 122 additions and 216 deletions

View File

@@ -410,8 +410,7 @@ ThreadContext::initMemProxies(::ThreadContext *tc)
virtProxy.reset(new FSTranslatingPortProxy(tc));
} else {
assert(!virtProxy);
virtProxy.reset(new SETranslatingPortProxy(
_cpu->getSendFunctional(), getProcessPtr(),
virtProxy.reset(new SETranslatingPortProxy(this,
SETranslatingPortProxy::NextPage));
}
}

View File

@@ -404,16 +404,16 @@ ArmProcess::argsInit(int pageSize, IntRegIndex spIndex)
//Write out the sentry void *
IntType sentry_NULL = 0;
initVirtMem.writeBlob(sentry_base, &sentry_NULL, sentry_size);
initVirtMem->writeBlob(sentry_base, &sentry_NULL, sentry_size);
//Fix up the aux vectors which point to other data
for (int i = auxv.size() - 1; i >= 0; i--) {
if (auxv[i].type == M5_AT_PLATFORM) {
auxv[i].val = platform_base;
initVirtMem.writeString(platform_base, platform.c_str());
initVirtMem->writeString(platform_base, platform.c_str());
} else if (auxv[i].type == M5_AT_EXECFN) {
auxv[i].val = aux_data_base;
initVirtMem.writeString(aux_data_base, filename.c_str());
initVirtMem->writeString(aux_data_base, filename.c_str());
} else if (auxv[i].type == M5_AT_RANDOM) {
auxv[i].val = aux_random_base;
// Just leave the value 0, we don't want randomness
@@ -423,20 +423,20 @@ ArmProcess::argsInit(int pageSize, IntRegIndex spIndex)
//Copy the aux stuff
Addr auxv_array_end = auxv_array_base;
for (const auto &aux: auxv) {
initVirtMem.write(auxv_array_end, aux, GuestByteOrder);
initVirtMem->write(auxv_array_end, aux, GuestByteOrder);
auxv_array_end += sizeof(aux);
}
//Write out the terminating zeroed auxillary vector
const AuxVector<IntType> zero(0, 0);
initVirtMem.write(auxv_array_end, zero);
initVirtMem->write(auxv_array_end, zero);
auxv_array_end += sizeof(zero);
copyStringArray(envp, envp_array_base, env_data_base,
LittleEndianByteOrder, initVirtMem);
LittleEndianByteOrder, *initVirtMem);
copyStringArray(argv, argv_array_base, arg_data_base,
LittleEndianByteOrder, initVirtMem);
LittleEndianByteOrder, *initVirtMem);
initVirtMem.writeBlob(argc_base, &guestArgc, intSize);
initVirtMem->writeBlob(argc_base, &guestArgc, intSize);
ThreadContext *tc = system->getThreadContext(contextIds[0]);
//Set the stack pointer register

View File

@@ -159,24 +159,24 @@ MipsProcess::argsInit(int pageSize)
argc = htole((IntType)argc);
initVirtMem.writeBlob(memState->getStackMin(), &argc, intSize);
initVirtMem->writeBlob(memState->getStackMin(), &argc, intSize);
copyStringArray(argv, argv_array_base, arg_data_base,
LittleEndianByteOrder, initVirtMem);
LittleEndianByteOrder, *initVirtMem);
copyStringArray(envp, envp_array_base, env_data_base,
LittleEndianByteOrder, initVirtMem);
LittleEndianByteOrder, *initVirtMem);
// Copy the aux vector
Addr auxv_array_end = auxv_array_base;
for (const auto &aux: auxv) {
initVirtMem.write(auxv_array_end, aux, GuestByteOrder);
initVirtMem->write(auxv_array_end, aux, GuestByteOrder);
auxv_array_end += sizeof(aux);
}
// Write out the terminating zeroed auxilliary vector
const AuxVector<IntType> zero(0, 0);
initVirtMem.write(auxv_array_end, zero);
initVirtMem->write(auxv_array_end, zero);
auxv_array_end += sizeof(zero);
ThreadContext *tc = system->getThreadContext(contextIds[0]);

View File

@@ -93,8 +93,8 @@ PowerProcess::argsInit(int intSize, int pageSize)
uint64_t align = 16;
// load object file into target memory
image.write(initVirtMem);
interpImage.write(initVirtMem);
image.write(*initVirtMem);
interpImage.write(*initVirtMem);
//Setup the auxilliary vectors. These will already have endian conversion.
//Auxilliary vectors are loaded only for elf formatted executables.
@@ -227,36 +227,36 @@ PowerProcess::argsInit(int intSize, int pageSize)
//Write out the sentry void *
uint32_t sentry_NULL = 0;
initVirtMem.writeBlob(sentry_base, &sentry_NULL, sentry_size);
initVirtMem->writeBlob(sentry_base, &sentry_NULL, sentry_size);
//Fix up the aux vectors which point to other data
for (int i = auxv.size() - 1; i >= 0; i--) {
if (auxv[i].type == M5_AT_PLATFORM) {
auxv[i].val = platform_base;
initVirtMem.writeString(platform_base, platform.c_str());
initVirtMem->writeString(platform_base, platform.c_str());
} else if (auxv[i].type == M5_AT_EXECFN) {
auxv[i].val = aux_data_base;
initVirtMem.writeString(aux_data_base, filename.c_str());
initVirtMem->writeString(aux_data_base, filename.c_str());
}
}
//Copy the aux stuff
Addr auxv_array_end = auxv_array_base;
for (const auto &aux: auxv) {
initVirtMem.write(auxv_array_end, aux, GuestByteOrder);
initVirtMem->write(auxv_array_end, aux, GuestByteOrder);
auxv_array_end += sizeof(aux);
}
//Write out the terminating zeroed auxilliary vector
const AuxVector<uint64_t> zero(0, 0);
initVirtMem.write(auxv_array_end, zero);
initVirtMem->write(auxv_array_end, zero);
auxv_array_end += sizeof(zero);
copyStringArray(envp, envp_array_base, env_data_base,
BigEndianByteOrder, initVirtMem);
BigEndianByteOrder, *initVirtMem);
copyStringArray(argv, argv_array_base, arg_data_base,
BigEndianByteOrder, initVirtMem);
BigEndianByteOrder, *initVirtMem);
initVirtMem.writeBlob(argc_base, &guestArgc, intSize);
initVirtMem->writeBlob(argc_base, &guestArgc, intSize);
ThreadContext *tc = system->getThreadContext(contextIds[0]);

View File

@@ -155,17 +155,17 @@ RiscvProcess::argsInit(int pageSize)
uint8_t at_random[RandomBytes];
generate(begin(at_random), end(at_random),
[&]{ return random_mt.random(0, 0xFF); });
initVirtMem.writeBlob(memState->getStackMin(), at_random, RandomBytes);
initVirtMem->writeBlob(memState->getStackMin(), at_random, RandomBytes);
// Copy argv to stack
vector<Addr> argPointers;
for (const string& arg: argv) {
memState->setStackMin(memState->getStackMin() - (arg.size() + 1));
initVirtMem.writeString(memState->getStackMin(), arg.c_str());
initVirtMem->writeString(memState->getStackMin(), arg.c_str());
argPointers.push_back(memState->getStackMin());
if (DTRACE(Stack)) {
string wrote;
initVirtMem.readString(wrote, argPointers.back());
initVirtMem->readString(wrote, argPointers.back());
DPRINTFN("Wrote arg \"%s\" to address %p\n",
wrote, (void*)memState->getStackMin());
}
@@ -176,7 +176,7 @@ RiscvProcess::argsInit(int pageSize)
vector<Addr> envPointers;
for (const string& env: envp) {
memState->setStackMin(memState->getStackMin() - (env.size() + 1));
initVirtMem.writeString(memState->getStackMin(), env.c_str());
initVirtMem->writeString(memState->getStackMin(), env.c_str());
envPointers.push_back(memState->getStackMin());
DPRINTF(Stack, "Wrote env \"%s\" to address %p\n",
env, (void*)memState->getStackMin());
@@ -195,7 +195,7 @@ RiscvProcess::argsInit(int pageSize)
Addr sp = memState->getStackMin();
const auto pushOntoStack =
[this, &sp](IntType data) {
initVirtMem.write(sp, data, GuestByteOrder);
initVirtMem->write(sp, data, GuestByteOrder);
sp += sizeof(data);
};

View File

@@ -351,29 +351,29 @@ SparcProcess::argsInit(int pageSize)
// Write out the sentry void *
uint64_t sentry_NULL = 0;
initVirtMem.writeBlob(sentry_base, &sentry_NULL, sentry_size);
initVirtMem->writeBlob(sentry_base, &sentry_NULL, sentry_size);
// Write the file name
initVirtMem.writeString(file_name_base, filename.c_str());
initVirtMem->writeString(file_name_base, filename.c_str());
// Copy the aux stuff
Addr auxv_array_end = auxv_array_base;
for (const auto &aux: auxv) {
initVirtMem.write(auxv_array_end, aux, GuestByteOrder);
initVirtMem->write(auxv_array_end, aux, GuestByteOrder);
auxv_array_end += sizeof(aux);
}
// Write out the terminating zeroed auxilliary vector
const AuxVector<IntType> zero(0, 0);
initVirtMem.write(auxv_array_end, zero);
initVirtMem->write(auxv_array_end, zero);
auxv_array_end += sizeof(zero);
copyStringArray(envp, envp_array_base, env_data_base,
BigEndianByteOrder, initVirtMem);
BigEndianByteOrder, *initVirtMem);
copyStringArray(argv, argv_array_base, arg_data_base,
BigEndianByteOrder, initVirtMem);
BigEndianByteOrder, *initVirtMem);
initVirtMem.writeBlob(argc_base, &guestArgc, intSize);
initVirtMem->writeBlob(argc_base, &guestArgc, intSize);
// Set up space for the trap handlers into the processes address space.
// Since the stack grows down and there is reserved address space abov
@@ -404,9 +404,9 @@ Sparc64Process::argsInit(int intSize, int pageSize)
SparcProcess::argsInit<uint64_t>(pageSize);
// Stuff the trap handlers into the process address space
initVirtMem.writeBlob(fillStart,
initVirtMem->writeBlob(fillStart,
fillHandler64, sizeof(MachInst) * numFillInsts);
initVirtMem.writeBlob(spillStart,
initVirtMem->writeBlob(spillStart,
spillHandler64, sizeof(MachInst) * numSpillInsts);
}
@@ -416,9 +416,9 @@ Sparc32Process::argsInit(int intSize, int pageSize)
SparcProcess::argsInit<uint32_t>(pageSize);
// Stuff the trap handlers into the process address space
initVirtMem.writeBlob(fillStart,
initVirtMem->writeBlob(fillStart,
fillHandler32, sizeof(MachInst) * numFillInsts);
initVirtMem.writeBlob(spillStart,
initVirtMem->writeBlob(spillStart,
spillHandler32, sizeof(MachInst) * numSpillInsts);
}

View File

@@ -195,7 +195,7 @@ X86_64Process::initState()
0x0f,0x05, // syscall
0xc3 // retq
};
initVirtMem.writeBlob(vsyscallPage.base + vsyscallPage.vtimeOffset,
initVirtMem->writeBlob(vsyscallPage.base + vsyscallPage.vtimeOffset,
vtimeBlob, sizeof(vtimeBlob));
uint8_t vgettimeofdayBlob[] = {
@@ -203,7 +203,8 @@ X86_64Process::initState()
0x0f,0x05, // syscall
0xc3 // retq
};
initVirtMem.writeBlob(vsyscallPage.base + vsyscallPage.vgettimeofdayOffset,
initVirtMem->writeBlob(
vsyscallPage.base + vsyscallPage.vgettimeofdayOffset,
vgettimeofdayBlob, sizeof(vgettimeofdayBlob));
if (kvmInSE) {
@@ -635,7 +636,7 @@ I386Process::initState()
assert(_gdtSize % sizeof(zero) == 0);
for (Addr gdtCurrent = _gdtStart;
gdtCurrent < _gdtStart + _gdtSize; gdtCurrent += sizeof(zero)) {
initVirtMem.write(gdtCurrent, zero);
initVirtMem->write(gdtCurrent, zero);
}
// Set up the vsyscall page for this process.
@@ -647,7 +648,7 @@ I386Process::initState()
0x89, 0xe5, // mov %esp, %ebp
0x0f, 0x34 // sysenter
};
initVirtMem.writeBlob(vsyscallPage.base + vsyscallPage.vsyscallOffset,
initVirtMem->writeBlob(vsyscallPage.base + vsyscallPage.vsyscallOffset,
vsyscallBlob, sizeof(vsyscallBlob));
uint8_t vsysexitBlob[] = {
@@ -656,7 +657,7 @@ I386Process::initState()
0x59, // pop %ecx
0xc3 // ret
};
initVirtMem.writeBlob(vsyscallPage.base + vsyscallPage.vsysexitOffset,
initVirtMem->writeBlob(vsyscallPage.base + vsyscallPage.vsysexitOffset,
vsysexitBlob, sizeof(vsysexitBlob));
for (int i = 0; i < contextIds.size(); i++) {
@@ -976,10 +977,10 @@ X86Process::argsInit(int pageSize,
// Write out the sentry void *
IntType sentry_NULL = 0;
initVirtMem.writeBlob(sentry_base, &sentry_NULL, sentry_size);
initVirtMem->writeBlob(sentry_base, &sentry_NULL, sentry_size);
// Write the file name
initVirtMem.writeString(file_name_base, filename.c_str());
initVirtMem->writeString(file_name_base, filename.c_str());
// Fix up the aux vectors which point to data
assert(auxv[auxv.size() - 3].type == M5_AT_RANDOM);
@@ -993,22 +994,22 @@ X86Process::argsInit(int pageSize,
// Copy the aux stuff
Addr auxv_array_end = auxv_array_base;
for (const auto &aux: auxv) {
initVirtMem.write(auxv_array_end, aux, GuestByteOrder);
initVirtMem->write(auxv_array_end, aux, GuestByteOrder);
auxv_array_end += sizeof(aux);
}
// Write out the terminating zeroed auxiliary vector
const AuxVector<uint64_t> zero(0, 0);
initVirtMem.write(auxv_array_end, zero);
initVirtMem->write(auxv_array_end, zero);
auxv_array_end += sizeof(zero);
initVirtMem.writeString(aux_data_base, platform.c_str());
initVirtMem->writeString(aux_data_base, platform.c_str());
copyStringArray(envp, envp_array_base, env_data_base,
LittleEndianByteOrder, initVirtMem);
LittleEndianByteOrder, *initVirtMem);
copyStringArray(argv, argv_array_base, arg_data_base,
LittleEndianByteOrder, initVirtMem);
LittleEndianByteOrder, *initVirtMem);
initVirtMem.writeBlob(argc_base, &guestArgc, intSize);
initVirtMem->writeBlob(argc_base, &guestArgc, intSize);
ThreadContext *tc = system->getThreadContext(contextIds[0]);
// Set the stack pointer register