T306: Change cap definitions to use inheritance mechanism.
authorMoritz Hoffmann <moritz.hoffmann@inf.ethz.ch>
Tue, 11 Oct 2016 09:00:39 +0000 (11:00 +0200)
committerMoritz Hoffmann <moritz.hoffmann@inf.ethz.ch>
Tue, 11 Oct 2016 09:01:00 +0000 (11:01 +0200)
Signed-off-by: Moritz Hoffmann <moritz.hoffmann@inf.ethz.ch>

capabilities/caps.hl

index c0fd967..3e2e808 100644 (file)
@@ -43,9 +43,7 @@ cap Null is_never_copy {
     /* Null/invalid object type */
 };
 
-cap PhysAddr from_self {
-    /* Physical address range (root of cap tree) */
-
+cap Memory abstract {
     /**
       For a populated cap, we need to give the type and name of each
       of its fields, such as:
@@ -59,21 +57,35 @@ cap PhysAddr from_self {
       "eq genpaddr base;"
     **/
 
-    address genpaddr base;  /* Base address of untyped region */
+    address genpaddr base;  /* Physical base address of Memory object */
     pasid pasid;            /* Physical Address Space ID */
-    size gensize bytes;     /* size of region */
+    size gensize bytes;     /* Size of region in bytes */
 };
 
-/** The following caps are similar to the previous one **/
 
-cap RAM from PhysAddr from_self {
-    /* RAM memory object */
 
-    address genpaddr base;  /* Base address of untyped region */
-    pasid pasid;            /* Physical Address Space ID */
-    size gensize bytes;     /* Size of region in bytes */
+/* Physical address range (root of cap tree) */
+cap PhysAddr from_self inherit Memory;
+
+cap Mapping abstract {
+    "struct capability" frame;
+    eq lvaddr pte;
+    uint32 offset;
+    uint16 pte_count;
+
+    address { get_address(frame) };
+};
+
+cap VNode abstract {
+    address genpaddr base;  /* Base address of VNode */
+    size { vnode_size };
 };
 
+/** The following caps are similar to the previous one **/
+
+/* RAM memory object */
+cap RAM from PhysAddr from_self inherit Memory;
+
 cap L1CNode from RAM {
     /* Level 1 CNode table, resizable */
     address lpaddr cnode;               /* Base address of CNode */
@@ -148,163 +160,58 @@ cap EndPoint from Dispatcher {
 
 /** Then, we go back to routine **/
 
-cap Frame from RAM from_self {
-    /* Mappable memory frame */
-
-    address genpaddr base;  /* Physical base address of frame */
-    pasid pasid;            /* Physical Address Space ID */
-    size gensize bytes;     /* Size of region in bytes */
-};
-
-cap Frame_Mapping from Frame {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
+cap Frame from RAM from_self inherit Memory;
 
-    address { get_address(frame) };
-};
-
-cap DevFrame from PhysAddr from_self {
-    /* Mappable device frame */
-
-    address genpaddr base;  /* Physical base address of frame */
-    pasid pasid;            /* Physical Address Space ID */
-    size gensize bytes;     /* Size of region in bytes */
-};
+cap Frame_Mapping from Frame inherit Mapping;
 
-cap DevFrame_Mapping from DevFrame {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
+cap DevFrame from PhysAddr from_self inherit Memory;
 
-    address { get_address(frame) };
-};
+cap DevFrame_Mapping from DevFrame inherit Mapping;
 
 cap Kernel is_always_copy {
     /* Capability to a kernel */
 };
 
 
-
 /* x86_64-specific capabilities: */
 
-cap VNode_x86_64_pml4 from RAM {
-    /* PML4 */
-
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
-
-cap VNode_x86_64_pml4_Mapping from VNode_x86_64_pml4 {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
-
-    address { get_address(frame) };
-};
-
-
-cap VNode_x86_64_pdpt from RAM {
-    /* PDPT */
-
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
-
-cap VNode_x86_64_pdpt_Mapping from VNode_x86_64_pdpt {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
-
-    address { get_address(frame) };
-};
+/* PML4 */
+cap VNode_x86_64_pml4 from RAM inherit VNode;
 
-cap VNode_x86_64_pdir from RAM {
-    /* Page directory */
+cap VNode_x86_64_pml4_Mapping from VNode_x86_64_pml4 inherit Mapping;
 
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
+/* PDPT */
+cap VNode_x86_64_pdpt from RAM inherit VNode;
 
-cap VNode_x86_64_pdir_Mapping from VNode_x86_64_pdir {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
-
-    address { get_address(frame) };
-};
+cap VNode_x86_64_pdpt_Mapping from VNode_x86_64_pdpt inherit Mapping;
 
-cap VNode_x86_64_ptable from RAM {
-    /* Page table */
+/* Page directory */
+cap VNode_x86_64_pdir from RAM inherit VNode;
 
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
+cap VNode_x86_64_pdir_Mapping from VNode_x86_64_pdir inherit Mapping;
 
-cap VNode_x86_64_ptable_Mapping from VNode_x86_64_ptable {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
+/* Page table */
+cap VNode_x86_64_ptable from RAM inherit VNode;
 
-    address { get_address(frame) };
-};
+cap VNode_x86_64_ptable_Mapping from VNode_x86_64_ptable inherit Mapping;
 
 
 /* x86_32-specific capabilities: */
 
-cap VNode_x86_32_pdpt from RAM {
-    /* PDPT */
-
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
-
-cap VNode_x86_32_pdpt_Mapping from VNode_x86_32_pdpt {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
-
-    address { get_address(frame) };
-};
+/* PDPT */
+cap VNode_x86_32_pdpt from RAM inherit VNode;
 
-cap VNode_x86_32_pdir from RAM {
-    /* Page directory */
-
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
-
-cap VNode_x86_32_pdir_Mapping from VNode_x86_32_pdir {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
-
-    address { get_address(frame) };
-};
+cap VNode_x86_32_pdpt_Mapping from VNode_x86_32_pdpt inherit Mapping;
 
-cap VNode_x86_32_ptable from RAM {
-    /* Page table */
+/* Page directory */
+cap VNode_x86_32_pdir from RAM inherit VNode;
 
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
+cap VNode_x86_32_pdir_Mapping from VNode_x86_32_pdir inherit Mapping;
 
-cap VNode_x86_32_ptable_Mapping from VNode_x86_32_ptable {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
+/* Page table */
+cap VNode_x86_32_ptable from RAM inherit VNode;
 
-    address { get_address(frame) };
-};
+cap VNode_x86_32_ptable_Mapping from VNode_x86_32_ptable inherit Mapping;
 
 /* ARM specific capabilities: */
 
@@ -315,14 +222,7 @@ cap VNode_ARM_l1 from RAM {
     size { vnode_arm_l1_size };
 };
 
-cap VNode_ARM_l1_Mapping from VNode_ARM_l1 {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
-
-    address { get_address(frame) };
-};
+cap VNode_ARM_l1_Mapping from VNode_ARM_l1 inherit Mapping;
 
 cap VNode_ARM_l2 from RAM {
     /* L2 Page Table */
@@ -330,76 +230,29 @@ cap VNode_ARM_l2 from RAM {
     size { vnode_arm_l2_size };
 };
 
-cap VNode_ARM_l2_Mapping from VNode_ARM_l2 {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
-
-    address { get_address(frame) };
-};
+cap VNode_ARM_l2_Mapping from VNode_ARM_l2 inherit Mapping;
 
 /* ARM AArch64-specific capabilities: */
 
-cap VNode_AARCH64_l0 from RAM {
-    /* L0 Page Table */
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
-
-cap VNode_AARCH64_l0_Mapping from VNode_AARCH64_l0 {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
-
-    address { get_address(frame) };
-};
-
-cap VNode_AARCH64_l1 from RAM {
-    /* L1 Page Table */
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
-
-cap VNode_AARCH64_l1_Mapping from VNode_AARCH64_l1 {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
+/* L0 Page Table */
+cap VNode_AARCH64_l0 from RAM inherit VNode;
 
-    address { get_address(frame) };
-};
+cap VNode_AARCH64_l0_Mapping from VNode_AARCH64_l0 inherit Mapping;
 
-cap VNode_AARCH64_l2 from RAM {
-    /* L2 Page Table */
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
+/* L1 Page Table */
+cap VNode_AARCH64_l1 from RAM inherit VNode;
 
-cap VNode_AARCH64_l2_Mapping from VNode_AARCH64_l2 {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
+cap VNode_AARCH64_l1_Mapping from VNode_AARCH64_l1 inherit Mapping;
 
-    address { get_address(frame) };
-};
+/* L2 Page Table */
+cap VNode_AARCH64_l2 from RAM inherit VNode;
 
-cap VNode_AARCH64_l3 from RAM {
-    /* L3 Page Table */
-    address genpaddr base;  /* Base address of VNode */
-    size { vnode_size };
-};
+cap VNode_AARCH64_l2_Mapping from VNode_AARCH64_l2 inherit Mapping;
 
-cap VNode_AARCH64_l3_Mapping from VNode_AARCH64_l3 {
-    "struct capability" frame;
-    eq lvaddr pte;
-    uint32 offset;
-    uint16 pte_count;
+/* L3 Page Table */
+cap VNode_AARCH64_l3 from RAM inherit VNode;
 
-    address { get_address(frame) };
-};
+cap VNode_AARCH64_l3_Mapping from VNode_AARCH64_l3 inherit Mapping;
 
 /** IRQTable and IO are slightly different **/