aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/builtin/linux_bare/memory_managment.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/builtin/linux_bare/memory_managment.v')
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/memory_managment.v29
1 files changed, 29 insertions, 0 deletions
diff --git a/v_windows/v/vlib/builtin/linux_bare/memory_managment.v b/v_windows/v/vlib/builtin/linux_bare/memory_managment.v
new file mode 100644
index 0000000..9c23dcf
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/memory_managment.v
@@ -0,0 +1,29 @@
+module builtin
+
+fn mm_alloc(size u64) (&byte, Errno) {
+ // BEGIN CONSTS
+ // the constants need to be here, since the initialization of other constants,
+ // which happen before these ones would, require malloc
+ mem_prot := MemProt(int(MemProt.prot_read) | int(MemProt.prot_write))
+ map_flags := MapFlags(int(MapFlags.map_private) | int(MapFlags.map_anonymous))
+ // END CONSTS
+
+ a, e := sys_mmap(&byte(0), size + sizeof(u64), mem_prot, map_flags, -1, 0)
+ if e == .enoerror {
+ unsafe {
+ mut ap := &u64(a)
+ *ap = size
+ x2 := &byte(a + sizeof(u64))
+ return x2, e
+ }
+ }
+ return &byte(0), e
+}
+
+fn mm_free(addr &byte) Errno {
+ unsafe {
+ ap := &u64(addr - sizeof(u64))
+ size := *ap
+ return sys_munmap(addr - sizeof(u64), size + sizeof(u64))
+ }
+}