summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrandon Potter <brandon.potter@amd.com>2016-03-17 10:25:53 -0700
committerBrandon Potter <brandon.potter@amd.com>2016-03-17 10:25:53 -0700
commit7eaa5952f994c07a801fbef81f8097a5e9a5828f (patch)
tree11d40da8b09eb843e44a392b9bddbbb25fd6035d /src
parent9d8fec0d90c2121a092c04da74e3306069ab5270 (diff)
downloadgem5-7eaa5952f994c07a801fbef81f8097a5e9a5828f.tar.xz
syscall_emul: fix bugs for mmap2 system call and x86-32 syscalls
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86/linux/process.cc2
-rw-r--r--src/arch/x86/process.cc1
-rw-r--r--src/sim/syscall_emul.hh27
3 files changed, 23 insertions, 7 deletions
diff --git a/src/arch/x86/linux/process.cc b/src/arch/x86/linux/process.cc
index 9651f7436..665815c30 100644
--- a/src/arch/x86/linux/process.cc
+++ b/src/arch/x86/linux/process.cc
@@ -733,7 +733,7 @@ static SyscallDesc syscallDescs32[] = {
/* 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 --git a/src/arch/x86/process.cc b/src/arch/x86/process.cc
index 82a23027d..13cbf6edd 100644
--- a/src/arch/x86/process.cc
+++ b/src/arch/x86/process.cc
@@ -80,6 +80,7 @@ static const int ArgumentReg32[] = {
INTREG_EDX,
INTREG_ESI,
INTREG_EDI,
+ INTREG_EBP
};
static const int NumArgumentRegs32 = sizeof(ArgumentReg) / sizeof(const int);
diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh
index 34fbc6618..a859fbe43 100644
--- a/src/sim/syscall_emul.hh
+++ b/src/sim/syscall_emul.hh
@@ -1223,11 +1223,11 @@ writevFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
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 @@ mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
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 @@ mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
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