Build an explicit argument structure for mmap instead of relying on
the stack layout.
diff --git a/memory/virtual.c b/memory/virtual.c
index 1ecbfb6..d41c24a 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -753,13 +753,31 @@
if (!offset_high && (offset_low & page_mask))
{
int ret;
+
+ struct
+ {
+ void *addr;
+ unsigned int length;
+ unsigned int prot;
+ unsigned int flags;
+ unsigned int fd;
+ unsigned int offset;
+ } args;
+
+ args.addr = addr;
+ args.length = length;
+ args.prot = prot;
+ args.flags = flags;
+ args.fd = fd;
+ args.offset = offset_low;
+
__asm__ __volatile__("push %%ebx\n\t"
"movl %2,%%ebx\n\t"
"int $0x80\n\t"
"popl %%ebx"
: "=a" (ret)
: "0" (90), /* SYS_mmap */
- "g" (&addr) );
+ "g" (&args) );
if (ret < 0 && ret > -4096)
{
errno = -ret;