]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add mmap of null page just in case
authorRuss Cox <rsc@golang.org>
Wed, 29 Sep 2010 00:30:01 +0000 (20:30 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 29 Sep 2010 00:30:01 +0000 (20:30 -0400)
R=r, iant, robert.swiecki, rsc1
CC=golang-dev
https://golang.org/cl/1904044

24 files changed:
src/pkg/runtime/darwin/386/defs.h
src/pkg/runtime/darwin/386/sys.s
src/pkg/runtime/darwin/amd64/defs.h
src/pkg/runtime/darwin/amd64/sys.s
src/pkg/runtime/darwin/defs.c
src/pkg/runtime/darwin/mem.c
src/pkg/runtime/freebsd/386/defs.h
src/pkg/runtime/freebsd/386/sys.s
src/pkg/runtime/freebsd/amd64/defs.h
src/pkg/runtime/freebsd/amd64/sys.s
src/pkg/runtime/freebsd/defs.c
src/pkg/runtime/freebsd/mem.c
src/pkg/runtime/linux/386/defs.h
src/pkg/runtime/linux/amd64/defs.h
src/pkg/runtime/linux/arm/defs.h
src/pkg/runtime/linux/defs.c
src/pkg/runtime/linux/defs2.c
src/pkg/runtime/linux/defs_arm.c
src/pkg/runtime/linux/mem.c
src/pkg/runtime/malloc.goc
src/pkg/runtime/malloc.h
src/pkg/runtime/nacl/mem.c
src/pkg/runtime/tiny/mem.c
src/pkg/runtime/windows/mem.c

index 371f650a87851b29671df0a01425c811c7b33151..f9d874d85c41fcea001c4f90b0e34a6bb8b4242e 100644 (file)
@@ -10,6 +10,7 @@ enum {
        PROT_EXEC = 0x4,
        MAP_ANON = 0x1000,
        MAP_PRIVATE = 0x2,
+       MAP_FIXED = 0x10,
        MACH_MSG_TYPE_MOVE_RECEIVE = 0x10,
        MACH_MSG_TYPE_MOVE_SEND = 0x11,
        MACH_MSG_TYPE_MOVE_SEND_ONCE = 0x12,
index 6bc17a4ae5f5facae8647dd290778610730a1933..40c82f32c7db3539a880036c290669ef85cb27bc 100644 (file)
@@ -38,8 +38,6 @@ TEXT write(SB),7,$0
 TEXT ·mmap(SB),7,$0
        MOVL    $197, AX
        INT     $0x80
-       JAE     2(PC)
-       CALL    notok(SB)
        RET
 
 TEXT ·munmap(SB),7,$0
index 0b5fde85ca4deaa086c7cecea9446f418dc7921d..09e595988d3ac488fa1e4b0f75a2feee8f67e274 100644 (file)
@@ -10,6 +10,7 @@ enum {
        PROT_EXEC = 0x4,
        MAP_ANON = 0x1000,
        MAP_PRIVATE = 0x2,
+       MAP_FIXED = 0x10,
        MACH_MSG_TYPE_MOVE_RECEIVE = 0x10,
        MACH_MSG_TYPE_MOVE_SEND = 0x11,
        MACH_MSG_TYPE_MOVE_SEND_ONCE = 0x12,
index 450bed8c20ef2602c474d3edc8f69b9bb27be115..cbf053a62eed1abd013a10ef6a1534d999a963d7 100644 (file)
@@ -103,8 +103,6 @@ TEXT        ·mmap(SB),7,$0
        MOVL    36(SP), R9              // arg 6 offset
        MOVL    $(0x2000000+197), AX    // syscall entry
        SYSCALL
-       JCC     2(PC)
-       CALL    notok(SB)
        RET
 
 TEXT ·munmap(SB),7,$0
index 8735e78572779dde027991d126547d13f54e350e..1a1cdf880c0defe68fbcfe8faa771ffa49c5525a 100644 (file)
@@ -26,6 +26,7 @@ enum {
 
        $MAP_ANON = MAP_ANON,
        $MAP_PRIVATE = MAP_PRIVATE,
+       $MAP_FIXED = MAP_FIXED,
 
        $MACH_MSG_TYPE_MOVE_RECEIVE = MACH_MSG_TYPE_MOVE_RECEIVE,
        $MACH_MSG_TYPE_MOVE_SEND = MACH_MSG_TYPE_MOVE_SEND,
index 32bedd095090dfc8783cbcae1e361596d78bdcda..90c8e4adfa1d437c6e5192fa9eb701a200e23402 100644 (file)
@@ -6,8 +6,15 @@
 void*
 SysAlloc(uintptr n)
 {
+       void *v;
+
        mstats.sys += n;
-       return runtime_mmap(nil, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0);
+       v = runtime_mmap(nil, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0);
+       if(v < (void*)4096) {
+               printf("mmap: errno=%p\n", v);
+               throw("mmap");
+       }
+       return v;
 }
 
 void
@@ -25,3 +32,15 @@ SysFree(void *v, uintptr n)
        runtime_munmap(v, n);
 }
 
+
+void
+SysMemInit(void)
+{
+       // Code generators assume that references to addresses
+       // on the first page will fault.  Map the page explicitly with
+       // no permissions, to head off possible bugs like the system
+       // allocating that page as the virtual address space fills.
+       // Ignore any error, since other systems might be smart
+       // enough to never allow anything there.
+//     runtime_mmap(nil, 4096, PROT_NONE, MAP_FIXED|MAP_ANON|MAP_PRIVATE, -1, 0);
+}
index 76c55721f6c6a83df517414b28df24ba5841f64f..128be9cc9aab61a6cb43c631fe5a55bcc4ab3eff 100644 (file)
@@ -10,6 +10,7 @@ enum {
        PROT_EXEC = 0x4,
        MAP_ANON = 0x1000,
        MAP_PRIVATE = 0x2,
+       MAP_FIXED = 0x10,
        SA_SIGINFO = 0x40,
        SA_RESTART = 0x2,
        SA_ONSTACK = 0x1,
index 6dc98bc96ab33d3f084309bd89947220c4625c6d..012e9a07273476c5c979f73783222f40767942c4 100644 (file)
@@ -80,8 +80,6 @@ TEXT ·mmap(SB),7,$32
        STOSL
        MOVL    $477, AX
        INT     $0x80
-       JAE     2(PC)
-       CALL    notok(SB)
        RET
 
 TEXT ·munmap(SB),7,$-4
index 18b68b3556a514a5684012468da9f36bf5b26dc1..2a295a4794412975f00bf7a3a78cc62dc072953f 100644 (file)
@@ -10,6 +10,7 @@ enum {
        PROT_EXEC = 0x4,
        MAP_ANON = 0x1000,
        MAP_PRIVATE = 0x2,
+       MAP_FIXED = 0x10,
        SA_SIGINFO = 0x40,
        SA_RESTART = 0x2,
        SA_ONSTACK = 0x1,
index 62dcc5dda67f7a3078413fd1c965d3603fcce46e..2d841505ce0ef51934284fa410986c6b402a5e27 100644 (file)
@@ -112,8 +112,6 @@ TEXT        ·mmap(SB),7,$0
        MOVL    36(SP), R9              // arg 6 offset
        MOVL    $477, AX
        SYSCALL
-       JCC     2(PC)
-       CALL    notok(SB)
        RET
 
 TEXT   ·munmap(SB),7,$0
index 36e69093e48353c1e98d85106ffb0fb1c8e14dfe..32a80f4756463b9b9d19016513914eaad775eb32 100644 (file)
@@ -28,6 +28,7 @@ enum {
 
        $MAP_ANON = MAP_ANON,
        $MAP_PRIVATE = MAP_PRIVATE,
+       $MAP_FIXED = MAP_FIXED,
 
        $SA_SIGINFO = SA_SIGINFO,
        $SA_RESTART = SA_RESTART,
index 32bedd095090dfc8783cbcae1e361596d78bdcda..7dfffaec8c8120e0d972cef262582897e502a327 100644 (file)
@@ -6,8 +6,15 @@
 void*
 SysAlloc(uintptr n)
 {
+       void *v;
+
        mstats.sys += n;
-       return runtime_mmap(nil, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0);
+       v = runtime_mmap(nil, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0);
+       if(v < (void*)4096) {
+               printf("mmap: errno=%p\n", p);
+               throw("mmap");
+       }
+       return v;
 }
 
 void
@@ -25,3 +32,15 @@ SysFree(void *v, uintptr n)
        runtime_munmap(v, n);
 }
 
+
+void
+SysMemInit(void)
+{
+       // Code generators assume that references to addresses
+       // on the first page will fault.  Map the page explicitly with
+       // no permissions, to head off possible bugs like the system
+       // allocating that page as the virtual address space fills.
+       // Ignore any error, since other systems might be smart
+       // enough to never allow anything there.
+       runtime_mmap(nil, 4096, PROT_NONE, MAP_FIXED|MAP_ANON|MAP_PRIVATE, -1, 0);
+}
index ef8ef05d0379982b8b20ef60e505449598d59a7a..c1f58b2a0892b00718cebf185e1f9ac3d08ed678 100644 (file)
@@ -10,6 +10,7 @@ enum {
        PROT_EXEC = 0x4,
        MAP_ANON = 0x20,
        MAP_PRIVATE = 0x2,
+       MAP_FIXED = 0x10,
        SA_RESTART = 0x10000000,
        SA_ONSTACK = 0x8000000,
        SA_RESTORER = 0x4000000,
index c08e6b25d197293d5adaf858184ae29ea158bfc6..3e3d32f0d44f86c774d4f82fb12173585c0aac04 100644 (file)
@@ -10,6 +10,7 @@ enum {
        PROT_EXEC = 0x4,
        MAP_ANON = 0x20,
        MAP_PRIVATE = 0x2,
+       MAP_FIXED = 0x10,
        SA_RESTART = 0x10000000,
        SA_ONSTACK = 0x8000000,
        SA_RESTORER = 0x4000000,
index b139851715689f8e0607a43b2a92a8fc6a7c06ba..ff4ba3e7c948d38ed8eb9a64305fad81048c27cd 100644 (file)
@@ -10,6 +10,7 @@ enum {
        PROT_EXEC = 0x4,
        MAP_ANON = 0x20,
        MAP_PRIVATE = 0x2,
+       MAP_FIXED = 0x10,
        SA_RESTART = 0x10000000,
        SA_ONSTACK = 0x8000000,
        SA_RESTORER = 0x4000000,
index f3bdb61fa298872343bfd301ae65282e182b0f4b..2044fd60c9b9968edad8c3aab6cfb6fccd0dc5c9 100644 (file)
@@ -27,6 +27,7 @@ enum {
 
        $MAP_ANON = MAP_ANONYMOUS,
        $MAP_PRIVATE = MAP_PRIVATE,
+       $MAP_FIXED = MAP_FIXED,
 
        $SA_RESTART = SA_RESTART,
        $SA_ONSTACK = SA_ONSTACK,
index 4cfe4a7ed0114c52aa9bae7d667e8bf729649e6a..3c0b110fc99e6c1f0f23ad1e92e16c5c5eb965bf 100644 (file)
@@ -47,6 +47,7 @@ enum {
 
        $MAP_ANON = MAP_ANONYMOUS,
        $MAP_PRIVATE = MAP_PRIVATE,
+       $MAP_FIXED = MAP_FIXED,
 
        $SA_RESTART = SA_RESTART,
        $SA_ONSTACK = SA_ONSTACK,
index 2b197272c687c2a6dd90105f1739ac16041db98f..d30c5bec43f4179e50e2db67c55bf15b45e98657 100644 (file)
@@ -31,6 +31,7 @@ enum {
 
        $MAP_ANON = MAP_ANONYMOUS,
        $MAP_PRIVATE = MAP_PRIVATE,
+       $MAP_FIXED = MAP_FIXED,
 
        $SA_RESTART = SA_RESTART,
        $SA_ONSTACK = SA_ONSTACK,
index bad67001c4c47e92ce6b5d605d9f2dd0d032dc80..925e7fd342604847005ae3515e4d0bbb7fbbf512 100644 (file)
@@ -14,10 +14,10 @@ SysAlloc(uintptr n)
                if(p == (void*)EACCES) {
                        printf("mmap: access denied\n");
                        printf("If you're running SELinux, enable execmem for this process.\n");
-               } else {
-                       printf("mmap: errno=%p\n", p);
+                       exit(2);
                }
-               exit(2);
+               printf("mmap: errno=%p\n", p);
+               throw("mmap");
        }
        return p;
 }
@@ -37,3 +37,14 @@ SysFree(void *v, uintptr n)
        runtime_munmap(v, n);
 }
 
+void
+SysMemInit(void)
+{
+       // Code generators assume that references to addresses
+       // on the first page will fault.  Map the page explicitly with
+       // no permissions, to head off possible bugs like the system
+       // allocating that page as the virtual address space fills.
+       // Ignore any error, since other systems might be smart
+       // enough to never allow anything there.
+       runtime_mmap(nil, 4096, PROT_NONE, MAP_FIXED|MAP_ANON|MAP_PRIVATE, -1, 0);
+}
index 59aeba73985e9e2f03aa29375a2d092e91b0cdb3..fa7164ec57a1a4f01d7994e4492f8cc7492a88f9 100644 (file)
@@ -245,6 +245,7 @@ allocmcache(void)
 void
 mallocinit(void)
 {
+       SysMemInit();
        InitSizes();
        MHeap_Init(&mheap, SysAlloc);
        m->mcache = allocmcache();
index d7ee2535de846dafa408efca5063602127a5bb60..dbd541ae99f825be7cc4afc79fcbcee5a3df93f8 100644 (file)
@@ -138,7 +138,7 @@ struct MLink
 void*  SysAlloc(uintptr nbytes);
 void   SysFree(void *v, uintptr nbytes);
 void   SysUnused(void *v, uintptr nbytes);
-
+void   SysMemInit(void);
 
 // FixAlloc is a simple free-list allocator for fixed size objects.
 // Malloc uses a FixAlloc wrapped around SysAlloc to manages its
index 057ae04e521c68459b7b00e9308aeb2e7e035416..d3e4f4171a550a502effb7d7bbab55a7f29073ee 100644 (file)
@@ -31,3 +31,7 @@ SysFree(void *v, uintptr n)
        runtime_munmap(v, n);
 }
 
+void
+SysMemInit(void)
+{
+}
index 5b720a46a4d4bd7c343a3b1da783b250acc510bf..8c17b547719fce5a810b9937f835ad882b6976f8 100644 (file)
@@ -44,3 +44,7 @@ SysUnused(void *v, uintptr n)
        USED(v, n);
 }
 
+void
+SysMemInit(void)
+{
+}
index 735dda09da4fba7996ec589b298a2939dbc6dbb3..ad4efb20205ac061292b349d1cae992ab292003c 100644 (file)
@@ -33,3 +33,8 @@ SysFree(void *v, uintptr n)
 {
        stdcall(VirtualFree, 3, v, n, MEM_RELEASE);
 }
+
+void
+SysMemInit(void)
+{
+}