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

Reply via email to