changeset dbbf54058f6f in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=dbbf54058f6f
description:
        syscall_emul: fix bugs for mmap2 system call and x86-32 syscalls

diffstat:

 src/arch/x86/linux/process.cc |   2 +-
 src/arch/x86/process.cc       |   1 +
 src/sim/syscall_emul.hh       |  27 +++++++++++++++++++++------
 3 files changed, 23 insertions(+), 7 deletions(-)

diffs (76 lines):

diff -r e3cbd2823210 -r dbbf54058f6f src/arch/x86/linux/process.cc
--- a/src/arch/x86/linux/process.cc     Thu Mar 17 10:25:11 2016 -0700
+++ b/src/arch/x86/linux/process.cc     Thu Mar 17 10:25:53 2016 -0700
@@ -733,7 +733,7 @@
     /* 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>),
diff -r e3cbd2823210 -r dbbf54058f6f src/arch/x86/process.cc
--- a/src/arch/x86/process.cc   Thu Mar 17 10:25:11 2016 -0700
+++ b/src/arch/x86/process.cc   Thu Mar 17 10:25:53 2016 -0700
@@ -80,6 +80,7 @@
     INTREG_EDX,
     INTREG_ESI,
     INTREG_EDI,
+    INTREG_EBP
 };
 static const int NumArgumentRegs32 = sizeof(ArgumentReg) / sizeof(const int);
 
diff -r e3cbd2823210 -r dbbf54058f6f src/sim/syscall_emul.hh
--- a/src/sim/syscall_emul.hh   Thu Mar 17 10:25:11 2016 -0700
+++ b/src/sim/syscall_emul.hh   Thu Mar 17 10:25:53 2016 -0700
@@ -1223,11 +1223,11 @@
     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 @@
     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 @@
     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
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to