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

Reply via email to