Merge branch 'arrakis'
[barrelfish] / include / barrelfish_kpi / capabilities.h
1 /**
2  * \file
3  * \brief Essential capability definitions.
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #ifndef BARRELFISH_CAPABILITIES_H
16 #define BARRELFISH_CAPABILITIES_H
17
18 /* FIXME: OBJBITS defines must match sizes in Hamlet's capabilities/caps.hl */
19
20 // Size of CNode entry
21 #define OBJBITS_CTE             7
22
23 // Size of dispatcher
24 #define OBJBITS_DISPATCHER     10
25
26 // Size of kernel control block
27 #define OBJBITS_KCB            16
28
29 #ifndef __ASSEMBLER__
30
31 #include <assert.h>
32 #include <stdbool.h>
33 #include <barrelfish_kpi/types.h>
34
35 #define CAPRIGHTS_READ          (1 << 0)
36 #define CAPRIGHTS_WRITE         (1 << 1)
37 #define CAPRIGHTS_EXECUTE       (1 << 2)
38 #define CAPRIGHTS_GRANT         (1 << 3)
39 #define CAPRIGHTS_IDENTIFY      (1 << 4)
40 #define CAPRIGHTS_NUM           5
41
42 #define CAPRIGHTS_ALLRIGHTS     ((1 << CAPRIGHTS_NUM) - 1)
43 #define CAPRIGHTS_READ_WRITE    (CAPRIGHTS_READ | CAPRIGHTS_WRITE)
44 #define CAPRIGHTS_NORIGHTS      0
45
46 typedef uint8_t         CapRights;
47 #define PRIuCAPRIGHTS PRIu8
48 #define PRIxCAPRIGHTS PRIx8
49
50 struct dcb;
51
52 // capbits needs CapRights and dcb;
53 #include <barrelfish_kpi/capbits.h>
54
55 static inline bool type_is_vnode(enum objtype type)
56 {
57     STATIC_ASSERT(27 == ObjType_Num, "Check VNode definitions");
58
59     return (type == ObjType_VNode_x86_64_pml4 ||
60             type == ObjType_VNode_x86_64_pdpt ||
61             type == ObjType_VNode_x86_64_pdir ||
62             type == ObjType_VNode_x86_64_ptable ||
63             type == ObjType_VNode_x86_32_pdpt ||
64             type == ObjType_VNode_x86_32_pdir ||
65             type == ObjType_VNode_x86_32_ptable ||
66             type == ObjType_VNode_ARM_l2 ||
67             type == ObjType_VNode_ARM_l1
68            );
69 }
70
71 /**
72  * Return size of vnode in bits. This is the size of a page table page.
73  *
74  * @param type Object type.
75  *
76  * @return Number of bits represented by a VNode.
77  */
78 static inline size_t vnode_objbits(enum objtype type)
79 {
80     // This function should be emitted by hamlet or somesuch.
81     STATIC_ASSERT(27 == ObjType_Num, "Check VNode definitions");
82
83     if (type == ObjType_VNode_x86_64_pml4 ||
84         type == ObjType_VNode_x86_64_pdpt ||
85         type == ObjType_VNode_x86_64_pdir ||
86         type == ObjType_VNode_x86_64_ptable ||
87         type == ObjType_VNode_x86_32_pdpt ||
88         type == ObjType_VNode_x86_32_pdir ||
89         type == ObjType_VNode_x86_32_ptable)
90     {
91         return 12;      // BASE_PAGE_BITS
92     }
93     else if (type == ObjType_VNode_ARM_l1)
94     {
95         return 14;
96     }
97     else if (type == ObjType_VNode_ARM_l2)
98     {
99         return 12;
100     }
101
102     assert(0 && !"Page table size unknown.");
103     return 0;
104 }
105
106 /**
107  * Return number of page table entries for vnode in bits.
108  * @param type Object type.
109  * @return Number of page table entries in bits
110  */
111 static inline size_t vnode_entry_bits(enum objtype type) {
112     // This function should be emitted by hamlet or somesuch.
113     STATIC_ASSERT(27 == ObjType_Num, "Check VNode definitions");
114
115     if (type == ObjType_VNode_x86_64_pml4 ||
116         type == ObjType_VNode_x86_64_pdpt ||
117         type == ObjType_VNode_x86_64_pdir ||
118         type == ObjType_VNode_x86_64_ptable)
119     {
120         return 9;      // log2(X86_64_PTABLE_SIZE)
121     }
122 #ifdef CONFIG_PAE
123     if (type == ObjType_VNode_x86_32_pdpt)
124     {
125         return 2;       // log2(X86_32_PDPTE_SIZE)
126     }
127     else if (type == ObjType_VNode_x86_32_pdir ||
128              type == ObjType_VNode_x86_32_ptable)
129     {
130         return 9;       // log2(X86_32_PTABLE_SIZE) == log2(X86_32_PDIR_SIZE)
131     }
132 #else
133     if (type == ObjType_VNode_x86_32_pdir ||
134         type == ObjType_VNode_x86_32_ptable)
135     {
136         return 10;      // log2(X86_32_PTABLE_SIZE) == log2(X86_32_PDIR_SIZE)
137     }
138 #endif
139     if (type == ObjType_VNode_ARM_l2)
140     {
141         return 9;       // log2(ARM_L2_MAX_ENTRIES)
142     }
143     else if (type == ObjType_VNode_ARM_l1)
144     {
145         return 12;      // log2(ARM_L1_MAX_ENTRIES)
146     }
147
148     assert(!"unknown page table type");
149     return 0;
150 }
151
152
153 /**
154  * CNode capability commands.
155  */
156 enum cnode_cmd {
157     CNodeCmd_Copy,      ///< Copy capability
158     CNodeCmd_Mint,      ///< Mint capability
159     CNodeCmd_Retype,    ///< Retype capability
160     CNodeCmd_Delete,    ///< Delete capability
161     CNodeCmd_Revoke,    ///< Revoke capability
162     CNodeCmd_Create,    ///< Create capability
163     CNodeCmd_GetState,  ///< Get distcap state for capability
164 };
165
166 enum vnode_cmd {
167     VNodeCmd_Map,
168     VNodeCmd_Unmap,
169     VNodeCmd_Identify,   ///< Return the physical address of the VNode
170 };
171
172 /**
173  * Kernel capabilities commands.
174  * Monitor's invocations of capability operations
175  * which the kernel will not subject to cross core checks
176  */
177 enum kernel_cmd {
178     KernelCmd_Spawn_core,         ///< Spawn a new kernel
179     KernelCmd_Identify_cap,       ///< Return the meta data of a capability
180     KernelCmd_Identify_domains_cap, ///< Return the meta data of another domain's capability
181     KernelCmd_Remote_relations,   ///< Set capability as being remote
182     KernelCmd_Cap_has_relations,      ///< Return presence of local relations
183     KernelCmd_Create_cap,         ///< Create a new capability
184     KernelCmd_Copy_existing,
185     KernelCmd_Get_core_id,        ///< Returns the id of the core the domain is on
186     KernelCmd_Get_arch_id,        ///< Returns arch id of caller's core
187     KernelCmd_Nullify_cap,        ///< Set the capability to NULL allowed it to be reused
188     KernelCmd_Setup_trace,        ///< Set up trace buffer
189     KernelCmd_Register,           ///< Register monitor notify endpoint
190     KernelCmd_Domain_Id,          ///< Set domain ID of dispatcher
191     KernelCmd_Get_cap_owner,
192     KernelCmd_Set_cap_owner,
193     KernelCmd_Lock_cap,
194     KernelCmd_Unlock_cap,
195     KernelCmd_Delete_last,
196     KernelCmd_Delete_foreigns,
197     KernelCmd_Revoke_mark_target,
198     KernelCmd_Revoke_mark_relations,
199     KernelCmd_Delete_step,
200     KernelCmd_Clear_step,
201     KernelCmd_Retype,
202     KernelCmd_Has_descendants,
203     KernelCmd_Sync_timer,
204     KernelCmd_Spawn_SCC_Core,
205     KernelCmd_IPI_Register,
206     KernelCmd_IPI_Delete,
207     KernelCmd_GetGlobalPhys,
208     KernelCmd_Add_kcb,            ///< add extra kcb to be scheduled
209     KernelCmd_Remove_kcb,         ///< remove kcb from scheduling ring
210     KernelCmd_Suspend_kcb_sched,  ///< suspend/resume kcb scheduler
211     KernelCmd_Count
212 };
213
214 /**
215  * Specific commands for dispatcher capabilities.
216  */
217 enum dispatcher_cmd {
218     DispatcherCmd_Setup,            ///< Set dispatcher parameters
219     DispatcherCmd_Properties,       ///< Set dispatcher properties
220     DispatcherCmd_PerfMon,          ///< Performance monitoring
221     DispatcherCmd_SetupGuest,       ///< Set up the DCB of a guest domain
222     DispatcherCmd_DumpPTables,      ///< Dump hw page tables of dispatcher
223     DispatcherCmd_DumpCapabilities  ///< Dump capabilities of dispatcher
224     DispatcherCmd_Vmread,           ///< Execute vmread on the current and active VMCS      
225     DispatcherCmd_Vmwrite,          ///< Execute vmwrite on the current and active VMCS
226     DispatcherCmd_Vmptrld,          ///< Make VMCS clear and inactive
227     DispatcherCmd_Vmclear           ///< Make VMCS current and active 
228 };
229
230 /**
231  * Frame capability commands.
232  */
233 enum frame_cmd {
234     FrameCmd_Identify,      ///< Return physical address of frame
235     FrameCmd_SCC_Identify,  ///< Return MC route to frame
236     FrameCmd_ModifyFlags,   ///< Modify flags for (part of) the mapped region of frame
237 };
238
239 /**
240  * IRQ Table capability commands.
241  */
242 enum irqtable_cmd {
243     IRQTableCmd_Alloc,  ///< Allocate new vector (XXX: HACK: this is x86 specific)
244     IRQTableCmd_Set,    ///< Set endpoint for IRQ# notifications
245     IRQTableCmd_Delete  ///< Remove notification endpoint for IRQ#
246 };
247
248 /**
249  * IO capability commands.
250  */
251 enum io_cmd {
252     IOCmd_Outb,         ///< Output byte to port
253     IOCmd_Outw,         ///< Output word to port
254     IOCmd_Outd,         ///< Output double word to port
255     IOCmd_Inb,          ///< Input byte from port
256     IOCmd_Inw,          ///< Input word from port
257     IOCmd_Ind           ///< Input double word from port
258 };
259
260 /**
261  * Notify capability commands.
262  */
263 enum notify_cmd {
264     NotifyCmd_Send
265 };
266
267
268 /**
269  * Performance monitoring commands.
270  * Seems to be already included in the Dispatcher capability.
271  */
272 enum perfmon_cmd {
273     PerfmonCmd_Activate,    ///< Activate performance counters
274     PerfmonCmd_Deactivate,  ///< Deactivate performance counters
275     PerfmonCmd_Write        ///< Read current performance counter values
276 };
277
278
279 /**
280  * ID capability commands.
281  */
282 enum id_cmd {
283     IDCmd_Identify  ///< Return system-wide unique ID
284 };
285
286 /**
287  * IPI capability commands
288  */
289
290 enum ipi_cmd {
291     IPICmd_Send_Start,     ///< Send Startup IPI to a destination core
292     IPICmd_Send_Init,      ///< Send Init IPI to a destination core
293 };
294 /**
295  * Maximum command ordinal.
296  */
297 #define CAP_MAX_CMD KernelCmd_Count
298
299 /**
300  * \brief Values returned from frame identify invocation
301  */
302 struct frame_identity {
303     genpaddr_t base;   ///< Physical base address of frame
304     uint8_t bits;      ///< Size of frame, in bits
305 };
306
307 /**
308  * \brief Values returned from the VNode identify invocation
309  */
310 struct vnode_identity {
311     genpaddr_t base;   ///< Physical base address of the VNode
312     uint8_t type;      ///< Type of VNode
313 };
314
315 #ifdef __scc__
316 struct scc_frame_identity {
317     uint8_t route, subdest;
318     uint16_t addrbits;
319 };
320 #endif
321
322 #endif // __ASSEMBLER__
323
324 #endif // BARRELFISH_CAPABILITIES_H