summaryrefslogtreecommitdiff
path: root/rts/ExecPage.c
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2021-07-12 20:07:59 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-07-27 04:47:51 -0400
commit0e875c3f1d7373812ddae9962edfc9538465d2ed (patch)
tree49a86dcbe6b875c042dc3e21070114a8cd4d5471 /rts/ExecPage.c
parent3b07d8270341725c862230d8aec213fe34bd9fb6 (diff)
downloadhaskell-0e875c3f1d7373812ddae9962edfc9538465d2ed.tar.gz
rts: Introduce and use ExecPage abstraction
Here we introduce a very thin abstraction for allocating, filling, and freezing executable pages to replace allocateExec.
Diffstat (limited to 'rts/ExecPage.c')
-rw-r--r--rts/ExecPage.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/rts/ExecPage.c b/rts/ExecPage.c
new file mode 100644
index 0000000000..6f5b6e281a
--- /dev/null
+++ b/rts/ExecPage.c
@@ -0,0 +1,24 @@
+/*
+ * Utilities for managing dynamically-allocated executable pages.
+ *
+ * These are primarily used to back the adjustor code produced by the native
+ * adjustor implementations.
+ */
+
+#include "Rts.h"
+#include "LinkerInternals.h"
+#include "sm/OSMem.h"
+
+ExecPage *allocateExecPage() {
+ ExecPage *page = (ExecPage *) mmapAnonForLinker(getPageSize());
+ return page;
+}
+
+void freezeExecPage(ExecPage *page) {
+ mmapForLinkerMarkExecutable(page, getPageSize());
+ flushExec(getPageSize(), page);
+}
+
+void freeExecPage(ExecPage *page) {
+ munmapForLinker(page, getPageSize(), "freeExecPage");
+}