summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mk/__memperm.d9
-rw-r--r--mk/all.mk1
-rw-r--r--mk/deps.mk4
-rw-r--r--src/__memperm.c36
-rw-r--r--src/_forced/mmap.h1
-rw-r--r--src/_memperm.h9
6 files changed, 60 insertions, 0 deletions
diff --git a/mk/__memperm.d b/mk/__memperm.d
new file mode 100644
index 00000000..83eff260
--- /dev/null
+++ b/mk/__memperm.d
@@ -0,0 +1,9 @@
+libc_C.0: libc.a(__memperm.o)
+libc.a(__memperm.o): $(OBJDIR)/__memperm.o
+ @$(AR) $(ARFLAGS) $@ $(OBJDIR)/$%
+
+$(OBJDIR)/__memperm.o: src/__memperm.c
+$(OBJDIR)/__memperm.o: src/_memperm.h
+$(OBJDIR)/__memperm.o:
+ @mkdir -p $(@D)
+ $(CC) -c -o $@ $(CFLAGS) src/__memperm.c
diff --git a/mk/all.mk b/mk/all.mk
index dc4370a3..4b6eb27a 100644
--- a/mk/all.mk
+++ b/mk/all.mk
@@ -1,4 +1,5 @@
include mk/__undefined.d
+include mk/__memperm.d
include mk/ctan.d
include mk/catan.d
include mk/ccos.d
diff --git a/mk/deps.mk b/mk/deps.mk
index c9715488..d60a5357 100644
--- a/mk/deps.mk
+++ b/mk/deps.mk
@@ -6,6 +6,10 @@ all: mk/__undefined.d
mk/__undefined.d: src/__undefined.c
sh mk/deps.sh src/__undefined.c
+all: mk/__memperm.d
+mk/__memperm.d: src/__memperm.c
+ sh mk/deps.sh src/__memperm.c
+
all: mk/ctan.d
mk/ctan.d: src/complex/ctan.c
sh mk/deps.sh src/complex/ctan.c
diff --git a/src/__memperm.c b/src/__memperm.c
new file mode 100644
index 00000000..e3bcd64d
--- /dev/null
+++ b/src/__memperm.c
@@ -0,0 +1,36 @@
+#include <inttypes.h>
+#include <stdio.h>
+#include "_memperm.h"
+
+int __memperm(void *ptr)
+{
+ uintptr_t addr = (uintptr_t)ptr;
+ int ret = PROT_NONE;
+
+ FILE *map = fopen("/proc/self/maps", "r");
+ if (map == NULL) {
+ return -1;
+ }
+
+ while (!feof(map)) {
+ uintmax_t low = 0;
+ uintmax_t high = 0;
+ char perms[5];
+ fscanf(map, "%ju-%ju %4s%*s\n", &low, &high, perms);
+ if (low <= addr && high >= addr) {
+ if (perms[0] == 'r') {
+ ret |= PROT_READ;
+ }
+ if (perms[1] == 'w') {
+ ret |= PROT_WRITE;
+ }
+ if (perms[2] == 'x') {
+ ret |= PROT_EXEC;
+ }
+ break;
+ }
+ }
+
+ fclose(map);
+ return ret;
+}
diff --git a/src/_forced/mmap.h b/src/_forced/mmap.h
index 65c1ef01..24256479 100644
--- a/src/_forced/mmap.h
+++ b/src/_forced/mmap.h
@@ -5,6 +5,7 @@
#define PROT_NONE 0x0
#define PROT_READ 0x1
#define PROT_WRITE 0x2
+#define PROT_EXEC 0x4
#define MAP_PRIVATE 0x02
#define MAP_FAILED (void*)(-1)
#define MAP_ANONYMOUS (0x20)
diff --git a/src/_memperm.h b/src/_memperm.h
new file mode 100644
index 00000000..d32d93f8
--- /dev/null
+++ b/src/_memperm.h
@@ -0,0 +1,9 @@
+#ifndef ___MEMPERM_H__
+#define ___MEMPERM_H__
+
+/* for PROT_READ, PROT_WRITE, and PROT_EXEC */
+#include "_forced/mmap.h"
+
+int __memperm(void *);
+
+#endif