Fixed VREGION_FLAGS_MASK.
[barrelfish] / include / barrelfish / vregion.h
1 /**
2  * \file
3  * \brief Vregion definitions
4  */
5
6 /*
7  * Copyright (c) 2009, 2010, ETH Zurich.
8  * Copyright (c) 2014 HP Labs.
9  * All rights reserved.
10  *
11  * This file is distributed under the terms in the attached LICENSE file.
12  * If you do not find this file, copies can be found by writing to:
13  * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
14  */
15
16 #ifndef LIBBARRELFISH_VREGION_H
17 #define LIBBARRELFISH_VREGION_H
18
19 #include <sys/cdefs.h>
20
21 __BEGIN_DECLS
22
23 #define VREGION_FLAGS_READ     0x01 // Reading allowed
24 #define VREGION_FLAGS_WRITE    0x02 // Writing allowed
25 #define VREGION_FLAGS_EXECUTE  0x04 // Execute allowed
26 #define VREGION_FLAGS_NOCACHE  0x08 // Caching disabled
27 #define VREGION_FLAGS_MPB      0x10 // Message passing buffer
28 #define VREGION_FLAGS_GUARD    0x20 // Guard page
29 // XXX: figure out how to do this arch-independent(?) -SG, 2014-06-16
30 #define VREGION_FLAGS_LARGE    0x40 // Map large pages, if possible
31 #define VREGION_FLAGS_HUGE     0x80 // Map huge pages, if possible
32 #define VREGION_FLAGS_MASK     0xff // Mask of all individual VREGION_FLAGS
33
34 #define VREGION_FLAGS_READ_WRITE \
35     (VREGION_FLAGS_READ | VREGION_FLAGS_WRITE)
36 #define VREGION_FLAGS_READ_EXECUTE \
37     (VREGION_FLAGS_READ | VREGION_FLAGS_EXECUTE)
38 #define VREGION_FLAGS_READ_WRITE_NOCACHE \
39     (VREGION_FLAGS_READ | VREGION_FLAGS_WRITE | VREGION_FLAGS_NOCACHE)
40 #define VREGION_FLAGS_READ_WRITE_MPB \
41     (VREGION_FLAGS_READ | VREGION_FLAGS_WRITE | VREGION_FLAGS_MPB)
42
43 struct vregion {
44     struct vspace *vspace;   ///< A vregion is always associated with one vspace
45     struct memobj *memobj;   ///< A vregion is always associated with one memobj
46     genvaddr_t offset;       ///< Offset into the memobj
47     genvaddr_t size;         ///< Size of the vregion
48     genvaddr_t base;         ///< Base address of the vregion
49     vregion_flags_t flags;   ///< Flags
50     struct vregion *next;    ///< Pointer for the list in vspace
51 };
52
53 /**
54  * \brief Get the vspace associated with the vregion
55  *
56  * \param vregion  The vregion
57  */
58 static inline struct vspace *vregion_get_vspace(struct vregion *vregion)
59 {
60     return vregion->vspace;
61 }
62
63 /**
64  * \brief Get the memory object associated with the region
65  *
66  * \param vregion  The region
67  */
68 static inline struct memobj* vregion_get_memobj(struct vregion *vregion)
69 {
70     return vregion->memobj;
71 }
72
73 /**
74  * \brief Get the base address of the region
75  *
76  * \param piont  The region
77  */
78 static inline genvaddr_t vregion_get_base_addr(struct vregion *vregion)
79 {
80     return vregion->base;
81 }
82
83 /**
84  * \brief Get the offset into the memory object the vregion has
85  *
86  * \param vregion  The region
87  */
88 static inline size_t vregion_get_offset(struct vregion *vregion)
89 {
90     return vregion->offset;
91 }
92
93 /**
94  * \brief Get the size of the region
95  *
96  * \param vregion  The region
97  */
98 static inline size_t vregion_get_size(struct vregion *vregion)
99 {
100     return vregion->size;
101 }
102
103 /**
104  * \brief Get the flags/attributes of the region
105  *
106  * \param vregion  The region
107  */
108 static inline vregion_flags_t vregion_get_flags(struct vregion *vregion)
109 {
110     return vregion->flags;
111 }
112
113 errval_t vregion_map(struct vregion* point, struct vspace* vspace, struct memobj* memobj,
114                      size_t offset, size_t size, vregion_flags_t flags);
115 errval_t vregion_map_aligned(struct vregion* point, struct vspace* vspace,
116                              struct memobj* memobj, size_t offset, size_t size,
117                              vregion_flags_t flags, size_t alignment);
118 errval_t vregion_map_fixed(struct vregion* point, struct vspace* vspace, struct memobj* memobj,
119                            size_t offset, size_t size, genvaddr_t addr,
120                            vregion_flags_t flags);
121 errval_t vregion_destroy(struct vregion* region);
122 errval_t vregion_pagefault_handler(struct vregion* region, genvaddr_t addr,
123                                    vm_fault_type_t type);
124
125 __END_DECLS
126
127 #endif // LIBBARRELFISH_VREGION_H