Merge branch 'arrakis'
[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 <barrelfish_kpi/types.h>
20 #include <sys/cdefs.h>
21
22 __BEGIN_DECLS
23
24 #define VREGION_FLAGS_READ     0x01 // Reading allowed
25 #define VREGION_FLAGS_WRITE    0x02 // Writing allowed
26 #define VREGION_FLAGS_EXECUTE  0x04 // Execute allowed
27 #define VREGION_FLAGS_NOCACHE  0x08 // Caching disabled
28 #define VREGION_FLAGS_MPB      0x10 // Message passing buffer
29 #define VREGION_FLAGS_GUARD    0x20 // Guard page
30 // XXX: figure out how to do this arch-independent(?) -SG, 2014-06-16
31 #define VREGION_FLAGS_LARGE    0x40 // Map large pages, if possible
32 #define VREGION_FLAGS_HUGE     0x80 // Map huge pages, if possible
33 #define VREGION_FLAGS_WRITE_COMBINING   0x100 // Write-combining caching
34 #define VREGION_FLAGS_MASK     0x1ff // Mask of all individual VREGION_FLAGS
35 #define VREGION_FLAGS_VTD_SNOOP  0x800 // Snooping (for pages) allowed by VT-d
36
37 #define VREGION_FLAGS_READ_WRITE \
38     (VREGION_FLAGS_READ | VREGION_FLAGS_WRITE | VREGION_FLAGS_VTD_SNOOP)
39 #define VREGION_FLAGS_READ_EXECUTE \
40     (VREGION_FLAGS_READ | VREGION_FLAGS_EXECUTE | VREGION_FLAGS_VTD_SNOOP)
41 #define VREGION_FLAGS_READ_WRITE_NOCACHE \
42     (VREGION_FLAGS_READ | VREGION_FLAGS_WRITE | VREGION_FLAGS_NOCACHE | VREGION_FLAGS_VTD_SNOOP)
43 #define VREGION_FLAGS_READ_WRITE_MPB \
44     (VREGION_FLAGS_READ | VREGION_FLAGS_WRITE | VREGION_FLAGS_MPB | VREGION_FLAGS_VTD_SNOOP)
45
46 struct vspace;
47 struct memobj;
48
49 struct vregion {
50     struct vspace *vspace;   ///< A vregion is always associated with one vspace
51     struct memobj *memobj;   ///< A vregion is always associated with one memobj
52     genvaddr_t offset;       ///< Offset into the memobj
53     genvaddr_t size;         ///< Size of the vregion
54     genvaddr_t base;         ///< Base address of the vregion
55     vregion_flags_t flags;   ///< Flags
56     struct vregion *next;    ///< Pointer for the list in vspace
57 };
58
59 /**
60  * \brief Get the vspace associated with the vregion
61  *
62  * \param vregion  The vregion
63  */
64 static inline struct vspace *vregion_get_vspace(struct vregion *vregion)
65 {
66     return vregion->vspace;
67 }
68
69 /**
70  * \brief Get the memory object associated with the region
71  *
72  * \param vregion  The region
73  */
74 static inline struct memobj* vregion_get_memobj(struct vregion *vregion)
75 {
76     return vregion->memobj;
77 }
78
79 /**
80  * \brief Get the base address of the region
81  *
82  * \param piont  The region
83  */
84 static inline genvaddr_t vregion_get_base_addr(struct vregion *vregion)
85 {
86     return vregion->base;
87 }
88
89 /**
90  * \brief Get the offset into the memory object the vregion has
91  *
92  * \param vregion  The region
93  */
94 static inline size_t vregion_get_offset(struct vregion *vregion)
95 {
96     return vregion->offset;
97 }
98
99 /**
100  * \brief Get the size of the region
101  *
102  * \param vregion  The region
103  */
104 static inline size_t vregion_get_size(struct vregion *vregion)
105 {
106     return vregion->size;
107 }
108
109 /**
110  * \brief Get the flags/attributes of the region
111  *
112  * \param vregion  The region
113  */
114 static inline vregion_flags_t vregion_get_flags(struct vregion *vregion)
115 {
116     return vregion->flags;
117 }
118
119 errval_t vregion_map(struct vregion* point, struct vspace* vspace, struct memobj* memobj,
120                      size_t offset, size_t size, vregion_flags_t flags);
121 errval_t vregion_map_aligned(struct vregion* point, struct vspace* vspace,
122                              struct memobj* memobj, size_t offset, size_t size,
123                              vregion_flags_t flags, size_t alignment);
124 errval_t vregion_map_fixed(struct vregion* point, struct vspace* vspace, struct memobj* memobj,
125                            size_t offset, size_t size, genvaddr_t addr,
126                            vregion_flags_t flags);
127 errval_t vregion_destroy(struct vregion* region);
128 errval_t vregion_pagefault_handler(struct vregion* region, genvaddr_t addr,
129                                    vm_fault_type_t type);
130
131 __END_DECLS
132
133 #endif // LIBBARRELFISH_VREGION_H