Along these lines, I do think figuring out how to consolidate process start up code more would be a good idea. SPARC and x86 are to the best of my knowledge byte identical to the machine I was using when I worked on them, and ARM is byte identical to a slightly newer kernel. They're almost ISA independent, but there are little bits here and there that make it not quite a clean cut.
Gabe Gabe Black wrote: > I'm confused... Where's Addr in this code? Why can't you just substitute > a different type if it's templated? > > Korey Sewell wrote: > >> # HG changeset patch >> # User Korey Sewell <[email protected]> >> # Date 1249236222 14400 >> # Node ID 5aa846b0397fa026286ab54fa29a9d87cca4f932 >> # Parent e46754b929cab9cf21a3f4d8578ae58071a526fd >> mips_se_args: fix for MIPS32 command line arguments >> In the base argsInit function, command line args were being processed by a >> templated function on type Addr. Problem is >> Addr type is 64 bits so the arguments were overwriting each other and >> eventually breaking any program attempting to use those args. >> The current solution is to write a argsInit just for MIPS similar to how >> ALPHA has its own. However, since all I'm doing is >> changing the type of variable, shouldnt there be a better way rather than >> copy/paste almost a whole function? >> >> diff -r e46754b929ca -r 5aa846b0397f src/arch/mips/linux/process.cc >> --- a/src/arch/mips/linux/process.cc Fri Jul 31 10:40:42 2009 -0400 >> +++ b/src/arch/mips/linux/process.cc Sun Aug 02 14:03:42 2009 -0400 >> @@ -413,12 +413,6 @@ MipsLinuxProcess::MipsLinuxProcess(LiveP >> Num_Syscall_Descs(sizeof(syscallDescs) / sizeof(SyscallDesc)) >> { } >> >> -void >> -MipsLinuxProcess::startup() >> -{ >> - MipsLiveProcess::argsInit(MachineBytes, VMPageSize); >> -} >> - >> SyscallDesc* >> MipsLinuxProcess::getDesc(int callnum) >> { >> diff -r e46754b929ca -r 5aa846b0397f src/arch/mips/linux/process.hh >> --- a/src/arch/mips/linux/process.hh Fri Jul 31 10:40:42 2009 -0400 >> +++ b/src/arch/mips/linux/process.hh Sun Aug 02 14:03:42 2009 -0400 >> @@ -43,8 +43,6 @@ class MipsLinuxProcess : public MipsLive >> /// Constructor. >> MipsLinuxProcess(LiveProcessParams * params, ObjectFile *objFile); >> >> - void startup(); >> - >> virtual SyscallDesc* getDesc(int callnum); >> >> /// The target system's hostname. >> diff -r e46754b929ca -r 5aa846b0397f src/arch/mips/process.cc >> --- a/src/arch/mips/process.cc Fri Jul 31 10:40:42 2009 -0400 >> +++ b/src/arch/mips/process.cc Sun Aug 02 14:03:42 2009 -0400 >> @@ -32,9 +32,15 @@ >> >> #include "arch/mips/isa_traits.hh" >> #include "arch/mips/process.hh" >> + >> #include "base/loader/object_file.hh" >> #include "base/misc.hh" >> #include "cpu/thread_context.hh" >> + >> +#include "mem/page_table.hh" >> + >> +#include "sim/process.hh" >> +#include "sim/process_impl.hh" >> #include "sim/system.hh" >> >> using namespace std; >> @@ -62,8 +68,83 @@ void >> void >> MipsLiveProcess::startup() >> { >> + Process::startup(); >> + >> argsInit(MachineBytes, VMPageSize); >> } >> + >> +void >> +MipsLiveProcess::argsInit(int intSize, int pageSize) >> +{ >> + // load object file into target memory >> + objFile->loadSections(initVirtMem); >> + >> + // Calculate how much space we need for arg & env arrays. >> + int argv_array_size = intSize * (argv.size() + 1); >> + int envp_array_size = intSize * (envp.size() + 1); >> + int arg_data_size = 0; >> + for (vector<string>::size_type i = 0; i < argv.size(); ++i) { >> + arg_data_size += argv[i].size() + 1; >> + } >> + int env_data_size = 0; >> + for (vector<string>::size_type i = 0; i < envp.size(); ++i) { >> + env_data_size += envp[i].size() + 1; >> + } >> + >> + int space_needed = >> + argv_array_size + envp_array_size + arg_data_size + env_data_size; >> + if (space_needed < 32*1024) >> + space_needed = 32*1024; >> + >> + // set bottom of stack >> + stack_min = stack_base - space_needed; >> + // align it >> + stack_min = roundDown(stack_min, pageSize); >> + stack_size = stack_base - stack_min; >> + // map memory >> + pTable->allocate(stack_min, roundUp(stack_size, pageSize)); >> + >> + // map out initial stack contents >> + // ======== >> + // NOTE: Using uint32_t hardcodes MIPS32 and not MIPS64 >> + // even if MIPS64 was intended. This is because the >> + // copyStringArray function templates on the parameters. >> + // Elegant way to check intSize and vary between 32/64? >> + // ======== >> + uint32_t argv_array_base = stack_min + intSize; // room for argc >> + uint32_t envp_array_base = argv_array_base + argv_array_size; >> + uint32_t arg_data_base = envp_array_base + envp_array_size; >> + uint32_t env_data_base = arg_data_base + arg_data_size; >> + >> + // write contents to stack >> + uint32_t argc = argv.size(); >> + >> + if (intSize == 8) >> + argc = htog((uint64_t)argc); >> + else if (intSize == 4) >> + argc = htog((uint32_t)argc); >> + else >> + panic("Unknown int size"); >> + >> + >> + initVirtMem->writeBlob(stack_min, (uint8_t*)&argc, intSize); >> + >> + copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem); >> + >> + copyStringArray(envp, envp_array_base, env_data_base, initVirtMem); >> + >> + ThreadContext *tc = system->getThreadContext(contextIds[0]); >> + >> + setSyscallArg(tc, 0, argc); >> + setSyscallArg(tc, 1, argv_array_base); >> + tc->setIntReg(StackPointerReg, stack_min); >> + >> + Addr prog_entry = objFile->entryPoint(); >> + tc->setPC(prog_entry); >> + tc->setNextPC(prog_entry + sizeof(MachInst)); >> + tc->setNextNPC(prog_entry + (2 * sizeof(MachInst))); >> +} >> + >> >> MipsISA::IntReg >> MipsLiveProcess::getSyscallArg(ThreadContext *tc, int i) >> diff -r e46754b929ca -r 5aa846b0397f src/arch/mips/process.hh >> --- a/src/arch/mips/process.hh Fri Jul 31 10:40:42 2009 -0400 >> +++ b/src/arch/mips/process.hh Sun Aug 02 14:03:42 2009 -0400 >> @@ -45,7 +45,9 @@ class MipsLiveProcess : public LiveProce >> protected: >> MipsLiveProcess(LiveProcessParams * params, ObjectFile *objFile); >> >> - virtual void startup(); >> + void startup(); >> + >> + void argsInit(int intSize, int pageSize); >> >> public: >> MipsISA::IntReg getSyscallArg(ThreadContext *tc, int i); >> _______________________________________________ >> m5-dev mailing list >> [email protected] >> http://m5sim.org/mailman/listinfo/m5-dev >> >> > > _______________________________________________ > m5-dev mailing list > [email protected] > http://m5sim.org/mailman/listinfo/m5-dev > _______________________________________________ m5-dev mailing list [email protected] http://m5sim.org/mailman/listinfo/m5-dev
