T191: Implement prototype for new retype
[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 represented by a VNode.
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;      // BASE_PAGE_BITS
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         return 12;
110     }
111
112     assert(0 && !"Page table size unknown.");
113     return 0;
114 }
115
116 /**
117  * Return number of page table entries for vnode in bits.
118  * @param type Object type.
119  * @return Number of page table entries in bits
120  */
121 static inline size_t vnode_entry_bits(enum objtype type) {
122     // This function should be emitted by hamlet or somesuch.
123     STATIC_ASSERT(46 == ObjType_Num, "Check VNode definitions");
124
125     if (type == ObjType_VNode_x86_64_pml4 ||
126         type == ObjType_VNode_x86_64_pdpt ||
127         type == ObjType_VNode_x86_64_pdir ||
128         type == ObjType_VNode_x86_64_ptable)
129     {
130         return 9;      // log2(X86_64_PTABLE_SIZE)
131     }
132 #ifdef CONFIG_PAE
133     if (type == ObjType_VNode_x86_32_pdpt)
134     {
135         return 2;       // log2(X86_32_PDPTE_SIZE)
136     }
137     else if (type == ObjType_VNode_x86_32_pdir ||
138              type == ObjType_VNode_x86_32_ptable)
139     {
140         return 9;       // log2(X86_32_PTABLE_SIZE) == log2(X86_32_PDIR_SIZE)
141     }
142 #else
143     if (type == ObjType_VNode_x86_32_pdir ||
144         type == ObjType_VNode_x86_32_ptable)
145     {
146         return 10;      // log2(X86_32_PTABLE_SIZE) == log2(X86_32_PDIR_SIZE)
147     }
148 #endif
149
150     if (type == ObjType_VNode_AARCH64_l1)
151     {
152             return 2;
153     }
154
155     if (type == ObjType_VNode_AARCH64_l2 ||
156         type == ObjType_VNode_AARCH64_l3)
157     {
158         return 9;       // log2(ARM_MAX_ENTRIES)
159     }
160
161     if (type == ObjType_VNode_ARM_l2)
162     {
163         return 9;       // log2(ARM_L2_MAX_ENTRIES)
164     }
165     else if (type == ObjType_VNode_ARM_l1)
166     {
167         return 12;      // log2(ARM_L1_MAX_ENTRIES)
168     }
169
170     assert(!"unknown page table type");
171     return 0;
172 }
173
174 static inline enum objtype get_mapping_type(enum objtype captype)
175 {
176     STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all mapping types");
177
178     switch (captype) {
179         case ObjType_Frame:
180             return ObjType_Frame_Mapping;
181         case ObjType_DevFrame:
182             return ObjType_DevFrame_Mapping;
183         case ObjType_VNode_x86_64_pml4:
184             return ObjType_VNode_x86_64_pml4_Mapping;
185         case ObjType_VNode_x86_64_pdpt:
186             return ObjType_VNode_x86_64_pdpt_Mapping;
187         case ObjType_VNode_x86_64_pdir:
188             return ObjType_VNode_x86_64_pdir_Mapping;
189         case ObjType_VNode_x86_64_ptable:
190             return ObjType_VNode_x86_64_ptable_Mapping;
191         case ObjType_VNode_x86_32_pdpt:
192             return ObjType_VNode_x86_32_pdpt_Mapping;
193         case ObjType_VNode_x86_32_pdir:
194             return ObjType_VNode_x86_32_pdir_Mapping;
195         case ObjType_VNode_x86_32_ptable:
196             return ObjType_VNode_x86_32_ptable_Mapping;
197         case ObjType_VNode_ARM_l1:
198             return ObjType_VNode_ARM_l1_Mapping;
199         case ObjType_VNode_ARM_l2:
200             return ObjType_VNode_ARM_l2_Mapping;
201         case ObjType_VNode_AARCH64_l1:
202             return ObjType_VNode_AARCH64_l1_Mapping;
203         case ObjType_VNode_AARCH64_l2:
204             return ObjType_VNode_AARCH64_l2_Mapping;
205         case ObjType_VNode_AARCH64_l3:
206             return ObjType_VNode_AARCH64_l3_Mapping;
207         /* all other types are not mappable */
208         default:
209             return ObjType_Null;
210     }
211 }
212
213 static inline bool type_is_mapping(enum objtype type)
214 {
215     STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all mapping types");
216
217     switch (type) {
218         case ObjType_Frame_Mapping:
219         case ObjType_DevFrame_Mapping:
220         case ObjType_VNode_x86_64_pml4_Mapping:
221         case ObjType_VNode_x86_64_pdpt_Mapping:
222         case ObjType_VNode_x86_64_pdir_Mapping:
223         case ObjType_VNode_x86_64_ptable_Mapping:
224         case ObjType_VNode_x86_32_pdpt_Mapping:
225         case ObjType_VNode_x86_32_pdir_Mapping:
226         case ObjType_VNode_x86_32_ptable_Mapping:
227         case ObjType_VNode_ARM_l1_Mapping:
228         case ObjType_VNode_ARM_l2_Mapping:
229         case ObjType_VNode_AARCH64_l1_Mapping:
230         case ObjType_VNode_AARCH64_l2_Mapping:
231         case ObjType_VNode_AARCH64_l3_Mapping:
232             return true;
233
234         /* all other types are not mapping types */
235         default:
236             return false;
237     }
238 }
239
240 /**
241  * CNode capability commands.
242  */
243 enum cnode_cmd {
244     CNodeCmd_Copy,      ///< Copy capability
245     CNodeCmd_Mint,      ///< Mint capability
246     CNodeCmd_Retype,    ///< Retype capability
247     CNodeCmd_Retype2,    ///< Retype capability
248     CNodeCmd_Delete,    ///< Delete capability
249     CNodeCmd_Revoke,    ///< Revoke capability
250     CNodeCmd_Create,    ///< Create capability
251     CNodeCmd_GetState,  ///< Get distcap state for capability
252 };
253
254 enum vnode_cmd {
255     VNodeCmd_Map,
256     VNodeCmd_Unmap,
257     VNodeCmd_Identify,   ///< Return the physical address of the VNode
258 };
259
260 /**
261  * Mapping commands
262  */
263 enum mapping_cmd {
264     MappingCmd_Modify,
265     MappingCmd_Destroy,
266 };
267
268 /**
269  * Kernel capabilities commands.
270  * Monitor's invocations of capability operations
271  * which the kernel will not subject to cross core checks
272  */
273 enum kernel_cmd {
274     KernelCmd_Spawn_core,         ///< Spawn a new kernel
275     KernelCmd_Identify_cap,       ///< Return the meta data of a capability
276     KernelCmd_Identify_domains_cap, ///< Return the meta data of another domain's capability
277     KernelCmd_Remote_relations,   ///< Set capability as being remote
278     KernelCmd_Cap_has_relations,      ///< Return presence of local relations
279     KernelCmd_Create_cap,         ///< Create a new capability
280     KernelCmd_Copy_existing,
281     KernelCmd_Get_core_id,        ///< Returns the id of the core the domain is on
282     KernelCmd_Get_arch_id,        ///< Returns arch id of caller's core
283     KernelCmd_Nullify_cap,        ///< Set the capability to NULL allowed it to be reused
284     KernelCmd_Setup_trace,        ///< Set up trace buffer
285     KernelCmd_Register,           ///< Register monitor notify endpoint
286     KernelCmd_Domain_Id,          ///< Set domain ID of dispatcher
287     KernelCmd_Get_cap_owner,
288     KernelCmd_Set_cap_owner,
289     KernelCmd_Lock_cap,
290     KernelCmd_Unlock_cap,
291     KernelCmd_Delete_last,
292     KernelCmd_Delete_foreigns,
293     KernelCmd_Revoke_mark_target,
294     KernelCmd_Revoke_mark_relations,
295     KernelCmd_Delete_step,
296     KernelCmd_Clear_step,
297     KernelCmd_Retype,
298     KernelCmd_Has_descendants,
299     KernelCmd_Sync_timer,
300     KernelCmd_IPI_Register,
301     KernelCmd_IPI_Delete,
302     KernelCmd_GetGlobalPhys,
303     KernelCmd_Add_kcb,            ///< add extra kcb to be scheduled
304     KernelCmd_Remove_kcb,         ///< remove kcb from scheduling ring
305     KernelCmd_Suspend_kcb_sched,  ///< suspend/resume kcb scheduler
306     KernelCmd_Count
307 };
308
309 /**
310  * Specific commands for dispatcher capabilities.
311  */
312 enum dispatcher_cmd {
313     DispatcherCmd_Setup,            ///< Set dispatcher parameters
314     DispatcherCmd_Properties,       ///< Set dispatcher properties
315     DispatcherCmd_PerfMon,          ///< Performance monitoring
316     DispatcherCmd_SetupGuest,       ///< Set up the DCB of a guest domain
317     DispatcherCmd_DumpPTables,      ///< Dump hw page tables of dispatcher
318     DispatcherCmd_DumpCapabilities, ///< Dump capabilities of dispatcher
319     DispatcherCmd_Vmread,           ///< Execute vmread on the current and active VMCS      
320     DispatcherCmd_Vmwrite,          ///< Execute vmwrite on the current and active VMCS
321     DispatcherCmd_Vmptrld,          ///< Make VMCS clear and inactive
322     DispatcherCmd_Vmclear,          ///< Make VMCS current and active 
323 };
324
325 /**
326  * Frame capability commands.
327  */
328 enum frame_cmd {
329     FrameCmd_Identify,      ///< Return physical address of frame
330 };
331
332 /**
333  * IRQ Table capability commands.
334  */
335 enum irqtable_cmd {
336     IRQTableCmd_Alloc,  ///< Allocate new vector (XXX: HACK: this is x86 specific)
337     IRQTableCmd_AllocDestCap,  ///< Allocate new dest capability (XXX: HACK: this is x86 specific)
338     IRQTableCmd_Set,    ///< Set endpoint for IRQ# notifications
339     IRQTableCmd_Delete  ///< Remove notification endpoint for IRQ#
340 };
341
342 /**
343  * IRQ Vector commands.
344  */
345
346 enum irqdest_cmd {
347         IRQDestCmd_Connect,     ///< Connect this capability to a messaging channel
348         IRQDestCmd_GetVector ///< Return the local interrupt vector
349 };
350
351 /**
352  * IRQ Vector commands.
353  */
354
355 enum irqsrc_cmd {
356     IRQSrcCmd_GetVector   ///< Return vector and controller saved in this cap.
357 };
358
359
360 /**
361  * IO capability commands.
362  */
363 enum io_cmd {
364     IOCmd_Outb,         ///< Output byte to port
365     IOCmd_Outw,         ///< Output word to port
366     IOCmd_Outd,         ///< Output double word to port
367     IOCmd_Inb,          ///< Input byte from port
368     IOCmd_Inw,          ///< Input word from port
369     IOCmd_Ind           ///< Input double word from port
370 };
371
372 /**
373  * Notify capability commands.
374  */
375 enum notify_cmd {
376     NotifyCmd_Send
377 };
378
379
380 /**
381  * Performance monitoring commands.
382  * Seems to be already included in the Dispatcher capability.
383  */
384 enum perfmon_cmd {
385     PerfmonCmd_Activate,    ///< Activate performance counters
386     PerfmonCmd_Deactivate,  ///< Deactivate performance counters
387     PerfmonCmd_Write        ///< Read current performance counter values
388 };
389
390
391 /**
392  * ID capability commands.
393  */
394 enum id_cmd {
395     IDCmd_Identify  ///< Return system-wide unique ID
396 };
397
398 /**
399  * IPI capability commands
400  */
401
402 enum ipi_cmd {
403     IPICmd_Send_Start,     ///< Send Startup IPI to a destination core
404     IPICmd_Send_Init,      ///< Send Init IPI to a destination core
405 };
406 /**
407  * Maximum command ordinal.
408  */
409 #define CAP_MAX_CMD KernelCmd_Count
410
411 /**
412  * \brief Values returned from frame identify invocation
413  */
414 struct frame_identity {
415     genpaddr_t base;   ///< Physical base address of frame
416     gensize_t  bytes;  ///< Size of frame, in bytes
417 };
418
419 /**
420  * \brief Values returned from the VNode identify invocation
421  */
422 struct vnode_identity {
423     genpaddr_t base;   ///< Physical base address of the VNode
424     uint8_t type;      ///< Type of VNode
425 };
426
427 #endif // __ASSEMBLER__
428
429 #endif // BARRELFISH_CAPABILITIES_H