0.9.9.12:
[sbcl.git] / src / runtime / linux-os.c
index 85221c5..51bef4d 100644 (file)
@@ -124,14 +124,17 @@ os_init(char *argv[], char *envp[])
     struct utsname name;
     int major_version;
     int minor_version;
+    int patch_version;
     char *p;
     uname(&name);
     p=name.release;
     major_version = atoi(p);
     p=strchr(p,'.')+1;
     minor_version = atoi(p);
+    p=strchr(p,'.')+1;
+    patch_version = atoi(p);
     if (major_version<2) {
-        lose("linux kernel version too old: major version=%d (can't run in version < 2.0.0)",
+        lose("linux kernel version too old: major version=%d (can't run in version < 2.0.0)\n",
              major_version);
     }
     if (!(major_version>2 || minor_version >= 4)) {
@@ -143,11 +146,14 @@ os_init(char *argv[], char *envp[])
 #ifdef LISP_FEATURE_SB_THREAD
     futex_wait(futex,-1);
     if(errno==ENOSYS) {
-       lose("This version of SBCL is compiled with threading support, but your kernel is too old to support this.\n\
-Please use a more recent kernel or a version of SBCL without threading support.\n");
+       lose("This version of SBCL is compiled with threading support, but your kernel\n"
+            "is too old to support this. Please use a more recent kernel or\n"
+            "a version of SBCL without threading support.\n");
     }
     if(! isnptl()) {
-       lose("This version of SBCL only works correctly with the NPTL threading library. Please use a newer glibc, use an older SBCL, or stop using LD_ASSUME_KERNEL");
+       lose("This version of SBCL only works correctly with the NPTL threading\n"
+            "library. Please use a newer glibc, use an older SBCL, or stop using\n"
+            "LD_ASSUME_KERNEL\n");
     }
 #endif
     os_vm_page_size = getpagesize();
@@ -161,7 +167,11 @@ Please use a more recent kernel or a version of SBCL without threading support.\
      * don't do this trick on other platforms.
      */
 #ifdef LISP_FEATURE_X86
-    if ((major_version == 2 && minor_version >= 6)
+    if ((major_version == 2
+         /* Some old kernels will apparently lose unsupported personality flags
+          * on exec() */
+         && ((minor_version == 6 && patch_version >= 11)
+             || (minor_version > 6)))
         || major_version >= 3)
     {
         int pers = personality(0xffffffffUL);
@@ -198,6 +208,10 @@ Please use a more recent kernel or a version of SBCL without threading support.\
             fprintf(stderr, "WARNING: Couldn't re-execute SBCL with the proper personality flags (maybe /proc isn't mounted?). Trying to continue anyway.\n");
         }
     }
+    /* Use SSE detector.  Recent versions of Linux enable SSE support
+     * on SSE capable CPUs.  */
+    /* FIXME: Are there any old versions that does not support SSE?  */
+    fast_bzero_pointer = fast_bzero_detect;
 #endif
 }
 
@@ -260,7 +274,7 @@ os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len)
                   fd, (off_t) offset);
     if (actual == MAP_FAILED || (addr && (addr != actual))) {
         perror("mmap");
-        lose("unexpected mmap(..) failure");
+        lose("unexpected mmap(..) failure\n");
     }
 
     return actual;
@@ -356,3 +370,18 @@ os_install_interrupt_handlers(void)
                                                  sig_stop_for_gc_handler);
 #endif
 }
+
+char *
+os_get_runtime_executable_path()
+{
+    char path[PATH_MAX + 1];
+    int size;
+
+    size = readlink("/proc/self/exe", path, sizeof(path));
+    if (size < 0)
+        return NULL;
+    else
+        path[size] = '\0';
+
+    return copied_string(path);
+}