syscall: Zero out memory that already exists during the brk system call.

Glibc often assumes that memory it receives from the kernel after a brk
system call will contain only zeros. This is important during a calloc,
because it won't clear the new memory itself. In the simulator, if the
new page exists, it will be cleared using this patch, to mimic the kernel's
functionality.
This commit is contained in:
Timothy M. Jones 2009-10-24 10:53:58 -07:00
parent cc21f862e2
commit 03da1e53c2

View file

@ -144,6 +144,24 @@ brkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
if (!p->pTable->translate(gen.addr()))
p->pTable->allocate(roundDown(gen.addr(), VMPageSize),
VMPageSize);
// if the address is already there, zero it out
else {
uint8_t zero = 0;
TranslatingPort *tp = tc->getMemPort();
// split non-page aligned accesses
Addr next_page = roundUp(gen.addr(), VMPageSize);
uint32_t size_needed = next_page - gen.addr();
tp->memsetBlob(gen.addr(), zero, size_needed);
if (gen.addr() + VMPageSize > next_page &&
next_page < new_brk &&
p->pTable->translate(next_page))
{
size_needed = VMPageSize - size_needed;
tp->memsetBlob(next_page, zero, size_needed);
}
}
}
}