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