summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sim/syscall_emul.hh13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh
index 034a7043b..f793bc41f 100644
--- a/src/sim/syscall_emul.hh
+++ b/src/sim/syscall_emul.hh
@@ -831,12 +831,13 @@ mremapFunc(SyscallDesc *desc, int callnum, LiveProcess *process, ThreadContext *
provided_address = process->getSyscallArg(tc, index);
if ((start % TheISA::PageBytes != 0) ||
- (new_length % TheISA::PageBytes != 0) ||
(provided_address % TheISA::PageBytes != 0)) {
warn("mremap failing: arguments not page aligned");
return -EINVAL;
}
+ new_length = roundUp(new_length, TheISA::PageBytes);
+
if (new_length > old_length) {
if ((start + old_length) == process->mmap_end &&
(!use_provided_address || provided_address == start)) {
@@ -1213,7 +1214,7 @@ mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
index++; // int prot = p->getSyscallArg(tc, index);
int flags = p->getSyscallArg(tc, index);
int tgt_fd = p->getSyscallArg(tc, index);
- // int offset = p->getSyscallArg(tc, index);
+ int offset = p->getSyscallArg(tc, index);
if (length > 0x100000000ULL)
warn("mmap length argument %#x is unreasonably large.\n", length);
@@ -1234,11 +1235,13 @@ mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
}
}
+ length = roundUp(length, TheISA::PageBytes);
+
if ((start % TheISA::PageBytes) != 0 ||
- (length % TheISA::PageBytes) != 0) {
+ (offset % TheISA::PageBytes) != 0) {
warn("mmap failing: arguments not page-aligned: "
- "start 0x%x length 0x%x",
- start, length);
+ "start 0x%x offset 0x%x",
+ start, offset);
return -EINVAL;
}