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/alpha/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/alpha/linux/linux.cc')
-rw-r--r-- | src/arch/alpha/linux/linux.cc | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/src/arch/alpha/linux/linux.cc b/src/arch/alpha/linux/linux.cc index b86b92c2e..7b747f127 100644 --- a/src/arch/alpha/linux/linux.cc +++ b/src/arch/alpha/linux/linux.cc @@ -28,10 +28,11 @@ * Authors: Korey Sewell */ -#include <fcntl.h> - #include "arch/alpha/linux/linux.hh" +#include <fcntl.h> +#include <sys/mman.h> + // open(2) flags translation table SyscallFlagTransTable AlphaLinux::openFlagTable[] = { #ifdef _MSC_VER @@ -99,3 +100,28 @@ SyscallFlagTransTable AlphaLinux::openFlagTable[] = { 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]); |