syscall_emul: fix bugs for mmap2 system call and x86-32 syscalls

This commit is contained in:
Brandon Potter 2016-03-17 10:25:53 -07:00
parent 9d8fec0d90
commit 7eaa5952f9
3 changed files with 23 additions and 7 deletions

View file

@ -733,7 +733,7 @@ static SyscallDesc syscallDescs32[] = {
/* 189 */ SyscallDesc("putpmsg", unimplementedFunc), /* 189 */ SyscallDesc("putpmsg", unimplementedFunc),
/* 190 */ SyscallDesc("vfork", unimplementedFunc), /* 190 */ SyscallDesc("vfork", unimplementedFunc),
/* 191 */ SyscallDesc("ugetrlimit", ignoreFunc), /* 191 */ SyscallDesc("ugetrlimit", ignoreFunc),
/* 192 */ SyscallDesc("mmap2", mmapFunc<X86Linux32>), /* 192 */ SyscallDesc("mmap2", mmap2Func<X86Linux32>),
/* 193 */ SyscallDesc("truncate64", truncate64Func), /* 193 */ SyscallDesc("truncate64", truncate64Func),
/* 194 */ SyscallDesc("ftruncate64", ftruncate64Func), /* 194 */ SyscallDesc("ftruncate64", ftruncate64Func),
/* 195 */ SyscallDesc("stat64", stat64Func<X86Linux32>), /* 195 */ SyscallDesc("stat64", stat64Func<X86Linux32>),

View file

@ -80,6 +80,7 @@ static const int ArgumentReg32[] = {
INTREG_EDX, INTREG_EDX,
INTREG_ESI, INTREG_ESI,
INTREG_EDI, INTREG_EDI,
INTREG_EBP
}; };
static const int NumArgumentRegs32 = sizeof(ArgumentReg) / sizeof(const int); static const int NumArgumentRegs32 = sizeof(ArgumentReg) / sizeof(const int);

View file

@ -1223,11 +1223,11 @@ writevFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
return result; return result;
} }
/// Real mmap handler.
/// Target mmap() handler.
template <class OS> template <class OS>
SyscallReturn 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; int index = 0;
Addr start = p->getSyscallArg(tc, index); 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 tgt_fd = p->getSyscallArg(tc, index);
int offset = p->getSyscallArg(tc, index); int offset = p->getSyscallArg(tc, index);
DPRINTF_SYSCALL(Verbose, "mmap(0x%x, len %d, prot %d, flags %d, fd %d, " if (is_mmap2)
"offs %d)\n", start, length, prot, tgt_flags, tgt_fd, offset *= TheISA::PageBytes;
offset);
if (start & (TheISA::PageBytes - 1) || if (start & (TheISA::PageBytes - 1) ||
offset & (TheISA::PageBytes - 1) || offset & (TheISA::PageBytes - 1) ||
@ -1363,6 +1362,22 @@ mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
return start; 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. /// Target getrlimit() handler.
template <class OS> template <class OS>
SyscallReturn SyscallReturn