changeset dbbf54058f6f in /z/repo/gem5 details: http://repo.gem5.org/gem5?cmd=changeset;node=dbbf54058f6f description: syscall_emul: fix bugs for mmap2 system call and x86-32 syscalls
diffstat: src/arch/x86/linux/process.cc | 2 +- src/arch/x86/process.cc | 1 + src/sim/syscall_emul.hh | 27 +++++++++++++++++++++------ 3 files changed, 23 insertions(+), 7 deletions(-) diffs (76 lines): diff -r e3cbd2823210 -r dbbf54058f6f src/arch/x86/linux/process.cc --- a/src/arch/x86/linux/process.cc Thu Mar 17 10:25:11 2016 -0700 +++ b/src/arch/x86/linux/process.cc Thu Mar 17 10:25:53 2016 -0700 @@ -733,7 +733,7 @@ /* 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 -r e3cbd2823210 -r dbbf54058f6f src/arch/x86/process.cc --- a/src/arch/x86/process.cc Thu Mar 17 10:25:11 2016 -0700 +++ b/src/arch/x86/process.cc Thu Mar 17 10:25:53 2016 -0700 @@ -80,6 +80,7 @@ INTREG_EDX, INTREG_ESI, INTREG_EDI, + INTREG_EBP }; static const int NumArgumentRegs32 = sizeof(ArgumentReg) / sizeof(const int); diff -r e3cbd2823210 -r dbbf54058f6f src/sim/syscall_emul.hh --- a/src/sim/syscall_emul.hh Thu Mar 17 10:25:11 2016 -0700 +++ b/src/sim/syscall_emul.hh Thu Mar 17 10:25:53 2016 -0700 @@ -1223,11 +1223,11 @@ 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 @@ 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 @@ 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 _______________________________________________ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev