diff options
author | Brandon Potter <brandon.potter@amd.com> | 2016-03-17 10:24:17 -0700 |
---|---|---|
committer | Brandon Potter <brandon.potter@amd.com> | 2016-03-17 10:24:17 -0700 |
commit | a04fac976f02377237bb827d46854b669ebc2397 (patch) | |
tree | 2f2a5e55e16b2c05e4d94e302081bb977e864a36 /src/arch/arm/linux/linux.cc | |
parent | 3fa311e5acd58ce720014dd964728c2fa414ca6a (diff) | |
download | gem5-a04fac976f02377237bb827d46854b669ebc2397.tar.xz |
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 (limited to 'src/arch/arm/linux/linux.cc')
-rw-r--r-- | src/arch/arm/linux/linux.cc | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/src/arch/arm/linux/linux.cc b/src/arch/arm/linux/linux.cc index ac114048a..3dde8c217 100644 --- a/src/arch/arm/linux/linux.cc +++ b/src/arch/arm/linux/linux.cc @@ -41,10 +41,11 @@ * Authors: Stephen Hines */ -#include <fcntl.h> - #include "arch/arm/linux/linux.hh" +#include <fcntl.h> +#include <sys/mman.h> + // open(2) flags translation table SyscallFlagTransTable ArmLinux32::openFlagTable[] = { #ifdef _MSC_VER @@ -121,6 +122,31 @@ SyscallFlagTransTable ArmLinux32::openFlagTable[] = { 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 @@ SyscallFlagTransTable ArmLinux64::openFlagTable[] = { 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]); + |