syscall_emul: fix bugs for mmap2 system call and x86-32 syscalls
This commit is contained in:
parent
9d8fec0d90
commit
7eaa5952f9
3 changed files with 23 additions and 7 deletions
|
@ -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>),
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue