T238: fix renaming mistake
[barrelfish] / include / barrelfish_kpi / capabilities.h
1 /**
2  * \file
3  * \brief Essential capability definitions.
4  */
5
6 /*
7  * Copyright (c) 2007-2012, ETH Zurich.
8  * Copyright (c) 2015, Hewlett Packard Enterprise Development LP.
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 BARRELFISH_CAPABILITIES_H
17 #define BARRELFISH_CAPABILITIES_H
18
19 /* FIXME: OBJBITS defines must match sizes in Hamlet's capabilities/caps.hl */
20
21 // Size of CNode entry
22 #define OBJBITS_CTE             6
23
24 // Size of dispatcher
25 #define OBJBITS_DISPATCHER     10
26
27 // Size of kernel control block
28 #define OBJBITS_KCB            16
29
30 #ifndef __ASSEMBLER__
31
32 #include <assert.h>
33 #include <stdbool.h>
34 #include <barrelfish_kpi/types.h>
35
36 #define CAPRIGHTS_READ          (1 << 0)
37 #define CAPRIGHTS_WRITE         (1 << 1)
38 #define CAPRIGHTS_EXECUTE       (1 << 2)
39 #define CAPRIGHTS_GRANT         (1 << 3)
40 #define CAPRIGHTS_IDENTIFY      (1 << 4)
41 #define CAPRIGHTS_NUM           5
42
43 #define CAPRIGHTS_ALLRIGHTS     ((1 << CAPRIGHTS_NUM) - 1)
44 #define CAPRIGHTS_READ_WRITE    (CAPRIGHTS_READ | CAPRIGHTS_WRITE)
45 #define CAPRIGHTS_NORIGHTS      0
46
47 typedef uint8_t         CapRights;
48 #define PRIuCAPRIGHTS PRIu8
49 #define PRIxCAPRIGHTS PRIx8
50
51 struct dcb;
52
53 // capbits needs CapRights and dcb;
54 #include <barrelfish_kpi/capbits.h>
55
56 static inline bool type_is_vnode(enum objtype type)
57 {
58     STATIC_ASSERT(46 == ObjType_Num, "Check VNode definitions");
59
60     return (type == ObjType_VNode_x86_64_pml4 ||
61             type == ObjType_VNode_x86_64_pdpt ||
62             type == ObjType_VNode_x86_64_pdir ||
63             type == ObjType_VNode_x86_64_ptable ||
64             type == ObjType_VNode_x86_32_pdpt ||
65             type == ObjType_VNode_x86_32_pdir ||
66             type == ObjType_VNode_x86_32_ptable ||
67             type == ObjType_VNode_AARCH64_l3 ||
68             type == ObjType_VNode_AARCH64_l2 ||
69             type == ObjType_VNode_AARCH64_l1 ||
70             type == ObjType_VNode_ARM_l2 ||
71             type == ObjType_VNode_ARM_l1
72            );
73 }
74
75 /**
76  * Return size of vnode in bits. This is the size of a page table page.
77  *
78  * @param type Object type.
79  *
80  * @return Number of bits a VNode object occupies.
81  */
82 static inline size_t vnode_objbits(enum objtype type)
83 {
84     // This function should be emitted by hamlet or somesuch.
85     STATIC_ASSERT(46 == ObjType_Num, "Check VNode definitions");
86
87     if (type == ObjType_VNode_x86_64_pml4 ||
88         type == ObjType_VNode_x86_64_pdpt ||
89         type == ObjType_VNode_x86_64_pdir ||
90         type == ObjType_VNode_x86_64_ptable ||
91         type == ObjType_VNode_x86_32_pdpt ||
92         type == ObjType_VNode_x86_32_pdir ||
93         type == ObjType_VNode_x86_32_ptable)
94     {
95         return 12;
96     }
97     else if (type == ObjType_VNode_AARCH64_l1 ||
98              type == ObjType_VNode_AARCH64_l2 ||
99              type == ObjType_VNode_AARCH64_l3)
100     {
101         return 12;
102     }
103     else if (type == ObjType_VNode_ARM_l1)
104     {
105         return 14;
106     }
107     else if (type == ObjType_VNode_ARM_l2)
108     {
109         // XXX: should be 1024, once we get around to untangling the ARMv7
110         // page table mess, cf. T243.
111         return 12;
112     }
113
114     assert(0 && !"Page table size unknown.");
115     return 0;
116 }
117
118 /**
119  * Return size of vnode in bytes. This is the size of a page table page.
120  *
121  * @param type Object type.
122  *
123  * @return Size of a VNode in bytes.
124  */
125 static inline size_t vnode_objsize(enum objtype type)
126 {
127     // This function should be emitted by hamlet or somesuch.
128     STATIC_ASSERT(46 == ObjType_Num, "Check VNode definitions");
129
130     if (type == ObjType_VNode_x86_64_pml4 ||
131         type == ObjType_VNode_x86_64_pdpt ||
132         type == ObjType_VNode_x86_64_pdir ||
133         type == ObjType_VNode_x86_64_ptable ||
134         type == ObjType_VNode_x86_32_pdpt ||
135         type == ObjType_VNode_x86_32_pdir ||
136         type == ObjType_VNode_x86_32_ptable)
137     {
138         // XXX: cannot use BASE_PAGE_SIZE here because asmoffsets does not
139         // include the right files
140         return 4096; // BASE_PAGE_SIZE
141     }
142     else if (type == ObjType_VNode_AARCH64_l1 ||
143              type == ObjType_VNode_AARCH64_l2 ||
144              type == ObjType_VNode_AARCH64_l3)
145     {
146         return 4096;
147     }
148     else if (type == ObjType_VNode_ARM_l1)
149     {
150         // ARMv7 L1 page table is 16kB.
151         return 16384;
152     }
153     else if (type == ObjType_VNode_ARM_l2)
154     {
155         // XXX: should be 1024, once we get around to untangling the ARMv7
156         // page table mess, cf. T243.
157         return 4096;
158     }
159
160     assert(0 && !"Page table size unknown.");
161     return 0;
162 }
163
164 /**
165  * Return number of page table entries for vnode in bits.
166  * @param type Object type.
167  * @return Number of page table entries in bits
168  */
169 static inline size_t vnode_entry_bits(enum objtype type) {
170     // This function should be emitted by hamlet or somesuch.
171     STATIC_ASSERT(46 == ObjType_Num, "Check VNode definitions");
172
173     if (type == ObjType_VNode_x86_64_pml4 ||
174         type == ObjType_VNode_x86_64_pdpt ||
175         type == ObjType_VNode_x86_64_pdir ||
176         type == ObjType_VNode_x86_64_ptable)
177     {
178         return 9;      // log2(X86_64_PTABLE_SIZE)
179     }
180 #ifdef CONFIG_PAE
181     if (type == ObjType_VNode_x86_32_pdpt)
182     {
183         return 2;       // log2(X86_32_PDPTE_SIZE)
184     }
185     else if (type == ObjType_VNode_x86_32_pdir ||
186              type == ObjType_VNode_x86_32_ptable)
187     {
188         return 9;       // log2(X86_32_PTABLE_SIZE) == log2(X86_32_PDIR_SIZE)
189     }
190 #else
191     if (type == ObjType_VNode_x86_32_pdir ||
192         type == ObjType_VNode_x86_32_ptable)
193     {
194         return 10;      // log2(X86_32_PTABLE_SIZE) == log2(X86_32_PDIR_SIZE)
195     }
196 #endif
197
198     if (type == ObjType_VNode_AARCH64_l1)
199     {
200             return 2;
201     }
202
203     if (type == ObjType_VNode_AARCH64_l2 ||
204         type == ObjType_VNode_AARCH64_l3)
205     {
206         return 9;       // log2(ARM_MAX_ENTRIES)
207     }
208
209     if (type == ObjType_VNode_ARM_l2)
210     {
211         return 9;       // log2(ARM_L2_MAX_ENTRIES)
212     }
213     else if (type == ObjType_VNode_ARM_l1)
214     {
215         return 12;      // log2(ARM_L1_MAX_ENTRIES)
216     }
217
218     assert(!"unknown page table type");
219     return 0;
220 }
221
222 static inline enum objtype get_mapping_type(enum objtype captype)
223 {
224     STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all mapping types");
225
226     switch (captype) {
227         case ObjType_Frame:
228             return ObjType_Frame_Mapping;
229         case ObjType_DevFrame:
230             return ObjType_DevFrame_Mapping;
231         case ObjType_VNode_x86_64_pml4:
232             return ObjType_VNode_x86_64_pml4_Mapping;
233         case ObjType_VNode_x86_64_pdpt:
234             return ObjType_VNode_x86_64_pdpt_Mapping;
235         case ObjType_VNode_x86_64_pdir:
236             return ObjType_VNode_x86_64_pdir_Mapping;
237         case ObjType_VNode_x86_64_ptable:
238             return ObjType_VNode_x86_64_ptable_Mapping;
239         case ObjType_VNode_x86_32_pdpt:
240             return ObjType_VNode_x86_32_pdpt_Mapping;
241         case ObjType_VNode_x86_32_pdir:
242             return ObjType_VNode_x86_32_pdir_Mapping;
243         case ObjType_VNode_x86_32_ptable:
244             return ObjType_VNode_x86_32_ptable_Mapping;
245         case ObjType_VNode_ARM_l1:
246             return ObjType_VNode_ARM_l1_Mapping;
247         case ObjType_VNode_ARM_l2:
248             return ObjType_VNode_ARM_l2_Mapping;
249         case ObjType_VNode_AARCH64_l1:
250             return ObjType_VNode_AARCH64_l1_Mapping;
251         case ObjType_VNode_AARCH64_l2:
252             return ObjType_VNode_AARCH64_l2_Mapping;
253         case ObjType_VNode_AARCH64_l3:
254             return ObjType_VNode_AARCH64_l3_Mapping;
255         /* all other types are not mappable */
256         default:
257             return ObjType_Null;
258     }
259 }
260
261 static inline bool type_is_mapping(enum objtype type)
262 {
263     STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all mapping types");
264
265     switch (type) {
266         case ObjType_Frame_Mapping:
267         case ObjType_DevFrame_Mapping:
268         case ObjType_VNode_x86_64_pml4_Mapping:
269         case ObjType_VNode_x86_64_pdpt_Mapping:
270         case ObjType_VNode_x86_64_pdir_Mapping:
271         case ObjType_VNode_x86_64_ptable_Mapping:
272         case ObjType_VNode_x86_32_pdpt_Mapping:
273         case ObjType_VNode_x86_32_pdir_Mapping:
274         case ObjType_VNode_x86_32_ptable_Mapping:
275         case ObjType_VNode_ARM_l1_Mapping:
276         case ObjType_VNode_ARM_l2_Mapping:
277         case ObjType_VNode_AARCH64_l1_Mapping:
278         case ObjType_VNode_AARCH64_l2_Mapping:
279         case ObjType_VNode_AARCH64_l3_Mapping:
280             return true;
281
282         /* all other types are not mapping types */
283         default:
284             return false;
285     }
286 }
287
288 /**
289  * CNode capability commands.
290  */
291 enum cnode_cmd {
292     CNodeCmd_Copy,      ///< Copy capability
293     CNodeCmd_Mint,      ///< Mint capability
294     CNodeCmd_Retype,    ///< Retype capability
295     CNodeCmd_Delete,    ///< Delete capability
296     CNodeCmd_Revoke,    ///< Revoke capability
297     CNodeCmd_Create,    ///< Create capability
298     CNodeCmd_GetState,  ///< Get distcap state for capability
299 };
300
301 enum vnode_cmd {
302     VNodeCmd_Map,
303     VNodeCmd_Unmap,
304     VNodeCmd_Identify,   ///< Return the physical address of the VNode
305 };
306
307 /**
308  * Mapping commands
309  */
310 enum mapping_cmd {
311     MappingCmd_Modify,
312     MappingCmd_Destroy,
313 };
314
315 /**
316  * Kernel capabilities commands.
317  * Monitor's invocations of capability operations
318  * which the kernel will not subject to cross core checks
319  */
320 enum kernel_cmd {
321     KernelCmd_Spawn_core,         ///< Spawn a new kernel
322     KernelCmd_Identify_cap,       ///< Return the meta data of a capability
323     KernelCmd_Identify_domains_cap, ///< Return the meta data of another domain's capability
324     KernelCmd_Remote_relations,   ///< Set capability as being remote
325     KernelCmd_Cap_has_relations,      ///< Return presence of local relations
326     KernelCmd_Create_cap,         ///< Create a new capability
327     KernelCmd_Copy_existing,
328     KernelCmd_Get_core_id,        ///< Returns the id of the core the domain is on
329     KernelCmd_Get_arch_id,        ///< Returns arch id of caller's core
330     KernelCmd_Nullify_cap,        ///< Set the capability to NULL allowed it to be reused
331     KernelCmd_Setup_trace,        ///< Set up trace buffer
332     KernelCmd_Register,           ///< Register monitor notify endpoint
333     KernelCmd_Domain_Id,          ///< Set domain ID of dispatcher
334     KernelCmd_Get_cap_owner,
335     KernelCmd_Set_cap_owner,
336     KernelCmd_Lock_cap,
337     KernelCmd_Unlock_cap,
338     KernelCmd_Delete_last,
339     KernelCmd_Delete_foreigns,
340     KernelCmd_Revoke_mark_target,
341     KernelCmd_Revoke_mark_relations,
342     KernelCmd_Delete_step,
343     KernelCmd_Clear_step,
344     KernelCmd_Retype,
345     KernelCmd_Has_descendants,
346     KernelCmd_Sync_timer,
347     KernelCmd_IPI_Register,
348     KernelCmd_IPI_Delete,
349     KernelCmd_GetGlobalPhys,
350     KernelCmd_Add_kcb,            ///< add extra kcb to be scheduled
351     KernelCmd_Remove_kcb,         ///< remove kcb from scheduling ring
352     KernelCmd_Suspend_kcb_sched,  ///< suspend/resume kcb scheduler
353     KernelCmd_Count
354 };
355
356 /**
357  * Specific commands for dispatcher capabilities.
358  */
359 enum dispatcher_cmd {
360     DispatcherCmd_Setup,            ///< Set dispatcher parameters
361     DispatcherCmd_Properties,       ///< Set dispatcher properties
362     DispatcherCmd_PerfMon,          ///< Performance monitoring
363     DispatcherCmd_SetupGuest,       ///< Set up the DCB of a guest domain
364     DispatcherCmd_DumpPTables,      ///< Dump hw page tables of dispatcher
365     DispatcherCmd_DumpCapabilities, ///< Dump capabilities of dispatcher
366     DispatcherCmd_Vmread,           ///< Execute vmread on the current and active VMCS      
367     DispatcherCmd_Vmwrite,          ///< Execute vmwrite on the current and active VMCS
368     DispatcherCmd_Vmptrld,          ///< Make VMCS clear and inactive
369     DispatcherCmd_Vmclear,          ///< Make VMCS current and active 
370 };
371
372 /**
373  * Frame capability commands.
374  */
375 enum frame_cmd {
376     FrameCmd_Identify,      ///< Return physical address of frame
377 };
378
379 /**
380  * RAM capability commands
381  */
382 enum ram_cmd {
383     RAMCmd_Identify,      ///< Return physical address of frame
384 };
385
386 /**
387  * IRQ Table capability commands.
388  */
389 enum irqtable_cmd {
390     IRQTableCmd_Alloc,  ///< Allocate new vector (XXX: HACK: this is x86 specific)
391     IRQTableCmd_AllocDestCap,  ///< Allocate new dest capability (XXX: HACK: this is x86 specific)
392     IRQTableCmd_Set,    ///< Set endpoint for IRQ# notifications
393     IRQTableCmd_Delete  ///< Remove notification endpoint for IRQ#
394 };
395
396 /**
397  * IRQ Vector commands.
398  */
399
400 enum irqdest_cmd {
401         IRQDestCmd_Connect,     ///< Connect this capability to a messaging channel
402         IRQDestCmd_GetVector ///< Return the local interrupt vector
403 };
404
405 /**
406  * IRQ Vector commands.
407  */
408
409 enum irqsrc_cmd {
410     IRQSrcCmd_GetVector   ///< Return vector and controller saved in this cap.
411 };
412
413
414 /**
415  * IO capability commands.
416  */
417 enum io_cmd {
418     IOCmd_Outb,         ///< Output byte to port
419     IOCmd_Outw,         ///< Output word to port
420     IOCmd_Outd,         ///< Output double word to port
421     IOCmd_Inb,          ///< Input byte from port
422     IOCmd_Inw,          ///< Input word from port
423     IOCmd_Ind           ///< Input double word from port
424 };
425
426 /**
427  * Notify capability commands.
428  */
429 enum notify_cmd {
430     NotifyCmd_Send
431 };
432
433
434 /**
435  * Performance monitoring commands.
436  * Seems to be already included in the Dispatcher capability.
437  */
438 enum perfmon_cmd {
439     PerfmonCmd_Activate,    ///< Activate performance counters
440     PerfmonCmd_Deactivate,  ///< Deactivate performance counters
441     PerfmonCmd_Write        ///< Read current performance counter values
442 };
443
444
445 /**
446  * ID capability commands.
447  */
448 enum id_cmd {
449     IDCmd_Identify  ///< Return system-wide unique ID
450 };
451
452 /**
453  * IPI capability commands
454  */
455
456 enum ipi_cmd {
457     IPICmd_Send_Start,     ///< Send Startup IPI to a destination core
458     IPICmd_Send_Init,      ///< Send Init IPI to a destination core
459 };
460 /**
461  * Maximum command ordinal.
462  */
463 #define CAP_MAX_CMD KernelCmd_Count
464
465 /**
466  * \brief Values returned from frame identify invocation
467  */
468 struct frame_identity {
469     genpaddr_t base;   ///< Physical base address of frame
470     gensize_t  bytes;  ///< Size of frame, in bytes
471 };
472
473 /**
474  * \brief Values returned from the VNode identify invocation
475  */
476 struct vnode_identity {
477     genpaddr_t base;   ///< Physical base address of the VNode
478     uint8_t type;      ///< Type of VNode
479 };
480
481 #endif // __ASSEMBLER__
482
483 #endif // BARRELFISH_CAPABILITIES_H