linux emu - iron out bugs
authorAlex Hornung <ahornung@gmail.com>
Mon, 15 Mar 2010 19:08:42 +0000 (19:08 +0000)
committerAlex Hornung <ahornung@gmail.com>
Mon, 15 Mar 2010 19:20:14 +0000 (19:20 +0000)
* mmap: make sure that PROT_READ is not set if PROT_NONE is specified.

* sysinfo: Updata sysinfo to the new structure used since linux
  2.3.something.

sys/emulation/linux/i386/linux_machdep.c
sys/emulation/linux/linux_misc.c

index c3b5259..a02cd51 100644 (file)
@@ -699,7 +699,11 @@ linux_mmap_common(caddr_t linux_addr, size_t linux_len, int linux_prot,
                len = linux_len;
        }
 
-       prot = linux_prot | PROT_READ;
+       prot = linux_prot;
+
+       if (prot & (PROT_READ | PROT_WRITE | PROT_EXEC))
+               prot |= PROT_READ | PROT_EXEC;
+
        if (linux_flags & LINUX_MAP_ANON) {
                fd = -1;
        } else {
index 124d840..a66c572 100644 (file)
@@ -107,7 +107,11 @@ struct l_sysinfo {
        l_ulong         totalswap;      /* Total swap space size */
        l_ulong         freeswap;       /* swap space still available */
        l_ushort        procs;          /* Number of current processes */
-       char            _f[22];         /* Pads structure to 64 bytes */
+       l_ushort        pad;            /* explicit padding */
+       l_ulong         totalhigh;      /* Total high memory size */
+       l_ulong         freehigh;       /* Available high memory size */
+       l_uint          mem_unit;       /* Memory unit size in bytes */
+       char            _f[20-2*sizeof(l_long)-sizeof(l_int)]; /* Padding for libc5 */
 };
 
 int
@@ -174,7 +178,10 @@ sys_linux_sysinfo(struct linux_sysinfo_args *args)
        }
        rel_mplock();
 
-       sysinfo.procs = 20; /* Hack */
+       sysinfo.procs = nprocs;
+       sysinfo.totalhigh = 0;
+       sysinfo.freehigh = 0;
+       sysinfo.mem_unit = 1; /* Set the basic mem unit to 1 */
 
        error = copyout(&sysinfo, (caddr_t)args->info, sizeof(sysinfo));
        return (error);