]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: Revert extra canary page before callstack
authorJoe Groff <arcata@gmail.com>
Fri, 21 Oct 2011 18:49:34 +0000 (11:49 -0700)
committerJoe Groff <arcata@gmail.com>
Fri, 28 Oct 2011 04:14:50 +0000 (21:14 -0700)
This reverts commit 7d5c8d6990385b94569116a23163d7e75ae21f49. We pretty much can't avoid unwinding frames without some more drastic redesign.

vm/callbacks.cpp
vm/code_heap.cpp
vm/contexts.cpp
vm/data_heap.cpp
vm/errors.cpp
vm/os-unix.cpp
vm/os-windows.cpp
vm/segments.hpp

index 486946a01ce1fe8625da06427f907e4b37ec5bfe..fafcbef54f5a4ff53f887da58b901c74b1376715 100755 (executable)
@@ -4,7 +4,7 @@ namespace factor
 {
 
 callback_heap::callback_heap(cell size, factor_vm *parent_) :
-       seg(new segment(size,true,false)),
+       seg(new segment(size,true)),
        here(seg->start),
        parent(parent_) {}
 
index 6b20167e8fe1fdc6b23a586cd975e590897f2754..1d978f243967d2ce35ae4441890421f3ac3a348f 100755 (executable)
@@ -6,7 +6,7 @@ namespace factor
 code_heap::code_heap(cell size)
 {
        if(size > ((u64)1 << (sizeof(cell) * 8 - 6))) fatal_error("Heap too large",size);
-       seg = new segment(align_page(size),true,false);
+       seg = new segment(align_page(size),true);
        if(!seg) fatal_error("Out of memory in code_heap constructor",size);
 
        cell start = seg->start + getpagesize() + seh_area_size;
index 2c5a114f02b8c6cec456a65e8baa4ccfed8aafb1..b31c42f0f487717966003aca6d41bd2353cde7dd 100644 (file)
@@ -9,9 +9,9 @@ context::context(cell datastack_size, cell retainstack_size, cell callstack_size
        datastack(0),
        retainstack(0),
        callstack_save(0),
-       datastack_seg(new segment(datastack_size,false,false)),
-       retainstack_seg(new segment(retainstack_size,false,false)),
-       callstack_seg(new segment(callstack_size,false,true))
+       datastack_seg(new segment(datastack_size,false)),
+       retainstack_seg(new segment(retainstack_size,false)),
+       callstack_seg(new segment(callstack_size,false))
 {
        reset();
 }
index 0d50868cd67831b0a1cc6796dd66c2c059edcddf..08f3e929cad25f7b3bc96a52d21de225b4df6020 100755 (executable)
@@ -22,7 +22,7 @@ data_heap::data_heap(cell young_size_,
        tenured_size = tenured_size_;
 
        cell total_size = young_size + 2 * aging_size + tenured_size + deck_size;
-       seg = new segment(total_size,false,false);
+       seg = new segment(total_size,false);
 
        cell cards_size = addr_to_card(total_size);
        cards = new card[cards_size];
index e6ba6afa5b13af7f409af3194710fc775bfc40e6..286176954d3e0f55e6b4a29b5a3a51c97b4a2e42 100755 (executable)
@@ -98,8 +98,6 @@ void factor_vm::memory_protection_error(cell addr)
                general_error(ERROR_CALLSTACK_OVERFLOW,false_object,false_object);
        else if(ctx->callstack_seg->overflow_p(addr))
                general_error(ERROR_CALLSTACK_UNDERFLOW,false_object,false_object);
-       else if(ctx->callstack_seg->canary_p(addr))
-               fatal_error("Call stack overflow in your call stack overflow", addr);
        else
                general_error(ERROR_MEMORY,from_unsigned_cell(addr),false_object);
 }
index 191d99c10720ed07de2b1c204d66e1c30fed8616..5f0edd34f99aad2ae6b09c9b31cd1eff64757c0b 100755 (executable)
@@ -91,11 +91,11 @@ void factor_vm::move_file(const vm_char *path1, const vm_char *path2)
                general_error(ERROR_IO,tag_fixnum(errno),false_object);
 }
 
-segment::segment(cell size_, bool executable_p, bool canary_page_p)
+segment::segment(cell size_, bool executable_p)
 {
        size = size_;
 
-       cell pagesize = getpagesize();
+       int pagesize = getpagesize();
 
        int prot;
        if(executable_p)
@@ -103,18 +103,16 @@ segment::segment(cell size_, bool executable_p, bool canary_page_p)
        else
                prot = (PROT_READ | PROT_WRITE);
 
-       cell startsize = canary_page_p ? 2*pagesize : pagesize;
-
-       char *array = (char *)mmap(NULL,startsize + size + pagesize,prot,MAP_ANON | MAP_PRIVATE,-1,0);
+       char *array = (char *)mmap(NULL,pagesize + size + pagesize,prot,MAP_ANON | MAP_PRIVATE,-1,0);
        if(array == (char*)-1) out_of_memory();
 
-       if(mprotect(array,startsize,PROT_NONE) == -1)
+       if(mprotect(array,pagesize,PROT_NONE) == -1)
                fatal_error("Cannot protect low guard page",(cell)array);
 
-       if(mprotect(array + startsize + size,pagesize,PROT_NONE) == -1)
+       if(mprotect(array + pagesize + size,pagesize,PROT_NONE) == -1)
                fatal_error("Cannot protect high guard page",(cell)array);
 
-       start = (cell)(array + startsize);
+       start = (cell)(array + pagesize);
        end = start + size;
 }
 
@@ -238,7 +236,7 @@ void factor_vm::unix_init_signals()
        libpthread. See http://redmine.ruby-lang.org/issues/show/1239 */
 
 #ifndef __OpenBSD__
-       signal_callstack_seg = new segment(callstack_size,false,false);
+       signal_callstack_seg = new segment(callstack_size,false);
 
        stack_t signal_callstack;
        signal_callstack.ss_sp = (char *)signal_callstack_seg->start;
index e401806084fde758de57824a5797897cbac56a76..6743064c368a8b1c8830f13c1b239bcdb03b9a2d 100755 (executable)
@@ -106,27 +106,25 @@ void factor_vm::primitive_existsp()
        ctx->push(tag_boolean(windows_stat(path)));
 }
 
-segment::segment(cell size_, bool executable_p, bool canary_page_p)
+segment::segment(cell size_, bool executable_p)
 {
        size = size_;
 
        char *mem;
        DWORD ignore;
 
-       cell pagesize = getpagesize();
-       cell startsize = canary_page_p ? 2*pagesize : pagesize;
-       if((mem = (char *)VirtualAlloc(NULL, startsize + size + pagesize,
+       if((mem = (char *)VirtualAlloc(NULL, getpagesize() * 2 + size,
                MEM_COMMIT, executable_p ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE)) == 0)
                out_of_memory();
 
-       if (!VirtualProtect(mem, startsize, PAGE_NOACCESS, &ignore))
+       if (!VirtualProtect(mem, getpagesize(), PAGE_NOACCESS, &ignore))
                fatal_error("Cannot allocate low guard page", (cell)mem);
 
-       if (!VirtualProtect(mem + size + startsize,
-               pagesize, PAGE_NOACCESS, &ignore))
+       if (!VirtualProtect(mem + size + getpagesize(),
+               getpagesize(), PAGE_NOACCESS, &ignore))
                fatal_error("Cannot allocate high guard page", (cell)mem);
 
-       start = (cell)mem + startsize;
+       start = (cell)mem + getpagesize();
        end = start + size;
 }
 
index 55eda9362055f17b7ea21e125b7a702c4aa5f2e4..7f86c3548522d38213ab04a680bb44a6bf377037 100644 (file)
@@ -13,14 +13,9 @@ struct segment {
        cell size;
        cell end;
 
-       explicit segment(cell size, bool executable_p, bool canary_page_p);
+       explicit segment(cell size, bool executable_p);
        ~segment();
 
-       bool canary_p(cell addr)
-       {
-               return (addr >= start - 2*getpagesize() && addr < start - getpagesize());
-       }
-
        bool underflow_p(cell addr)
        {
                return (addr >= start - getpagesize() && addr < start);