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
