Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/usermode Let NetBSD/usermode build & link on a Linu...



details:   https://anonhg.NetBSD.org/src/rev/ea88436c14ca
branches:  trunk
changeset: 769218:ea88436c14ca
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sat Sep 03 18:42:13 2011 +0000

description:
Let NetBSD/usermode build & link on a Linux host:
 - Need to add options CPU_HOST=i386 or CPU_HOST=amd64 for membar & atomic_ops
 - Don't use MAP_* and PROT_* with thunk API since the kernel and host
   might not be the same; add THUNK_MAP_* and THUNK_PROT_* and translate them
 - Add thunk_posix_memalign
 - allocate mem_uvm with thunk_posix_memalign instead of thunk_malloc
 - Fix thunk_mmap callers to always pass either THUNK_MAP_PRIVATE or
   THUNK_MAP_SHARED
 - mkstemp on Linux requires exactly 6 "X" characters at the end of the
   template string, so add an X

diffstat:

 sys/arch/usermode/conf/Makefile.usermode |  20 +++++++--
 sys/arch/usermode/conf/files.usermode    |   3 +-
 sys/arch/usermode/include/thunk.h        |  15 ++++++-
 sys/arch/usermode/usermode/pmap.c        |  52 +++++++++++++------------
 sys/arch/usermode/usermode/thunk.c       |  66 ++++++++++++++++++++++++++++++-
 5 files changed, 119 insertions(+), 37 deletions(-)

diffs (truncated from 368 to 300 lines):

diff -r 2ed85036053f -r ea88436c14ca sys/arch/usermode/conf/Makefile.usermode
--- a/sys/arch/usermode/conf/Makefile.usermode  Sat Sep 03 16:21:18 2011 +0000
+++ b/sys/arch/usermode/conf/Makefile.usermode  Sat Sep 03 18:42:13 2011 +0000
@@ -1,6 +1,11 @@
-# $NetBSD: Makefile.usermode,v 1.17 2011/09/03 15:00:27 jmcneill Exp $
+# $NetBSD: Makefile.usermode,v 1.18 2011/09/03 18:42:13 jmcneill Exp $
 
+OPT_CPU_HOST=                  %CPU_HOST%
+.if !empty(OPT_CPU_HOST)
+MACHINE_ARCH=                  ${OPT_CPU_HOST}
+.else
 MACHINE_ARCH=                  usermode
+.endif
 USETOOLS?=                     no
 NEED_OWN_INSTALL_TARGET?=      no
 .include <bsd.own.mk>
@@ -15,12 +20,17 @@
 ## (2) compile settings
 ##
 USERMODE_HOSTOS!=uname -s
+USERMODE_HOSTMACHINE!=uname -m
 USERMODE_LIBS= -lrt
+USERMODE_CPPFLAGS=-U_KERNEL -I/usr/include
+USERMODE_CPPFLAGS+=${CWARNFLAGS} ${NOGCCERROR:D:U-Werror}
+
 .if ${USERMODE_HOSTOS} == "Linux"
 USERMODE_LIBS+=        -lpthread
+CPPFLAGS+=-Dstrtoul=netbsd_strtoul
+CPPFLAGS+=-Dstrtoll=netbsd_strtoll
+CPPFLAGS+=-Dstrtoull=netbsd_strtoull
 .endif
-USERMODE_CPPFLAGS=-U_KERNEL -I/usr/include
-USERMODE_CPPFLAGS+=${CWARNFLAGS} ${NOGCCERROR:D:U-Werror}
 
 DEFCOPTS=      -fno-omit-frame-pointer
 CPPFLAGS+=     -Dusermode -D__NetBSD__ -Wno-unused-but-set-variable
@@ -42,8 +52,8 @@
 ##
 ## (3) libkern and compat
 ##
-KERN_AS=       obj
-COMPAT_AS=     obj
+KERN_AS=       library
+COMPAT_AS=     library
 
 ##
 ## (4) local objects, compile rules, and dependencies
diff -r 2ed85036053f -r ea88436c14ca sys/arch/usermode/conf/files.usermode
--- a/sys/arch/usermode/conf/files.usermode     Sat Sep 03 16:21:18 2011 +0000
+++ b/sys/arch/usermode/conf/files.usermode     Sat Sep 03 18:42:13 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: files.usermode,v 1.8 2011/09/03 12:28:45 jmcneill Exp $
+# $NetBSD: files.usermode,v 1.9 2011/09/03 18:42:13 jmcneill Exp $
 
 maxpartitions 8
 maxusers 8 16 64
@@ -6,6 +6,7 @@
 defparam opt_memsize.h                         MEMSIZE
 defflag opt_sdl.h                              SDL
 defflag opt_cpu.h                              CPU_DEBUG
+defparam opt_cpu.h                             CPU_HOST
 defflag opt_urkelvisor.h                       URKELVISOR
 
 define thunkbus { }
diff -r 2ed85036053f -r ea88436c14ca sys/arch/usermode/include/thunk.h
--- a/sys/arch/usermode/include/thunk.h Sat Sep 03 16:21:18 2011 +0000
+++ b/sys/arch/usermode/include/thunk.h Sat Sep 03 18:42:13 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: thunk.h,v 1.24 2011/09/03 15:00:28 jmcneill Exp $ */
+/* $NetBSD: thunk.h,v 1.25 2011/09/03 18:42:13 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -35,7 +35,6 @@
 #include <sys/fcntl.h>
 #include <sys/ucontext.h>
 #include <sys/signal.h>
-#include <sys/mman.h>
 
 struct thunk_timeval {
        int64_t tv_sec;
@@ -57,6 +56,17 @@
        int32_t c_ospeed;
 };
 
+#define THUNK_MAP_ANON         0x0001
+#define THUNK_MAP_FIXED                0x0002
+#define THUNK_MAP_FILE         0x0004
+#define THUNK_MAP_SHARED       0x0010
+#define THUNK_MAP_PRIVATE      0x0020
+
+#define THUNK_PROT_NONE                0x00
+#define THUNK_PROT_READ                0x01
+#define THUNK_PROT_WRITE       0x02
+#define THUNK_PROT_EXEC                0x04
+
 struct aiocb;
 
 int    thunk_setitimer(int, const struct thunk_itimerval *, struct thunk_itimerval *);
@@ -108,6 +118,7 @@
 void * thunk_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
 int    thunk_munmap(void *addr, size_t len);
 int    thunk_mprotect(void *addr, size_t len, int prot);
+int    thunk_posix_memalign(void **, size_t, size_t);
 
 char * thunk_getenv(const char *);
 
diff -r 2ed85036053f -r ea88436c14ca sys/arch/usermode/usermode/pmap.c
--- a/sys/arch/usermode/usermode/pmap.c Sat Sep 03 16:21:18 2011 +0000
+++ b/sys/arch/usermode/usermode/pmap.c Sat Sep 03 18:42:13 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.52 2011/09/03 12:33:03 jmcneill Exp $ */
+/* $NetBSD: pmap.c,v 1.53 2011/09/03 18:42:13 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Reinoud Zandijk <reinoud%NetBSD.org@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.52 2011/09/03 12:33:03 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.53 2011/09/03 18:42:13 jmcneill Exp $");
 
 #include "opt_memsize.h"
 #include "opt_kmempages.h"
@@ -145,7 +145,9 @@
 
        /* claim memory with 2 pages more */
        uvm_len = kmem_len + barrier_len + user_len + barrier_len + 2*PAGE_SIZE;
-       mem_uvm = thunk_malloc(uvm_len);
+       err = thunk_posix_memalign(&mem_uvm, PAGE_SIZE, uvm_len);
+       if (err)
+               panic("pmap_bootstrap: couldn't allocate uvm memory");
        /* make page aligned */
        mpos = round_page((vaddr_t) mem_uvm);// + PAGE_SIZE;
        if (!((void *) mpos >= mem_uvm))
@@ -172,11 +174,11 @@
        /* protect complete UVM area (---) */
        addr = thunk_mmap((void*) mem_uvm,
                uvm_len,
-               PROT_NONE,
-               MAP_ANON | MAP_FIXED,
+               THUNK_PROT_NONE,
+               THUNK_MAP_ANON | THUNK_MAP_FIXED | THUNK_MAP_PRIVATE,
                -1, 0);
        if (addr != (void *) mem_uvm)
-               panic("pmap_bootstrap: uvm space protection barrier failed\n");
+               panic("pmap_bootstrap: uvm space protection barrier failed (%p)\n", (void *)addr);
 #endif
 
        aprint_debug("\nMemory summary\n");
@@ -191,7 +193,7 @@
        aprint_debug("Creating memory mapped backend\n");
 
        /* create memory file since mmap/maccess only can be on files */
-       strlcpy(mem_name, "/tmp/netbsd.XXXXX", sizeof(mem_name));
+       strlcpy(mem_name, "/tmp/netbsd.XXXXXX", sizeof(mem_name));
        mem_fh = thunk_mkstemp(mem_name);
        if (mem_fh < 0)
                panic("pmap_bootstrap: can't create memory file\n");
@@ -208,7 +210,7 @@
        /* protect the current kernel section */
        /* XXX kernel stack? */
        err = thunk_mprotect((void *) kmem_k_start, kmem_k_end - kmem_k_start,
-               PROT_READ | PROT_EXEC);
+               THUNK_PROT_READ | THUNK_PROT_EXEC);
        assert(err == 0);
 
        /* set up pv_table; bootstrap problem! */
@@ -227,8 +229,8 @@
        pv_fpos = fpos;
        pv_table = (struct pv_entry *) kmem_ext_cur_start;
        addr = thunk_mmap(pv_table, pv_table_size,
-               PROT_READ | PROT_WRITE,
-               MAP_FILE | MAP_FIXED,
+               THUNK_PROT_READ | THUNK_PROT_WRITE,
+               THUNK_MAP_FILE | THUNK_MAP_FIXED | THUNK_MAP_SHARED,
                mem_fh, pv_fpos);
        if (addr != (void *) kmem_ext_start)
                panic("pmap_bootstrap: can't map in pv table\n");
@@ -255,8 +257,8 @@
 
        pm_fpos = fpos;
        addr = thunk_mmap(pmap->pm_entries, pm_entries_size,
-               PROT_READ | PROT_WRITE,
-               MAP_FILE | MAP_FIXED,
+               THUNK_PROT_READ | THUNK_PROT_WRITE,
+               THUNK_MAP_FILE | THUNK_MAP_FIXED | THUNK_MAP_SHARED,
                mem_fh, pm_fpos);
        if (addr != (void *) pmap->pm_entries)
                panic("pmap_bootstrap: can't map in pmap entries\n");
@@ -481,11 +483,11 @@
        /* determine pmap access type (mmap doesnt need to be 1:1 on VM_PROT_) */
        prot = pv->pv_prot;
        cur_prot = VM_PROT_NONE;
-       if (pv->pv_mmap_ppl & PROT_READ)
+       if (pv->pv_mmap_ppl & THUNK_PROT_READ)
                cur_prot |= VM_PROT_READ;
-       if (pv->pv_mmap_ppl & PROT_WRITE)
+       if (pv->pv_mmap_ppl & THUNK_PROT_WRITE)
                cur_prot |= VM_PROT_WRITE;
-       if (pv->pv_mmap_ppl & PROT_EXEC)
+       if (pv->pv_mmap_ppl & THUNK_PROT_EXEC)
                cur_prot |= VM_PROT_EXECUTE;
 
        diff = prot & (prot ^ cur_prot);
@@ -543,7 +545,7 @@
        void *addr;
 
        addr = thunk_mmap((void *) va, PAGE_SIZE, pv->pv_mmap_ppl,
-               MAP_FILE | MAP_FIXED | MAP_SHARED,
+               THUNK_MAP_FILE | THUNK_MAP_FIXED | THUNK_MAP_SHARED,
                mem_fh, pa);
        aprint_debug("page_activate: (va %p, pa %p, ppl %d) -> %p\n",
                (void *) va, (void *) pa, pv->pv_mmap_ppl, (void *) addr);
@@ -558,8 +560,8 @@
        vaddr_t va = pv->pv_lpn * PAGE_SIZE + VM_MIN_ADDRESS; /* L->V */
        void *addr;
 
-       addr = thunk_mmap((void *) va, PAGE_SIZE, PROT_NONE,
-               MAP_FILE | MAP_FIXED | MAP_SHARED,
+       addr = thunk_mmap((void *) va, PAGE_SIZE, THUNK_PROT_NONE,
+               THUNK_MAP_FILE | THUNK_MAP_FIXED | THUNK_MAP_SHARED,
                mem_fh, pa);
        aprint_debug("page_deactivate: (va %p, pa %p, ppl %d) -> %p\n",
                (void *) va, (void *) pa, pv->pv_mmap_ppl, (void *) addr);
@@ -577,23 +579,23 @@
        pflags = pv_table[pv->pv_ppn].pv_pflags;
        vflags = pv_table[pv->pv_ppn].pv_vflags;
 
-       KASSERT(PROT_READ == VM_PROT_READ);
-       KASSERT(PROT_WRITE == VM_PROT_WRITE);
-       KASSERT(PROT_EXEC == VM_PROT_EXECUTE);
+       KASSERT(THUNK_PROT_READ == VM_PROT_READ);
+       KASSERT(THUNK_PROT_WRITE == VM_PROT_WRITE);
+       KASSERT(THUNK_PROT_EXEC == VM_PROT_EXECUTE);
 
        /* create referenced/modified emulation */
        if ((pv->pv_prot & VM_PROT_WRITE) &&
            (pflags & PV_REFERENCED) && (pflags & PV_MODIFIED))
-               mmap_ppl = PROT_READ | PROT_WRITE;
+               mmap_ppl = THUNK_PROT_READ | THUNK_PROT_WRITE;
        else if ((pv->pv_prot & (VM_PROT_READ | VM_PROT_EXECUTE)) &&
                 (pflags & PV_REFERENCED))
-               mmap_ppl = PROT_READ;
+               mmap_ppl = THUNK_PROT_READ;
        else
-               mmap_ppl = PROT_NONE;
+               mmap_ppl = THUNK_PROT_NONE;
 
        /* unmanaged pages are special; they dont track r/m */
        if (vflags & PV_UNMANAGED)
-               mmap_ppl = PROT_READ | PROT_WRITE;
+               mmap_ppl = THUNK_PROT_READ | THUNK_PROT_WRITE;
 
        pv->pv_mmap_ppl = mmap_ppl;
 }
diff -r 2ed85036053f -r ea88436c14ca sys/arch/usermode/usermode/thunk.c
--- a/sys/arch/usermode/usermode/thunk.c        Sat Sep 03 16:21:18 2011 +0000
+++ b/sys/arch/usermode/usermode/thunk.c        Sat Sep 03 18:42:13 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: thunk.c,v 1.27 2011/09/03 15:00:28 jmcneill Exp $ */
+/* $NetBSD: thunk.c,v 1.28 2011/09/03 18:42:13 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -28,10 +28,11 @@
 
 #include <sys/cdefs.h>
 #ifdef __NetBSD__
-__RCSID("$NetBSD: thunk.c,v 1.27 2011/09/03 15:00:28 jmcneill Exp $");
+__RCSID("$NetBSD: thunk.c,v 1.28 2011/09/03 18:42:13 jmcneill Exp $");
 #endif
 
 #include <sys/types.h>
+#include <sys/mman.h>
 
 #include <aio.h>
 #include <assert.h>
@@ -53,6 +54,10 @@
 #define __arraycount(x)        (sizeof((x)) / sizeof((x)[0]))
 #endif
 
+#ifndef MAP_ANON
+#define MAP_ANON MAP_ANONYMOUS
+#endif
+
 static void
 thunk_to_timeval(const struct thunk_timeval *ttv, struct timeval *tv)
 {
@@ -111,6 +116,40 @@
        tt->c_ospeed= t->c_ospeed;
 }
 
+static int
+thunk_to_native_prot(int prot)
+{
+       int nprot = PROT_NONE;
+
+       if (prot & THUNK_PROT_READ)



Home | Main Index | Thread Index | Old Index