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