SHRL $12, BP
INT $0x80
CMPL AX, $0xfffff001
- JLS 2(PC)
- INT $3
+ JLS 3(PC)
+ NOTL AX
+ INCL AX
RET
// int32 futex(int32 *uaddr, int32 op, int32 val,
MOVL $9, AX // syscall entry
SYSCALL
CMPQ AX, $0xfffffffffffff001
- JLS 2(PC)
- CALL notok(SB)
+ JLS 3(PC)
+ NOTQ AX
+ INCQ AX
RET
TEXT notok(SB),7,$0
void*
SysAlloc(uintptr n)
{
+ void *p;
mstats.sys += n;
- return runtime_mmap(nil, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0);
+ p = runtime_mmap(nil, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0);
+ if(p < (void*)4096) {
+ 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);
+ }
+ return p;
}
void
byte *v;
v = runtime_mmap(nil, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, 0, 0);
+ if(v < (void *)4096) {
+ printf("mmap: errno=%p\n", v);
+ exit(2);
+ }
m->mem.nmmap += n;
return v;
}
m->mem.hunk =
runtime_mmap(nil, NHUNK, PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_ANON|MAP_PRIVATE, 0, 0);
+ if(m->mem.hunk < (void*)4096) {
+ *(uint32*)0xf1 = 0;
+ }
m->mem.nhunk = NHUNK;
m->mem.nmmap += NHUNK;
}
#define runtime_setcallerpc runtime·setcallerpc
#endif
+/*
+ * This is consistent across Linux and BSD.
+ * If a new OS is added that is different, move this to
+ * $GOOS/$GOARCH/defs.h.
+ */
+#define EACCES 13
+
/*
* low level go-called
*/