Coverage Report

Created: 2017-04-15 07:07

/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
12.3k
#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
24.7k
static int page_mode_to_prot_mode(int page_mode) {
22
24.7k
    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
12.3k
    case (MVM_PAGE_READ|MVM_PAGE_WRITE):
28
12.3k
        return PROT_READ|PROT_WRITE;
29
0
    case MVM_PAGE_EXEC:
30
0
        return PROT_EXEC;
31
12.3k
    case (MVM_PAGE_READ|MVM_PAGE_EXEC):
32
12.3k
        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
24.7k
    }
40
24.7k
}
41
42
void *MVM_platform_alloc_pages(size_t size, int page_mode)
43
12.3k
{
44
12.3k
    int prot_mode = page_mode_to_prot_mode(page_mode);
45
12.3k
    void *block = mmap(NULL, size, prot_mode, MVM_MAP_ANON | MAP_PRIVATE, -1, 0);
46
12.3k
47
12.3k
    if (block == MAP_FAILED)
48
0
        MVM_panic(1, "MVM_platform_alloc_pages failed: %d", errno);
49
12.3k
50
12.3k
    return block;
51
12.3k
}
52
53
12.3k
int MVM_platform_set_page_mode(void * block, size_t size, int page_mode) {
54
12.3k
    int prot_mode = page_mode_to_prot_mode(page_mode);
55
12.3k
    return mprotect(block, size, prot_mode) == 0;
56
12.3k
}
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.43k
{
65
1.43k
    void *block = mmap(NULL, size,
66
0
        writable ? PROT_READ | PROT_WRITE : PROT_READ,
67
1.43k
        writable ? MAP_SHARED : MAP_PRIVATE, fd, 0);
68
1.43k
69
1.43k
    (void)handle;
70
1.43k
    return block != MAP_FAILED ? block : NULL;
71
1.43k
}
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
}