syscall_emul: fix bugs for mmap2 system call and x86-32 syscalls
authorBrandon Potter <brandon.potter@amd.com>
Thu, 17 Mar 2016 17:25:53 +0000 (10:25 -0700)
committerBrandon Potter <brandon.potter@amd.com>
Thu, 17 Mar 2016 17:25:53 +0000 (10:25 -0700)
src/arch/x86/linux/process.cc
src/arch/x86/process.cc
src/sim/syscall_emul.hh

index 9651f7436e81874a8a2e2ec4e50ec5a80d02992c..665815c301f9bfacabe9c398643d916c1ffa75bf 100644 (file)
@@ -733,7 +733,7 @@ static SyscallDesc syscallDescs32[] = {
     /* 189 */ SyscallDesc("putpmsg", unimplementedFunc),
     /* 190 */ SyscallDesc("vfork", unimplementedFunc),
     /* 191 */ SyscallDesc("ugetrlimit", ignoreFunc),
-    /* 192 */ SyscallDesc("mmap2", mmapFunc<X86Linux32>),
+    /* 192 */ SyscallDesc("mmap2", mmap2Func<X86Linux32>),
     /* 193 */ SyscallDesc("truncate64", truncate64Func),
     /* 194 */ SyscallDesc("ftruncate64", ftruncate64Func),
     /* 195 */ SyscallDesc("stat64", stat64Func<X86Linux32>),
index 82a23027dd1397ac364497015fe37612f530c635..13cbf6eddf871fb5a88ec79baa12ccd0a18bf3ad 100644 (file)
@@ -80,6 +80,7 @@ static const int ArgumentReg32[] = {
     INTREG_EDX,
     INTREG_ESI,
     INTREG_EDI,
+    INTREG_EBP
 };
 static const int NumArgumentRegs32 = sizeof(ArgumentReg) / sizeof(const int);
 
index 34fbc6618dfe3e463c2c8ee4e33f64b602266f52..a859fbe434372446dae49f511fa8fbddd2eaced5 100644 (file)
@@ -1223,11 +1223,11 @@ writevFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
     return result;
 }
 
-
-/// Target mmap() handler.
+/// Real mmap handler.
 template <class OS>
 SyscallReturn
-mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
+mmapImpl(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc,
+         bool is_mmap2)
 {
     int index = 0;
     Addr start = p->getSyscallArg(tc, index);
@@ -1237,9 +1237,8 @@ mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
     int tgt_fd = p->getSyscallArg(tc, index);
     int offset = p->getSyscallArg(tc, index);
 
-    DPRINTF_SYSCALL(Verbose, "mmap(0x%x, len %d, prot %d, flags %d, fd %d, "
-                    "offs %d)\n", start, length, prot, tgt_flags, tgt_fd,
-                    offset);
+    if (is_mmap2)
+        offset *= TheISA::PageBytes;
 
     if (start & (TheISA::PageBytes - 1) ||
         offset & (TheISA::PageBytes - 1) ||
@@ -1363,6 +1362,22 @@ mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
     return start;
 }
 
+/// Target mmap() handler.
+template <class OS>
+SyscallReturn
+mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
+{
+    return mmapImpl<OS>(desc, num, p, tc, false);
+}
+
+/// Target mmap2() handler.
+template <class OS>
+SyscallReturn
+mmap2Func(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
+{
+    return mmapImpl<OS>(desc, num, p, tc, true);
+}
+
 /// Target getrlimit() handler.
 template <class OS>
 SyscallReturn