Clean up mmapFunc.

sim/syscall_emul.hh:
    Clean up mmapFunc: args should be aligned and PageTable::allocate
    already handles multi-page allocations, so most of thw work done here
    was unnecessary (as far as I can tell).  I didn't test this beyond
    compiling though...

--HG--
extra : convert_revision : d79591a1cc58ea82ea911cc05e0970e81e1d2c60
This commit is contained in:
Steve Reinhardt 2006-04-10 20:02:36 -04:00
parent 59ab31cd80
commit cab1af2ee8

View file

@ -700,22 +700,25 @@ mmapFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
int flags = xc->getSyscallArg(3); int flags = xc->getSyscallArg(3);
// int fd = p->sim_fd(xc->getSyscallArg(4)); // int fd = p->sim_fd(xc->getSyscallArg(4));
// int offset = xc->getSyscallArg(5); // int offset = xc->getSyscallArg(5);
Addr junk;
if (start == 0) { if ((start % TheISA::VMPageSize) != 0 ||
// user didn't give an address... pick one from our "mmap region" (length % TheISA::VMPageSize) != 0) {
start = p->mmap_end; warn("mmap failing: arguments not page-aligned: "
for (ChunkGenerator gen(start, roundUp(length, TheISA::VMPageSize), TheISA::VMPageSize); !gen.done(); gen.next()) { "start 0x%x length 0x%x",
if (!p->pTable->translate(gen.addr(), junk)) start, length);
p->pTable->allocate(roundDown(gen.addr(), TheISA::VMPageSize), TheISA::VMPageSize); return -EINVAL;
}
p->mmap_end += roundUp(length, TheISA::VMPageSize);
if (p->nxm_start != 0) {
//If we have an nxm space, make sure we haven't colided
assert(p->mmap_end < p->nxm_start);
}
} }
if (start != 0) {
warn("mmap: ignoring suggested map address 0x%x, using 0x%x",
start, p->mmap_end);
}
// pick next address from our "mmap region"
start = p->mmap_end;
p->pTable->allocate(start, length);
p->mmap_end += length;
if (!(flags & OS::TGT_MAP_ANONYMOUS)) { if (!(flags & OS::TGT_MAP_ANONYMOUS)) {
warn("allowing mmap of file @ fd %d. " warn("allowing mmap of file @ fd %d. "
"This will break if not /dev/zero.", xc->getSyscallArg(4)); "This will break if not /dev/zero.", xc->getSyscallArg(4));