v2 / vlib / builtin / linux_bare / old / mm_bare.v
56 lines · 46 sloc · 1.12 KB · 7d57a19d7e4924b0da97185fefb4191e677d2639
Raw
1module builtin
2
3const mem_prot = Mm_prot(int(Mm_prot.prot_read) | int(Mm_prot.prot_write))
4const mem_flags = Map_flags(int(Map_flags.map_private) | int(Map_flags.map_anonymous))
5const page_size = u64(Linux_mem.page_size)
6
7pub fn mm_pages(size u64) u32 {
8 pages := (size + u64(4) + page_size) / page_size
9 return u32(pages)
10}
11
12pub fn mm_alloc(size u64) (&u8, Errno) {
13 pages := mm_pages(size)
14 n_bytes := u64(pages * u32(Linux_mem.page_size))
15
16 a, e := sys_mmap(0, n_bytes, mem_prot, mem_flags, -1, 0)
17 if e == .enoerror {
18 mut ap := &int(a)
19 *ap = pages
20 return &u8(a + 4), e
21 }
22 return &u8(unsafe { nil }), e
23}
24
25pub fn mm_free(addr &u8) Errno {
26 ap := &int(addr - 4)
27 size := u64(*ap) * u64(Linux_mem.page_size)
28
29 return sys_munmap(ap, size)
30}
31
32pub fn mem_copy(dest0 voidptr, src0 voidptr, n isize) voidptr {
33 mut dest := &u8(dest0)
34 src := &u8(src0)
35 for i in 0 .. n {
36 dest[i] = src[i]
37 }
38 return dest0
39}
40
41@[unsafe]
42pub fn malloc(n isize) &u8 {
43 if n < 0 {
44 panic('malloc(<0)')
45 }
46
47 ptr, e := mm_alloc(u64(n))
48 assert e == .enoerror
49 assert !isnil(ptr)
50 return ptr
51}
52
53@[unsafe]
54pub fn free(ptr voidptr) {
55 assert mm_free(ptr) == .enoerror
56}
57