<pre style='margin:0'>
Perry E. Metzger (pmetzger) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/5769456f0bea6c34fa8f5e1889447ba8de9fa0f9">https://github.com/macports/macports-ports/commit/5769456f0bea6c34fa8f5e1889447ba8de9fa0f9</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 5769456  sbcl: update to 1.5.7
</span>5769456 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 5769456f0bea6c34fa8f5e1889447ba8de9fa0f9
</span>Author: Perry E. Metzger <perry@piermont.com>
AuthorDate: Tue Oct 22 15:30:14 2019 -0400

<span style='display:block; white-space:pre;color:#404040;'>    sbcl: update to 1.5.7
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    * Fix build on all platforms
</span><span style='display:block; white-space:pre;color:#404040;'>    * (Hopefully) restore build on i386 broken by earlier commits
</span><span style='display:block; white-space:pre;color:#404040;'>    * bump dependent ports maxima and maxima-devel
</span>---
 lang/sbcl/files/patch-1.5.7-1-07d135b0.diff | 193 ++++++++++++++++++++++++++++
 lang/sbcl/files/patch-1.5.7-2-5cefb850.diff |  98 ++++++++++++++
 2 files changed, 291 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/patch-1.5.7-1-07d135b0.diff b/lang/sbcl/files/patch-1.5.7-1-07d135b0.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..963cce3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/patch-1.5.7-1-07d135b0.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,193 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 03dd40840..317124f23 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/bsd-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/bsd-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -125,8 +125,10 @@ os_context_sigmask_addr(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os_vm_address_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-os_validate(int movable, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    attributes &= ~IS_GUARD_PAGE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int flags = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* FIXME: use of MAP_FIXED here looks decidedly wrong! (and not what we do
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -144,7 +146,7 @@ os_validate(int movable, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      * OpenBSD says:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        Except for MAP_FIXED mappings, the system will never replace existing mappings. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    switch (movable) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    switch (attributes) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case MOVABLE_LOW:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef MAP_32BIT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         flags = MAP_32BIT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -180,7 +182,7 @@ os_validate(int movable, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             os_vm_address_t resaddr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             os_vm_size_t curlen = MIN(max_allocation_size, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            resaddr = mmap(curaddr, curlen, OS_VM_PROT_ALL, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            resaddr = mmap(curaddr, curlen, protection, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if (resaddr == (os_vm_address_t) - 1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 perror("mmap");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -199,7 +201,7 @@ os_validate(int movable, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        addr = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        addr = mmap(addr, len, protection, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* FIXME: if MAP_FIXED and MOVABLE_LOW, probe for other possible addresses,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/runtime/haiku-os.c b/src/runtime/haiku-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 14f222498..72c8150b8 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/haiku-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/haiku-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11,6 +11,8 @@ size_t os_vm_page_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os_vm_address_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    attributes &= ~IS_GUARD_PAGE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // There's no MAP_NORESERVE flag? How do we inform the OS not to commit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // the whole range to swap?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int flags =  MAP_PRIVATE | MAP_ANONYMOUS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -20,7 +22,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (attributes & ALLOCATE_LOW)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         flags |= MAP_32BIT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    actual = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    actual = mmap(addr, len, protection, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (actual == MAP_FAILED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         perror("mmap");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return 0;               /* caller should check this */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/runtime/hpux-os.c b/src/runtime/hpux-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index aaa59658e..ed420d64a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/hpux-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/hpux-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -34,13 +34,15 @@ os_init(char *argv[], char *envp[])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os_vm_address_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-os_validate(int movable, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    attributes &= ~IS_GUARD_PAGE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     os_vm_address_t actual;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int flags = MAP_PRIVATE | MAP_ANONYMOUS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (addr) flags |= MAP_FIXED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    actual = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    actual = mmap(addr, len, protection, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (actual == MAP_FAILED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         perror("mmap");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/runtime/linux-mman.c b/src/runtime/linux-mman.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ddb51731c..b8e3ec807 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/linux-mman.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/linux-mman.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -27,6 +27,8 @@ os_set_cheneygc_spaces(uword_t space0_start, uword_t space1_start)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os_vm_address_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    attributes &= ~IS_GUARD_PAGE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int flags =  MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     os_vm_address_t actual;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -39,7 +41,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (attributes & ALLOCATE_LOW)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         flags |= MAP_32BIT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    actual = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    actual = mmap(addr, len, protection, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (actual == MAP_FAILED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         perror("mmap");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return 0;               /* caller should check this */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/runtime/os.h b/src/runtime/os.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 64bfbcc9d..85c334f8c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/os.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/os.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -104,6 +104,7 @@ extern void os_zero(os_vm_address_t addr, os_vm_size_t length);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define ALLOCATE_LOW     2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define IS_THREAD_STRUCT 4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define MOVABLE_LOW      (MOVABLE|ALLOCATE_LOW)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define IS_GUARD_PAGE    8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern os_vm_address_t os_validate(int movable,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    os_vm_address_t addr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    os_vm_size_t len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/runtime/sunos-os.c b/src/runtime/sunos-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 412b09650..dc3b1a756 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/sunos-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/sunos-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -47,13 +47,15 @@ os_init(char *argv[], char *envp[])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     os_vm_page_size = BACKEND_PAGE_BYTES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-os_vm_address_t os_validate(int movable, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++os_vm_address_t os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    attributes &= ~IS_GUARD_PAGE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANON;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (addr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         flags |= MAP_FIXED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    addr = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    addr = mmap(addr, len, protection, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (addr == MAP_FAILED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         perror("mmap");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/runtime/validate.c b/src/runtime/validate.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5fc00b5cc..725c2333a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/validate.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/validate.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -68,9 +68,21 @@ os_vm_address_t undefined_alien_address = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ensure_undefined_alien(void) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    os_vm_address_t start = os_allocate(os_vm_page_size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    os_vm_address_t start = os_validate(MOVABLE|IS_GUARD_PAGE, NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef LISP_FEATURE_WIN32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* We can/should disregard our 'os_vm_page_size' constant which tends to be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * larger than the granularity that the OS will allow you to manipulate via
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * mprotect(). e.g. on x86-64-linux we use a page size of 32K but in reality
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * the protection granularity is 4K.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * Moreover, since the memory protection is not changed after allocation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * the granuarity that mprotect() operates on is immaterial. As such, it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * probably would work to put N_WORD_BYTES here since that's all we need. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        getpagesize()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else // Use the same value as does contrib/sb-posix/interface.lisp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        4096
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (start) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        os_protect(start, os_vm_page_size, OS_VM_PROT_NONE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         undefined_alien_address = start;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         lose("could not allocate guard page for undefined alien\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8260fcb78..f82b7ba6e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/win32-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/win32-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -814,14 +814,15 @@ static inline boolean local_thread_stack_address_p(os_vm_address_t address)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os_vm_address_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-os_validate(int movable, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     MEMORY_BASIC_INFORMATION mem_info;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!addr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         /* the simple case first */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        int protection = attributes & IS_GUARD_PAGE ? PAGE_NOACCESS : PAGE_EXECUTE_READWRITE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            AVERLAX(VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            AVERLAX(VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, protection));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!AVERLAX(VirtualQuery(addr, &mem_info, sizeof mem_info)))
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/patch-1.5.7-2-5cefb850.diff b/lang/sbcl/files/patch-1.5.7-2-5cefb850.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..3ac7151
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/patch-1.5.7-2-5cefb850.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,98 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 317124f23..8db5db1c8 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/bsd-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/bsd-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -131,14 +131,27 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     attributes &= ~IS_GUARD_PAGE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int flags = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* FIXME: use of MAP_FIXED here looks decidedly wrong! (and not what we do
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * in linux-os.c). Granted there are differences between *BSD and Linux,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * but on MAP_FIXED they agree: it destroys an existing mapping.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * macOS says:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       If the memory region specified by addr and len overlaps pages of any existing
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       mapping(s), then the overlapped part of the existing mapping(s) will be discarded.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef LISP_FEATURE_DARWIN // Do not use MAP_FIXED, because the OS is sane.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* The *BSD family of OSes seem to ignore 'addr' when it is outside
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * of some range which I could not figure out.  Sometimes it seems like the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * condition is that any address below 4GB can't be requested without MAP_FIXED,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * but on the other hand, asking for 0x1000 without MAP_FIXED works fine.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * So we are forced to use MAP_FIXED even for movable mappings. Thus, the logic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * below does not work as intended because:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * (1) We can't detect when MAP_FIXED destroyed an existing mapping.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     *     But we can avoid the destruction by using MAP_EXCL when that flag exists,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     *     which it does not always.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * (2) Passing MAP_FIXED when we do not require a fixed address gets MAP_FAILURE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     *     for mappings that we would have been willing to relocate.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     *     So relocation is effectively disabled.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * (3) To mitigate the problem of point (2) we remove MAP_FIXED for the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     *     dynamic space which seems to mostly work, but might cause an opposite
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     *     problem: we relocate the heap when perhaps we need not have.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     *     That is, even if the OS _could_ _have_ given the address requested,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     *     it randomly decided not to, thus forcing extra work upon us.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * For reference,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      * FreeBSD says:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        If MAP_EXCL is not specified, a successful MAP_FIXED request replaces any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        previous mappings for the process' pages ...
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -146,29 +159,19 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      * OpenBSD says:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        Except for MAP_FIXED mappings, the system will never replace existing mappings. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    switch (attributes) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    case MOVABLE_LOW:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef MAP_32BIT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        flags = MAP_32BIT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Unless we have MAP_32BIT, use MAP_FIXED because if you don't,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         * there is little chance of getting the hinted address. That in itself
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         * is ok, unless mapped above 2GB, which, sadly, is always the case.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         * (It may not be on OpenBSD which defines MAP_TRYFIXED as using
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         * the hint address, and moreover that it "is the default behavior") */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        // FALLTHROUGH_INTENDED
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    case NOT_MOVABLE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // ALLOCATE_LOW seems never to get what we want
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!(attributes & MOVABLE) | (attributes & ALLOCATE_LOW)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         flags = MAP_FIXED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    case IS_THREAD_STRUCT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (attributes & IS_THREAD_STRUCT) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(LISP_FEATURE_OPENBSD) && defined(MAP_STACK)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         /* OpenBSD requires MAP_STACK for pages used as stack.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          * Note that FreeBSD has a MAP_STACK with different behavior. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         flags = MAP_STACK;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef MAP_EXCL // not defined in OpenBSD, NetBSD, DragonFlyBSD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (flags & MAP_FIXED) flags |= MAP_EXCL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -204,8 +207,6 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         addr = mmap(addr, len, protection, flags, -1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* FIXME: if MAP_FIXED and MOVABLE_LOW, probe for other possible addresses,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * since the combination of (MAP_FIXED | MAP_EXCL) won't */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (addr == MAP_FAILED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         perror("mmap");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/runtime/thread.c b/src/runtime/thread.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c5be95d01..2e3e6a0dc 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/thread.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/thread.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -699,7 +699,7 @@ create_thread_struct(lispobj start_routine) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      * on the alignment passed from os_validate, since that might
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      * assume the current (e.g. 4k) pagesize, while we calculate with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      * the biggest (e.g. 64k) pagesize allowed by the ABI. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    void *spaces = os_validate(IS_THREAD_STRUCT, NULL, THREAD_STRUCT_SIZE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void *spaces = os_validate(MOVABLE|IS_THREAD_STRUCT, NULL, THREAD_STRUCT_SIZE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if(!spaces)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Aligning up is safe as THREAD_STRUCT_SIZE has
</span></pre><pre style='margin:0'>

</pre>