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;