Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/usermode Implement in-place execution for binaries!...



details:   https://anonhg.NetBSD.org/src/rev/e3ae975a43e7
branches:  trunk
changeset: 769570:e3ae975a43e7
user:      reinoud <reinoud%NetBSD.org@localhost>
date:      Wed Sep 14 18:28:36 2011 +0000

description:
Implement in-place execution for binaries! No more MKPIE/MKPIC for userland
anymore!

diffstat:

 sys/arch/usermode/conf/GENERIC           |   20 +++--
 sys/arch/usermode/conf/Makefile.usermode |   15 ++-
 sys/arch/usermode/usermode/machdep.c     |    7 +-
 sys/arch/usermode/usermode/pmap.c        |  117 +++++++++++++++++-------------
 4 files changed, 92 insertions(+), 67 deletions(-)

diffs (truncated from 323 to 300 lines):

diff -r 11ebc4d01c65 -r e3ae975a43e7 sys/arch/usermode/conf/GENERIC
--- a/sys/arch/usermode/conf/GENERIC    Wed Sep 14 18:26:24 2011 +0000
+++ b/sys/arch/usermode/conf/GENERIC    Wed Sep 14 18:28:36 2011 +0000
@@ -1,15 +1,15 @@
-# $NetBSD: GENERIC,v 1.15 2011/08/31 12:42:41 reinoud Exp $
+# $NetBSD: GENERIC,v 1.16 2011/09/14 18:28:36 reinoud Exp $
 
 include "arch/usermode/conf/std.usermode"
 
 options        INCLUDE_CONFIG_FILE
-#ident                 "GENERIC-$Revision: 1.15 $"
+#ident                 "GENERIC-$Revision: 1.16 $"
 maxusers       32
 
 makeoptions    DEBUG="-O1 -g3"
 
-#options       MEMSIZE=65536   # amount of memory to allocate (in KB)
-options        MEMSIZE=131072  # amount of memory to use for userland (in KB)
+options                TEXTADDR=0x60000000     # 1.5 Gb?
+options                KVMSIZE =0x10000000
 
 options        RTC_OFFSET=0
 options        KTRACE
@@ -22,10 +22,10 @@
 options        DEBUG
 options        DIAGNOSTIC
 options                LOCKDEBUG
-options        DEBUG_EXEC
-#options               CPU_DEBUG
-#options               UVMHIST
-#options               UVMHIST_PRINT
+#options       DEBUG_EXEC
+#options       CPU_DEBUG
+#options       UVMHIST
+#options       UVMHIST_PRINT
 
 options        COMPAT_BSDPTY
 options        COMPAT_50
@@ -48,6 +48,10 @@
 ttycons0       at mainbus?
 ld0            at mainbus?
 
+#options               SDL
+#genfb0                at thunkbus?
+#wsdisplay0    at genfb?
+
 pseudo-device  loop
 
 # Pull in optional local configuration
diff -r 11ebc4d01c65 -r e3ae975a43e7 sys/arch/usermode/conf/Makefile.usermode
--- a/sys/arch/usermode/conf/Makefile.usermode  Wed Sep 14 18:26:24 2011 +0000
+++ b/sys/arch/usermode/conf/Makefile.usermode  Wed Sep 14 18:28:36 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.usermode,v 1.20 2011/09/08 11:53:18 jmcneill Exp $
+# $NetBSD: Makefile.usermode,v 1.21 2011/09/14 18:28:36 reinoud Exp $
 
 OPT_CPU_HOST=                  %CPU_HOST%
 .if !empty(OPT_CPU_HOST)
@@ -21,7 +21,7 @@
 ##
 USERMODE_HOSTOS!=uname -s
 USERMODE_HOSTMACHINE!=uname -m
-USERMODE_LIBS= -lrt
+USERMODE_LIBS= -lc -lrt
 USERMODE_CPPFLAGS=${DEBUG} -U_KERNEL -I/usr/include
 USERMODE_CPPFLAGS+=${CWARNFLAGS} ${NOGCCERROR:D:U-Werror}
 
@@ -76,10 +76,17 @@
 ##
 ## (5) link settings
 ##
+TEXTADDR?=     0x60000000
+KVMSIZE?=      0x10000000
+
+LINKFLAGS_NORMAL=      -X
+KERN_LDSCRIPT?=        kern.ldscript
+#LINKFORMAT=   -T ${USERMODE}/conf/${KERN_LDSCRIPT}
+
 SYSTEM_LD=     @${_MKSHMSG} "   link  ${.CURDIR:T}/${.TARGET}"; \
                ${_MKSHECHO}\
-               ${CC} -static ${COPTS} -Wl,-Map,$@.map -o $@ '$${SYSTEM_OBJ}' '$${EXTRA_OBJ}' vers.o ${USERMODE_LIBS}; \
-               ${CC} -static ${COPTS} -Wl,-Map,$@.map -o $@ ${SYSTEM_OBJ} ${EXTRA_OBJ} vers.o ${USERMODE_LIBS}
+               ${CC} -static ${COPTS} -Wl,-Map,$@.map -o $@ ${LINKFORMAT} -Ttext ${TEXTADDR} '$${SYSTEM_OBJ}' '$${EXTRA_OBJ}' vers.o ${USERMODE_LIBS}; \
+               ${CC} -static ${COPTS} -Wl,-Map,$@.map -o $@ ${LINKFORMAT} -Ttext ${TEXTADDR} ${SYSTEM_OBJ} ${EXTRA_OBJ} vers.o ${USERMODE_LIBS}
 NVFLAGS=       -n
 
 ##
diff -r 11ebc4d01c65 -r e3ae975a43e7 sys/arch/usermode/usermode/machdep.c
--- a/sys/arch/usermode/usermode/machdep.c      Wed Sep 14 18:26:24 2011 +0000
+++ b/sys/arch/usermode/usermode/machdep.c      Wed Sep 14 18:28:36 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.30 2011/09/12 12:24:34 reinoud Exp $ */
+/* $NetBSD: machdep.c,v 1.31 2011/09/14 18:28:36 reinoud Exp $ */
 
 /*-
  * Copyright (c) 2011 Reinoud Zandijk <reinoud%netbsd.org@localhost>
@@ -32,7 +32,7 @@
 #include "opt_urkelvisor.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.30 2011/09/12 12:24:34 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.31 2011/09/14 18:28:36 reinoud Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -58,9 +58,6 @@
 char machine[] = "usermode";
 char machine_arch[] = "usermode";
 
-/* XXX */
-int    physmem = MEMSIZE * 1024 / PAGE_SIZE;
-
 static char **saved_argv;
 char *usermode_root_image_path = NULL;
 
diff -r 11ebc4d01c65 -r e3ae975a43e7 sys/arch/usermode/usermode/pmap.c
--- a/sys/arch/usermode/usermode/pmap.c Wed Sep 14 18:26:24 2011 +0000
+++ b/sys/arch/usermode/usermode/pmap.c Wed Sep 14 18:28:36 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.60 2011/09/13 10:38:48 reinoud Exp $ */
+/* $NetBSD: pmap.c,v 1.61 2011/09/14 18:28:36 reinoud 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.60 2011/09/13 10:38:48 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.61 2011/09/14 18:28:36 reinoud Exp $");
 
 #include "opt_memsize.h"
 #include "opt_kmempages.h"
@@ -58,9 +58,6 @@
 #define PV_MODIFIED    0x02
 };
 
-
-/* this is a guesstimate of 16KB/process on amd64, or around 680+ mappings */
-#define PM_MIN_NENTRIES ((int) (16*1024 / sizeof(pv_entry)))
 struct pmap {
        int     pm_count;
        int     pm_flags;
@@ -100,90 +97,82 @@
 
 extern void    setup_signal_handlers(void);
 
-/* exposed to signal handler */
+/* exposed (to signal handler f.e.) */
 vaddr_t kmem_k_start, kmem_k_end;
 vaddr_t kmem_ext_start, kmem_ext_end;
 vaddr_t kmem_user_start, kmem_user_end;
 vaddr_t kmem_ext_cur_start, kmem_ext_cur_end;
 
+/* amount of physical memory */
+int    physmem; 
+
 #define SPARSE_MEMFILE
 
+static uint8_t mem_kvm[KVMSIZE + 2*PAGE_SIZE];
+
 void
 pmap_bootstrap(void)
 {
        struct pmap *pmap;
-       ssize_t fpos, file_len;
-       ssize_t pv_fpos, pm_fpos;
-       ssize_t wlen;
-       ssize_t kmem_len, user_len, barrier_len, uvm_len;
-       ssize_t pv_table_size;
+       paddr_t totmem_len;
+       paddr_t fpos, file_len;
+       paddr_t pv_fpos, pm_fpos;
+       paddr_t wlen;
+       paddr_t user_len, barrier_len;
+       paddr_t pv_table_size;
        vaddr_t free_start, free_end;
        vaddr_t mpos;
        paddr_t pa;
        vaddr_t va;
        uintptr_t pg;
        void *addr;
-       int err;
 
-       extern void _init(void);        /* start of kernel               */
+       extern void _start(void);       /* start of kernel               */
        extern int etext;               /* end of the kernel             */
        extern int edata;               /* end of the init. data segment */
        extern int end;                 /* end of bss                    */
+       vaddr_t vm_min_addr;
 
-       aprint_debug("Information retrieved from elf image\n");
-       aprint_debug("start kernel        at %p\n", _init);
+       vm_min_addr = thunk_get_vm_min_address();
+       vm_min_addr = vm_min_addr < PAGE_SIZE ? PAGE_SIZE : vm_min_addr;
+
+       aprint_debug("Information retrieved from system and elf image\n");
+       aprint_debug("min VM address      at %p\n", (void *) vm_min_addr);
+       aprint_debug("start kernel        at %p\n", _start);
        aprint_debug("  end kernel        at %p\n", &etext);
        aprint_debug("  end of init. data at %p\n", &edata);
        aprint_debug("1st end of data     at %p\n", &end);
        aprint_debug("CUR end data        at %p\n", thunk_sbrk(0));
 
-       /* calculate memory lengths */
-       kmem_len    = (physmem/2) * PAGE_SIZE;
-       user_len    = MEMSIZE * 1024;
-       barrier_len = 2 * 1024 * 1024;
-
        /* calculate kernel section (R-X) */
-       kmem_k_start = (vaddr_t) PAGE_SIZE * (atop(_init)   );
+       kmem_k_start = (vaddr_t) PAGE_SIZE * (atop(_start)    );
        kmem_k_end   = (vaddr_t) PAGE_SIZE * (atop(&etext) + 1);
 
-       /* claim memory with 2 pages more */
-       uvm_len = kmem_len + barrier_len + user_len + barrier_len + 2*PAGE_SIZE;
-       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))
-               panic("pmap_bootstrap: mpos miscalculation");
+       /* calculate total available memory space */
+       totmem_len  = (vaddr_t) mem_kvm + KVMSIZE;
+
+       /* calculate the number of available pages */
+       physmem     = totmem_len / PAGE_SIZE;
 
-       /* low barrier (---) */
-       mpos += barrier_len;
+       /* calculate memory lengths */
+       barrier_len = 2 * 1024 * 1024;
+       user_len    = kmem_k_start - barrier_len;
+
+       /* devide memory */
+       mem_uvm = (void *) vm_min_addr;
+       mpos = vm_min_addr;
 
        /* claim an area for userland (---/R--/RW-/RWX) */
        kmem_user_start = mpos;
        mpos += user_len;
        kmem_user_end   = mpos;
-       /* TODO make a better user space size estimate */
-
-       /* upper barrier (---) */
-       mpos += barrier_len;
 
        /* calculate KVM section (RW-) */
-       kmem_ext_start = mpos;
-       mpos += kmem_len;
+       kmem_ext_start = round_page((vaddr_t) mem_kvm);
+       mpos += KVMSIZE;
        kmem_ext_end   = mpos;
 
-#if 1
-       /* protect complete UVM area (---) */
-       addr = thunk_mmap((void*) mem_uvm,
-               uvm_len,
-               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 (%p)\n", (void *)addr);
-#endif
-
+       /* print summary */
        aprint_debug("\nMemory summary\n");
        aprint_debug("\tkmem_k_start\t%p\n",    (void *) kmem_k_start);
        aprint_debug("\tkmem_k_end\t%p\n",      (void *) kmem_k_end);
@@ -191,8 +180,35 @@
        aprint_debug("\tkmem_ext_end\t%p\n",    (void *) kmem_ext_end);
        aprint_debug("\tkmem_user_start\t%p\n", (void *) kmem_user_start);
        aprint_debug("\tkmem_user_end\t%p\n",   (void *) kmem_user_end);
+
+       aprint_debug("\ttotmem_len\t%10d\n", (int) totmem_len);
+       aprint_debug("\tkvmsize\t\t%10d\n", (int) KVMSIZE);
+       aprint_debug("\tuser_len\t%10d\n", (int) user_len);
+
        aprint_debug("\n\n");
 
+#if 1
+       /* protect user memory UVM area (---) */
+       addr = thunk_mmap((void*) mem_uvm,
+               kmem_user_end - vm_min_addr,
+               THUNK_PROT_NONE,
+               THUNK_MAP_ANON | THUNK_MAP_FIXED | THUNK_MAP_PRIVATE,
+               -1, 0);
+       if (addr != (void *) mem_uvm)
+               panic("pmap_bootstrap: userland uvm space protection "
+                       "failed (%p)\n", (void *)addr);
+
+       /* protect user memory UVM area (---) */
+       addr = thunk_mmap((void*) kmem_ext_start,
+               KVMSIZE,
+               THUNK_PROT_NONE,
+               THUNK_MAP_ANON | THUNK_MAP_FIXED | THUNK_MAP_PRIVATE,
+               -1, 0);
+       if (addr != (void *) kmem_ext_start)
+               panic("pmap_bootstrap: kvm uvm space protection "



Home | Main Index | Thread Index | Old Index