Coverage Report

Created: 2018-07-03 15:31

/home/travis/build/MoarVM/MoarVM/src/platform/posix/mmap.c
Line
Count
Source (jump to first uncovered line)
1
#include <stddef.h>
2
#include <sys/mman.h>
3
#include "moar.h"
4
#include "platform/mmap.h"
5
#include <errno.h>
6
7
/* MAP_ANONYMOUS is Linux, MAP_ANON is BSD */
8
#ifndef MVM_MAP_ANON
9
10
#if defined(MAP_ANONYMOUS)
11
10.7k
#define MVM_MAP_ANON MAP_ANONYMOUS
12
13
#elif defined(MAP_ANON)
14
#define MVM_MAP_ANON MAP_ANON
15
16
#else
17
#error "Anonymous mmap() not supported. You need to define MVM_MAP_ANON manually if it is."
18
#endif
19
#endif
20
21
21.4k
static int page_mode_to_prot_mode(int page_mode) {
22
21.4k
    switch (page_mode) {
23
0
    case MVM_PAGE_READ:
24
0
        return PROT_READ;
25
0
    case MVM_PAGE_WRITE:
26
0
        return PROT_WRITE;
27
10.7k
    case (MVM_PAGE_READ|MVM_PAGE_WRITE):
28
10.7k
        return PROT_READ|PROT_WRITE;
29
0
    case MVM_PAGE_EXEC:
30
0
        return PROT_EXEC;
31
10.7k
    case (MVM_PAGE_READ|MVM_PAGE_EXEC):
32
10.7k
        return PROT_READ|PROT_EXEC;
33
0
    case (MVM_PAGE_WRITE|MVM_PAGE_EXEC):
34
0
        return PROT_WRITE|PROT_EXEC;
35
0
    case (MVM_PAGE_READ|MVM_PAGE_WRITE|MVM_PAGE_EXEC):
36
0
        return PROT_READ|PROT_WRITE|PROT_EXEC;
37
0
    default:
38
0
        return PROT_NONE;
39
21.4k
    }
40
21.4k
}
41
42
void *MVM_platform_alloc_pages(size_t size, int page_mode)
43
10.7k
{
44
10.7k
    int prot_mode = page_mode_to_prot_mode(page_mode);
45
10.7k
    void *block = mmap(NULL, size, prot_mode, MVM_MAP_ANON | MAP_PRIVATE, -1, 0);
46
10.7k
47
10.7k
    if (block == MAP_FAILED)
48
0
        MVM_panic(1, "MVM_platform_alloc_pages failed: %d", errno);
49
10.7k
50
10.7k
    return block;
51
10.7k
}
52
53
10.7k
int MVM_platform_set_page_mode(void * block, size_t size, int page_mode) {
54
10.7k
    int prot_mode = page_mode_to_prot_mode(page_mode);
55
10.7k
    return mprotect(block, size, prot_mode) == 0;
56
10.7k
}
57
58
int MVM_platform_free_pages(void *block, size_t size)
59
0
{
60
0
    return munmap(block, size) == 0;
61
0
}
62
63
void *MVM_platform_map_file(int fd, void **handle, size_t size, int writable)
64
1.58k
{
65
1.58k
    void *block = mmap(NULL, size,
66
0
        writable ? PROT_READ | PROT_WRITE : PROT_READ,
67
1.58k
        writable ? MAP_SHARED : MAP_PRIVATE, fd, 0);
68
1.58k
69
1.58k
    (void)handle;
70
1.58k
    return block != MAP_FAILED ? block : NULL;
71
1.58k
}
72
73
int MVM_platform_unmap_file(void *block, void *handle, size_t size)
74
0
{
75
0
    (void)handle;
76
0
    return munmap(block, size) == 0;
77
0
}