]> Zhao Yanbai Git Server - minix.git/commitdiff
vm: Separate mmap regions. 90/3090/2
authorCristiano Giuffrida <giuffrida@cs.vu.nl>
Tue, 11 Mar 2014 23:02:34 +0000 (00:02 +0100)
committerDavid van Moolenbroek <david@minix3.org>
Wed, 16 Sep 2015 11:06:17 +0000 (11:06 +0000)
Add support for compact address layout.  This feature can be enabled
through the ac_layout=1 boot option.

Change-Id: Ie20b808fce32b5c54d0a7e7210e0084a540e9613

minix/kernel/arch/earm/pre_init.c
minix/kernel/arch/i386/pre_init.c
minix/kernel/const.h
minix/kernel/main.c
minix/servers/vm/mmap.c
minix/servers/vm/vm.h

index 9411c42163db436d56d39d70da2b4fda1792a0bb..e52efb91b54ad9af3ef0ce2527050e7f5278ea45 100644 (file)
@@ -275,12 +275,12 @@ void get_parameters(kinfo_t *cbi, char *bootargs)
        mb_set_param(cbi->param_buf, BOARDVARNAME,(char *)get_board_name(machine.board_id) , cbi);
        
 
-       /* round user stack down to leave a gap to catch kernel
+       /* move user stack/data down to leave a gap to catch kernel
         * stack overflow; and to distinguish kernel and user addresses
         * at a glance (0xf.. vs 0xe..) 
         */
-       cbi->user_sp &= 0xF0000000;
-       cbi->user_end = cbi->user_sp;
+       cbi->user_sp = USR_STACKTOP;
+       cbi->user_end = USR_DATATOP;
 
        /* kernel bytes without bootstrap code/data that is currently
         * still needed but will be freed after bootstrapping.
index 21822b526263c59f910f37565209e5504b5655a1..f71739f7d9e1fcae9ccefb2ba3ff8fb1c38cd8c4 100644 (file)
@@ -157,12 +157,12 @@ void get_parameters(u32_t ebx, kinfo_t *cbi)
         mb_set_param(cbi->param_buf, ARCHVARNAME, (char *)get_board_arch_name(BOARD_ID_INTEL), cbi);
        mb_set_param(cbi->param_buf, BOARDVARNAME,(char *)get_board_name(BOARD_ID_INTEL) , cbi);
 
-       /* round user stack down to leave a gap to catch kernel
+       /* move user stack/data down to leave a gap to catch kernel
         * stack overflow; and to distinguish kernel and user addresses
         * at a glance (0xf.. vs 0xe..) 
         */
-       cbi->user_sp &= 0xF0000000;
-       cbi->user_end = cbi->user_sp;
+       cbi->user_sp = USR_STACKTOP;
+       cbi->user_end = USR_DATATOP;
 
        /* kernel bytes without bootstrap code/data that is currently
         * still needed but will be freed after bootstrapping.
index 7e7e3da9b859f47d41523bd9db0778c130e9172c..be16f21c04794a56d5b0b7ee5039abaa52b0cc97 100644 (file)
 /* for kputc() */
 #define END_OF_KMESS   0
 
+/* User limits. */
+#ifndef USR_DATATOP
+#ifndef _MINIX_MAGIC
+#define USR_DATATOP 0xF0000000
+#else
+#define USR_DATATOP 0xE0000000 /* TODO: is this necessary? */
+#endif
+#endif
+
+#ifndef USR_STACKTOP
+#define USR_STACKTOP USR_DATATOP
+#endif
+
+#ifndef USR_DATATOP_COMPACT
+#define USR_DATATOP_COMPACT USR_DATATOP
+#endif
+
+#ifndef USR_STACKTOP_COMPACT
+#define USR_STACKTOP_COMPACT 0x50000000
+#endif
+
 #endif /* CONST_H */
index f351a06a20c66bf8e8c3944afc209b62ee0dda32..b02b86d5b314687e5fc44b1d60d6a0588522096c 100644 (file)
@@ -426,6 +426,13 @@ void cstart()
   if(!value || system_hz < 2 || system_hz > 50000)     /* sanity check */
        system_hz = DEFAULT_HZ;
 
+  /* Get memory parameters. */
+  value = env_get("ac_layout");
+  if(value && atoi(value)) {
+        kinfo.user_sp = (vir_bytes) USR_STACKTOP_COMPACT;
+        kinfo.user_end = (vir_bytes) USR_DATATOP_COMPACT;
+  }
+
   DEBUGEXTRA(("cstart\n"));
 
   /* Record miscellaneous information for user-space servers. */
index 9d146bf99db90f66f7d905ee6081bbeecd14c88e..7279144826af862658c21e25d3a48d7d86b4a455 100644 (file)
@@ -75,7 +75,7 @@ static struct vir_region *mmap_region(struct vmproc *vmp, vir_bytes addr,
 
        if (!vr) {
                /* No address given or address already in use. */
-               vr = map_page_region(vmp, VM_PAGE_SIZE, VM_DATATOP, len,
+               vr = map_page_region(vmp, VM_MMAPBASE, VM_MMAPTOP, len,
                        vrflags, mfflags, mt);
        }
 
@@ -349,7 +349,7 @@ int do_map_phys(message *m)
        if(len % VM_PAGE_SIZE)
                len += VM_PAGE_SIZE - (len % VM_PAGE_SIZE);
 
-       if(!(vr = map_page_region(vmp, 0, VM_DATATOP, len, 
+       if(!(vr = map_page_region(vmp, VM_MMAPBASE, VM_MMAPTOP, len,
                VR_DIRECT | VR_WRITABLE, 0, &mem_type_directphys))) {
                return ENOMEM;
        }
@@ -419,8 +419,8 @@ int do_remap(message *m)
                vr = map_page_region(dvmp, da, 0, size, flags, 0,
                        &mem_type_shared);
        else
-               vr = map_page_region(dvmp, 0, VM_DATATOP, size, flags, 0,
-                       &mem_type_shared);
+               vr = map_page_region(dvmp, VM_MMAPBASE, VM_MMAPTOP, size,
+                       flags, 0, &mem_type_shared);
 
        if(!vr) {
                printf("VM: re-map of shared area failed\n");
index 97bd5e3a5c71db672540ebb513f241d92bd36e26..3a6e56accf1b2d59ec38eb51bb9fdea71c62acee 100644 (file)
 #define NO_MEM ((phys_clicks) MAP_NONE)  /* returned by alloc_mem() with mem is up */
 
 /* And what is the highest addressable piece of memory? */
-#define VM_DATATOP      kernel_boot_info.user_end
-#define VM_STACKTOP     kernel_boot_info.user_sp
-
+#define VM_DATATOP     kernel_boot_info.user_end
+
+#define VM_STACKTOP    kernel_boot_info.user_sp
+
+/* Live update will work only with magic instrumentation. Live update requires
+ * strict separation of regions within the process to succeed. Therefore,
+ * apply this strict separation only if magic instrumentation is used.
+ * Otherwise, do not place such limitations on processes.
+ */
+#ifdef _MINIX_MAGIC
+#define VM_MMAPTOP     (VM_STACKTOP-DEFAULT_STACK_LIMIT)
+#define VM_MMAPBASE    (VM_MMAPTOP/2)
+#else
+#define VM_MMAPTOP     VM_DATATOP
+#define VM_MMAPBASE    VM_PAGE_SIZE
 #endif
 
+#endif