aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/builtin/linux_bare/old/mm_bare.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/builtin/linux_bare/old/mm_bare.v')
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/mm_bare.v58
1 files changed, 58 insertions, 0 deletions
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/mm_bare.v b/v_windows/v/vlib/builtin/linux_bare/old/mm_bare.v
new file mode 100644
index 0000000..cee5f99
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/mm_bare.v
@@ -0,0 +1,58 @@
+module builtin
+
+const (
+ mem_prot = Mm_prot(int(Mm_prot.prot_read) | int(Mm_prot.prot_write))
+ mem_flags = Map_flags(int(Map_flags.map_private) | int(Map_flags.map_anonymous))
+ page_size = u64(Linux_mem.page_size)
+)
+
+pub fn mm_pages(size u64) u32 {
+ pages := (size + u64(4) + page_size) / page_size
+ return u32(pages)
+}
+
+pub fn mm_alloc(size u64) (&byte, Errno) {
+ pages := mm_pages(size)
+ n_bytes := u64(pages * u32(Linux_mem.page_size))
+
+ a, e := sys_mmap(0, n_bytes, mem_prot, mem_flags, -1, 0)
+ if e == .enoerror {
+ mut ap := &int(a)
+ *ap = pages
+ return &byte(a + 4), e
+ }
+ return &byte(0), e
+}
+
+pub fn mm_free(addr &byte) Errno {
+ ap := &int(addr - 4)
+ size := u64(*ap) * u64(Linux_mem.page_size)
+
+ return sys_munmap(ap, size)
+}
+
+pub fn mem_copy(dest0 voidptr, src0 voidptr, n int) voidptr {
+ mut dest := &byte(dest0)
+ src := &byte(src0)
+ for i in 0 .. n {
+ dest[i] = src[i]
+ }
+ return dest0
+}
+
+[unsafe]
+pub fn malloc(n int) &byte {
+ if n < 0 {
+ panic('malloc(<0)')
+ }
+
+ ptr, e := mm_alloc(u64(n))
+ assert e == .enoerror
+ assert !isnil(ptr)
+ return ptr
+}
+
+[unsafe]
+pub fn free(ptr voidptr) {
+ assert mm_free(ptr) == .enoerror
+}