# 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