changeset 5ac090acd180 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=5ac090acd180
description:
        syscall_emul: extend mmap system call to support file backed mmaps

        For O3, which has a stat that counts reg reads, there is an additional
        reg read per mmap() call since there's an arg we no longer ignore.
        Otherwise, stats should not be affected.

diffstat:

 src/arch/alpha/linux/linux.cc     |   30 ++++++-
 src/arch/alpha/linux/linux.hh     |   21 ++++-
 src/arch/alpha/tru64/tru64.cc     |   22 ++++
 src/arch/alpha/tru64/tru64.hh     |   24 ++++-
 src/arch/arm/freebsd/freebsd.hh   |    4 +
 src/arch/arm/linux/linux.cc       |   55 +++++++++++-
 src/arch/arm/linux/linux.hh       |   42 ++++++++-
 src/arch/mips/linux/linux.cc      |   31 ++++++-
 src/arch/mips/linux/linux.hh      |   21 ++++-
 src/arch/power/linux/linux.cc     |   30 ++++++-
 src/arch/power/linux/linux.hh     |   21 ++++-
 src/arch/sparc/linux/linux.cc     |   34 +++++++-
 src/arch/sparc/linux/linux.hh     |   23 ++++-
 src/arch/sparc/solaris/solaris.cc |   29 ++++++-
 src/arch/sparc/solaris/solaris.hh |   23 ++++-
 src/arch/x86/linux/linux.cc       |   60 +++++++++++++-
 src/arch/x86/linux/linux.hh       |   47 +++++++++-
 src/sim/syscall_emul.cc           |    4 +-
 src/sim/syscall_emul.hh           |  169 ++++++++++++++++++++++++-------------
 19 files changed, 595 insertions(+), 95 deletions(-)

diffs (truncated from 989 to 300 lines):

diff -r 654272b82e94 -r 5ac090acd180 src/arch/alpha/linux/linux.cc
--- a/src/arch/alpha/linux/linux.cc     Thu Mar 17 10:22:39 2016 -0700
+++ b/src/arch/alpha/linux/linux.cc     Thu Mar 17 10:24:17 2016 -0700
@@ -28,9 +28,10 @@
  * Authors: Korey Sewell
  */
 
+#include "arch/alpha/linux/linux.hh"
+
 #include <fcntl.h>
-
-#include "arch/alpha/linux/linux.hh"
+#include <sys/mman.h>
 
 // open(2) flags translation table
 SyscallFlagTransTable AlphaLinux::openFlagTable[] = {
@@ -99,3 +100,28 @@
 
 const int AlphaLinux::NUM_OPEN_FLAGS =
     (sizeof(AlphaLinux::openFlagTable)/sizeof(AlphaLinux::openFlagTable[0]));
+
+// mmap(2) flags translation table
+SyscallFlagTransTable AlphaLinux::mmapFlagTable[] = {
+  { AlphaLinux::TGT_MAP_SHARED,     MAP_SHARED },
+  { AlphaLinux::TGT_MAP_PRIVATE,    MAP_PRIVATE },
+  { AlphaLinux::TGT_MAP_ANON,       MAP_ANON },
+  { AlphaLinux::TGT_MAP_DENYWRITE,  MAP_DENYWRITE },
+  { AlphaLinux::TGT_MAP_EXECUTABLE, MAP_EXECUTABLE },
+  { AlphaLinux::TGT_MAP_FILE,       MAP_FILE },
+  { AlphaLinux::TGT_MAP_GROWSDOWN,  MAP_GROWSDOWN },
+  { AlphaLinux::TGT_MAP_HUGETLB,    MAP_HUGETLB },
+  { AlphaLinux::TGT_MAP_LOCKED,     MAP_LOCKED },
+  { AlphaLinux::TGT_MAP_NONBLOCK,   MAP_NONBLOCK },
+  { AlphaLinux::TGT_MAP_NORESERVE,  MAP_NORESERVE },
+  { AlphaLinux::TGT_MAP_POPULATE,   MAP_POPULATE },
+#ifdef MAP_STACK
+  { AlphaLinux::TGT_MAP_STACK,      MAP_STACK },
+#endif
+  { AlphaLinux::TGT_MAP_ANONYMOUS,  MAP_ANONYMOUS },
+  { AlphaLinux::TGT_MAP_FIXED,      MAP_FIXED },
+};
+
+const unsigned AlphaLinux::NUM_MMAP_FLAGS =
+        sizeof(AlphaLinux::mmapFlagTable) /
+        sizeof(AlphaLinux::mmapFlagTable[0]);
diff -r 654272b82e94 -r 5ac090acd180 src/arch/alpha/linux/linux.hh
--- a/src/arch/alpha/linux/linux.hh     Thu Mar 17 10:22:39 2016 -0700
+++ b/src/arch/alpha/linux/linux.hh     Thu Mar 17 10:24:17 2016 -0700
@@ -104,8 +104,25 @@
     //@}
 
     /// For mmap().
-    static const unsigned TGT_MAP_ANONYMOUS = 0x10;
-    static const unsigned TGT_MAP_FIXED     = 0x100;
+    static SyscallFlagTransTable mmapFlagTable[];
+
+    static const unsigned TGT_MAP_SHARED        = 0x000001;
+    static const unsigned TGT_MAP_PRIVATE       = 0x000002;
+    static const unsigned TGT_MAP_ANON          = 0x000010;
+    static const unsigned TGT_MAP_DENYWRITE     = 0x002000;
+    static const unsigned TGT_MAP_EXECUTABLE    = 0x004000;
+    static const unsigned TGT_MAP_FILE          = 0x000000;
+    static const unsigned TGT_MAP_GROWSDOWN     = 0x001000;
+    static const unsigned TGT_MAP_HUGETLB       = 0x100000;
+    static const unsigned TGT_MAP_LOCKED        = 0x008000;
+    static const unsigned TGT_MAP_NONBLOCK      = 0x040000;
+    static const unsigned TGT_MAP_NORESERVE     = 0x010000;
+    static const unsigned TGT_MAP_POPULATE      = 0x020000;
+    static const unsigned TGT_MAP_STACK         = 0x080000;
+    static const unsigned TGT_MAP_ANONYMOUS     = 0x000010;
+    static const unsigned TGT_MAP_FIXED         = 0x000100;
+
+    static const unsigned NUM_MMAP_FLAGS;
 
     //@{
     /// For getsysinfo().
diff -r 654272b82e94 -r 5ac090acd180 src/arch/alpha/tru64/tru64.cc
--- a/src/arch/alpha/tru64/tru64.cc     Thu Mar 17 10:22:39 2016 -0700
+++ b/src/arch/alpha/tru64/tru64.cc     Thu Mar 17 10:24:17 2016 -0700
@@ -68,5 +68,27 @@
 const int AlphaTru64::NUM_OPEN_FLAGS =
         
(sizeof(AlphaTru64::openFlagTable)/sizeof(AlphaTru64::openFlagTable[0]));
 
+// mmap(2) flags translation table
+SyscallFlagTransTable AlphaTru64::mmapFlagTable[] = {
+  { TGT_MAP_SHARED, MAP_SHARED },
+  { TGT_MAP_PRIVATE, MAP_PRIVATE },
+  { TGT_MAP_32BIT, MAP_32BIT},
+  { TGT_MAP_ANON, MAP_ANON },
+  { TGT_MAP_DENYWRITE, MAP_DENYWRITE },
+  { TGT_MAP_EXECUTABLE, MAP_EXECUTABLE },
+  { TGT_MAP_FILE, MAP_FILE },
+  { TGT_MAP_GROWSDOWN, MAP_GROWSDOWN },
+  { TGT_MAP_HUGETLB, MAP_HUGETLB },
+  { TGT_MAP_LOCKED, MAP_LOCKED },
+  { TGT_MAP_NONBLOCK, MAP_NONBLOCK },
+  { TGT_MAP_NORESERVE, MAP_NORESERVE },
+  { TGT_MAP_POPULATE, MAP_POPULATE },
+  { TGT_MAP_STACK, MAP_STACK },
+  { TGT_MAP_ANONYMOUS, MAP_ANONYMOUS },
+  { TGT_MAP_FIXED, MAP_FIXED },
+};
 
+const unsigned AlphaTru64::NUM_MMAP_FLAGS =
+        sizeof(AlphaTru64::mmapFlagTable) /
+        sizeof(AlphaTru64::mmapFlagTable[0]);
 
diff -r 654272b82e94 -r 5ac090acd180 src/arch/alpha/tru64/tru64.hh
--- a/src/arch/alpha/tru64/tru64.hh     Thu Mar 17 10:22:39 2016 -0700
+++ b/src/arch/alpha/tru64/tru64.hh     Thu Mar 17 10:24:17 2016 -0700
@@ -63,8 +63,28 @@
     //@}
 
     /// For mmap().
-    static const unsigned TGT_MAP_ANONYMOUS = 0x10;
-    static const unsigned TGT_MAP_FIXED     = 0x100;
+    static SyscallFlagTransTable mmapFlagTable[];
+
+    static const unsigned TGT_MAP_SHARED        = 0x00001;
+    static const unsigned TGT_MAP_PRIVATE       = 0x00002;
+    static const unsigned TGT_MAP_32BIT         = 0x00040;
+    static const unsigned TGT_MAP_ANON          = 0x00020;
+    static const unsigned TGT_MAP_DENYWRITE     = 0x00800;
+    static const unsigned TGT_MAP_EXECUTABLE    = 0x01000;
+    static const unsigned TGT_MAP_FILE          = 0x00000;
+    static const unsigned TGT_MAP_GROWSDOWN     = 0x00100;
+    static const unsigned TGT_MAP_HUGETLB       = 0x40000;
+    static const unsigned TGT_MAP_LOCKED        = 0x02000;
+    static const unsigned TGT_MAP_NONBLOCK      = 0x10000;
+    static const unsigned TGT_MAP_NORESERVE     = 0x04000;
+    static const unsigned TGT_MAP_POPULATE      = 0x08000;
+    static const unsigned TGT_MAP_STACK         = 0x20000;
+    static const unsigned TGT_MAP_ANONYMOUS     = 0x00020;
+    static const unsigned TGT_MAP_FIXED         = 0x00010;
+
+    static const unsigned NUM_MMAP_FLAGS;
+
+    //@{
 
     //@{
     /// For getsysinfo().
diff -r 654272b82e94 -r 5ac090acd180 src/arch/arm/freebsd/freebsd.hh
--- a/src/arch/arm/freebsd/freebsd.hh   Thu Mar 17 10:22:39 2016 -0700
+++ b/src/arch/arm/freebsd/freebsd.hh   Thu Mar 17 10:24:17 2016 -0700
@@ -74,6 +74,8 @@
     //@}
 
     /// For mmap().
+    static const unsigned TGT_MAP_SHARED    = 0x0001;
+    static const unsigned TGT_MAP_PRIVATE   = 0x0002;
     static const unsigned TGT_MAP_ANONYMOUS = 0x1000;
     static const unsigned TGT_MAP_FIXED     = 0x0010;
 
@@ -229,6 +231,8 @@
     //@}
 
     /// For mmap().
+    static const unsigned TGT_MAP_SHARED    = 0x0001;
+    static const unsigned TGT_MAP_PRIVATE   = 0x0002;
     static const unsigned TGT_MAP_ANONYMOUS = 0x1000;
     static const unsigned TGT_MAP_FIXED     = 0x0010;
 
diff -r 654272b82e94 -r 5ac090acd180 src/arch/arm/linux/linux.cc
--- a/src/arch/arm/linux/linux.cc       Thu Mar 17 10:22:39 2016 -0700
+++ b/src/arch/arm/linux/linux.cc       Thu Mar 17 10:24:17 2016 -0700
@@ -41,9 +41,10 @@
  * Authors: Stephen Hines
  */
 
+#include "arch/arm/linux/linux.hh"
+
 #include <fcntl.h>
-
-#include "arch/arm/linux/linux.hh"
+#include <sys/mman.h>
 
 // open(2) flags translation table
 SyscallFlagTransTable ArmLinux32::openFlagTable[] = {
@@ -121,6 +122,31 @@
 const int ArmLinux32::NUM_OPEN_FLAGS = sizeof(ArmLinux32::openFlagTable) /
                                        sizeof(ArmLinux32::openFlagTable[0]);
 
+// mmap(2) flags translation table
+SyscallFlagTransTable ArmLinux32::mmapFlagTable[] = {
+  { ArmLinux32::TGT_MAP_SHARED,     MAP_SHARED },
+  { ArmLinux32::TGT_MAP_PRIVATE,    MAP_PRIVATE },
+  { ArmLinux32::TGT_MAP_ANON,       MAP_ANON },
+  { ArmLinux32::TGT_MAP_DENYWRITE,  MAP_DENYWRITE },
+  { ArmLinux32::TGT_MAP_EXECUTABLE, MAP_EXECUTABLE },
+  { ArmLinux32::TGT_MAP_FILE,       MAP_FILE },
+  { ArmLinux32::TGT_MAP_GROWSDOWN,  MAP_GROWSDOWN },
+  { ArmLinux32::TGT_MAP_HUGETLB,    MAP_HUGETLB },
+  { ArmLinux32::TGT_MAP_LOCKED,     MAP_LOCKED },
+  { ArmLinux32::TGT_MAP_NONBLOCK,   MAP_NONBLOCK },
+  { ArmLinux32::TGT_MAP_NORESERVE,  MAP_NORESERVE },
+  { ArmLinux32::TGT_MAP_POPULATE,   MAP_POPULATE },
+#ifdef MAP_STACK
+  { ArmLinux32::TGT_MAP_STACK,      MAP_STACK },
+#endif
+  { ArmLinux32::TGT_MAP_ANONYMOUS,  MAP_ANONYMOUS },
+  { ArmLinux32::TGT_MAP_FIXED,      MAP_FIXED },
+};
+
+const unsigned ArmLinux32::NUM_MMAP_FLAGS =
+        sizeof(ArmLinux32::mmapFlagTable) /
+        sizeof(ArmLinux32::mmapFlagTable[0]);
+
 // open(2) flags translation table
 SyscallFlagTransTable ArmLinux64::openFlagTable[] = {
 #ifdef _MSC_VER
@@ -197,3 +223,28 @@
 const int ArmLinux64::NUM_OPEN_FLAGS = sizeof(ArmLinux64::openFlagTable) /
                                        sizeof(ArmLinux64::openFlagTable[0]);
 
+// mmap(2) flags translation table
+SyscallFlagTransTable ArmLinux64::mmapFlagTable[] = {
+  { ArmLinux64::TGT_MAP_SHARED,     MAP_SHARED },
+  { ArmLinux64::TGT_MAP_PRIVATE,    MAP_PRIVATE },
+  { ArmLinux64::TGT_MAP_ANON,       MAP_ANON },
+  { ArmLinux64::TGT_MAP_DENYWRITE,  MAP_DENYWRITE },
+  { ArmLinux64::TGT_MAP_EXECUTABLE, MAP_EXECUTABLE },
+  { ArmLinux64::TGT_MAP_FILE,       MAP_FILE },
+  { ArmLinux64::TGT_MAP_GROWSDOWN,  MAP_GROWSDOWN },
+  { ArmLinux64::TGT_MAP_HUGETLB,    MAP_HUGETLB },
+  { ArmLinux64::TGT_MAP_LOCKED,     MAP_LOCKED },
+  { ArmLinux64::TGT_MAP_NONBLOCK,   MAP_NONBLOCK },
+  { ArmLinux64::TGT_MAP_NORESERVE,  MAP_NORESERVE },
+  { ArmLinux64::TGT_MAP_POPULATE,   MAP_POPULATE },
+#ifdef MAP_STACK
+  { ArmLinux64::TGT_MAP_STACK,      MAP_STACK },
+#endif
+  { ArmLinux64::TGT_MAP_ANONYMOUS,  MAP_ANONYMOUS },
+  { ArmLinux64::TGT_MAP_FIXED,      MAP_FIXED },
+};
+
+const unsigned ArmLinux64::NUM_MMAP_FLAGS =
+        sizeof(ArmLinux64::mmapFlagTable) /
+        sizeof(ArmLinux64::mmapFlagTable[0]);
+
diff -r 654272b82e94 -r 5ac090acd180 src/arch/arm/linux/linux.hh
--- a/src/arch/arm/linux/linux.hh       Thu Mar 17 10:22:39 2016 -0700
+++ b/src/arch/arm/linux/linux.hh       Thu Mar 17 10:24:17 2016 -0700
@@ -125,8 +125,25 @@
     //@}
 
     /// For mmap().
-    static const unsigned TGT_MAP_ANONYMOUS = 0x20;
-    static const unsigned TGT_MAP_FIXED     = 0x10;
+    static SyscallFlagTransTable mmapFlagTable[];
+
+    static const unsigned TGT_MAP_SHARED        = 0x00001;
+    static const unsigned TGT_MAP_PRIVATE       = 0x00002;
+    static const unsigned TGT_MAP_ANON          = 0x00020;
+    static const unsigned TGT_MAP_DENYWRITE     = 0x00800;
+    static const unsigned TGT_MAP_EXECUTABLE    = 0x01000;
+    static const unsigned TGT_MAP_FILE          = 0x00000;
+    static const unsigned TGT_MAP_GROWSDOWN     = 0x00100;
+    static const unsigned TGT_MAP_HUGETLB       = 0x40000;
+    static const unsigned TGT_MAP_LOCKED        = 0x02000;
+    static const unsigned TGT_MAP_NONBLOCK      = 0x10000;
+    static const unsigned TGT_MAP_NORESERVE     = 0x04000;
+    static const unsigned TGT_MAP_POPULATE      = 0x08000;
+    static const unsigned TGT_MAP_STACK         = 0x20000;
+    static const unsigned TGT_MAP_ANONYMOUS     = 0x00020;
+    static const unsigned TGT_MAP_FIXED         = 0x00010;
+
+    static const unsigned NUM_MMAP_FLAGS;
 
     /// For table().
     static const int TBL_SYSINFO = 12;
@@ -320,8 +337,25 @@
     //@}
 
     /// For mmap().
-    static const unsigned TGT_MAP_ANONYMOUS = 0x20;
-    static const unsigned TGT_MAP_FIXED     = 0x10;
+    static SyscallFlagTransTable mmapFlagTable[];
+
+    static const unsigned TGT_MAP_SHARED        = 0x00001;
+    static const unsigned TGT_MAP_PRIVATE       = 0x00002;
+    static const unsigned TGT_MAP_ANON          = 0x00020;
+    static const unsigned TGT_MAP_DENYWRITE     = 0x00800;
+    static const unsigned TGT_MAP_EXECUTABLE    = 0x01000;
+    static const unsigned TGT_MAP_FILE          = 0x00000;
+    static const unsigned TGT_MAP_GROWSDOWN     = 0x00100;
+    static const unsigned TGT_MAP_HUGETLB       = 0x40000;
+    static const unsigned TGT_MAP_LOCKED        = 0x02000;
+    static const unsigned TGT_MAP_NONBLOCK      = 0x10000;
+    static const unsigned TGT_MAP_NORESERVE     = 0x04000;
+    static const unsigned TGT_MAP_POPULATE      = 0x08000;
+    static const unsigned TGT_MAP_STACK         = 0x20000;
+    static const unsigned TGT_MAP_ANONYMOUS     = 0x00020;
+    static const unsigned TGT_MAP_FIXED         = 0x00010;
+
+    static const unsigned NUM_MMAP_FLAGS;
 
     //@{
     /// For getrusage().
diff -r 654272b82e94 -r 5ac090acd180 src/arch/mips/linux/linux.cc
--- a/src/arch/mips/linux/linux.cc      Thu Mar 17 10:22:39 2016 -0700
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to