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,
TEXT ·mmap(SB),7,$0
MOVL $197, AX
INT $0x80
- JAE 2(PC)
- CALL notok(SB)
RET
TEXT ·munmap(SB),7,$0
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,
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
$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,
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
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);
+}
PROT_EXEC = 0x4,
MAP_ANON = 0x1000,
MAP_PRIVATE = 0x2,
+ MAP_FIXED = 0x10,
SA_SIGINFO = 0x40,
SA_RESTART = 0x2,
SA_ONSTACK = 0x1,
STOSL
MOVL $477, AX
INT $0x80
- JAE 2(PC)
- CALL notok(SB)
RET
TEXT ·munmap(SB),7,$-4
PROT_EXEC = 0x4,
MAP_ANON = 0x1000,
MAP_PRIVATE = 0x2,
+ MAP_FIXED = 0x10,
SA_SIGINFO = 0x40,
SA_RESTART = 0x2,
SA_ONSTACK = 0x1,
MOVL 36(SP), R9 // arg 6 offset
MOVL $477, AX
SYSCALL
- JCC 2(PC)
- CALL notok(SB)
RET
TEXT ·munmap(SB),7,$0
$MAP_ANON = MAP_ANON,
$MAP_PRIVATE = MAP_PRIVATE,
+ $MAP_FIXED = MAP_FIXED,
$SA_SIGINFO = SA_SIGINFO,
$SA_RESTART = SA_RESTART,
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
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);
+}
PROT_EXEC = 0x4,
MAP_ANON = 0x20,
MAP_PRIVATE = 0x2,
+ MAP_FIXED = 0x10,
SA_RESTART = 0x10000000,
SA_ONSTACK = 0x8000000,
SA_RESTORER = 0x4000000,
PROT_EXEC = 0x4,
MAP_ANON = 0x20,
MAP_PRIVATE = 0x2,
+ MAP_FIXED = 0x10,
SA_RESTART = 0x10000000,
SA_ONSTACK = 0x8000000,
SA_RESTORER = 0x4000000,
PROT_EXEC = 0x4,
MAP_ANON = 0x20,
MAP_PRIVATE = 0x2,
+ MAP_FIXED = 0x10,
SA_RESTART = 0x10000000,
SA_ONSTACK = 0x8000000,
SA_RESTORER = 0x4000000,
$MAP_ANON = MAP_ANONYMOUS,
$MAP_PRIVATE = MAP_PRIVATE,
+ $MAP_FIXED = MAP_FIXED,
$SA_RESTART = SA_RESTART,
$SA_ONSTACK = SA_ONSTACK,
$MAP_ANON = MAP_ANONYMOUS,
$MAP_PRIVATE = MAP_PRIVATE,
+ $MAP_FIXED = MAP_FIXED,
$SA_RESTART = SA_RESTART,
$SA_ONSTACK = SA_ONSTACK,
$MAP_ANON = MAP_ANONYMOUS,
$MAP_PRIVATE = MAP_PRIVATE,
+ $MAP_FIXED = MAP_FIXED,
$SA_RESTART = SA_RESTART,
$SA_ONSTACK = SA_ONSTACK,
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;
}
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);
+}
void
mallocinit(void)
{
+ SysMemInit();
InitSizes();
MHeap_Init(&mheap, SysAlloc);
m->mcache = allocmcache();
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
runtime_munmap(v, n);
}
+void
+SysMemInit(void)
+{
+}
USED(v, n);
}
+void
+SysMemInit(void)
+{
+}
{
stdcall(VirtualFree, 3, v, n, MEM_RELEASE);
}
+
+void
+SysMemInit(void)
+{
+}