caps: Add VNode_AARCH64_l0 and VNode_AARCH64_l0_Mapping capabilities.
authorMoritz Hoffmann <moritz@dhcp-16-111-6-143.labs.hpecorp.net>
Fri, 3 Jun 2016 23:58:11 +0000 (16:58 -0700)
committerMoritz Hoffmann <moritz@dhcp-16-111-6-143.labs.hpecorp.net>
Fri, 3 Jun 2016 23:58:11 +0000 (16:58 -0700)
Signed-off-by: Moritz Hoffmann <moritz@dhcp-16-111-6-143.labs.hpecorp.net>

capabilities/caps.hl
include/barrelfish_kpi/capabilities.h
include/barrelfish_kpi/distcaps.h
kernel/capabilities.c
lib/barrelfish/debug.c

index 6eae853..ed18509 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2009, 2010, 2012, 2015, ETH Zurich.
- * Copyright (c) 2015, Hewlett Packard Enterprise Development LP.
+ * Copyright (c) 2015, 2016 Hewlett Packard Enterprise Development LP.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -335,6 +335,20 @@ cap VNode_ARM_l2_Mapping from VNode_ARM_l2 {
 
 /* ARM AArch64-specific capabilities: */
 
+cap VNode_AARCH64_l0 from RAM {
+    /* L0 Page Table */
+    address genpaddr base;  /* Base address of VNode */
+    size_bits { vnode_size };
+};
+
+cap VNode_AARCH64_l0_Mapping from VNode_AARCH64_l0 {
+    "struct capability" frame;
+    eq lvaddr pte;
+    uint16 pte_count;
+
+    address { get_address(frame) };
+};
+
 cap VNode_AARCH64_l1 from RAM {
     /* L1 Page Table */
     address genpaddr base;  /* Base address of VNode */
index 0c5479f..d4cda88 100644 (file)
@@ -5,7 +5,7 @@
 
 /*
  * Copyright (c) 2007-2012, ETH Zurich.
- * Copyright (c) 2015, Hewlett Packard Enterprise Development LP.
+ * Copyright (c) 2015, 2016 Hewlett Packard Enterprise Development LP.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -55,7 +55,7 @@ struct dcb;
 
 static inline bool type_is_vnode(enum objtype type)
 {
-    STATIC_ASSERT(46 == ObjType_Num, "Check VNode definitions");
+    STATIC_ASSERT(48 == ObjType_Num, "Check VNode definitions");
 
     return (type == ObjType_VNode_x86_64_pml4 ||
             type == ObjType_VNode_x86_64_pdpt ||
@@ -67,6 +67,7 @@ static inline bool type_is_vnode(enum objtype type)
             type == ObjType_VNode_AARCH64_l3 ||
             type == ObjType_VNode_AARCH64_l2 ||
             type == ObjType_VNode_AARCH64_l1 ||
+            type == ObjType_VNode_AARCH64_l0 ||
             type == ObjType_VNode_ARM_l2 ||
             type == ObjType_VNode_ARM_l1
            );
@@ -82,7 +83,7 @@ static inline bool type_is_vnode(enum objtype type)
 static inline size_t vnode_objbits(enum objtype type)
 {
     // This function should be emitted by hamlet or somesuch.
-    STATIC_ASSERT(46 == ObjType_Num, "Check VNode definitions");
+    STATIC_ASSERT(48 == ObjType_Num, "Check VNode definitions");
 
     if (type == ObjType_VNode_x86_64_pml4 ||
         type == ObjType_VNode_x86_64_pdpt ||
@@ -94,7 +95,8 @@ static inline size_t vnode_objbits(enum objtype type)
     {
         return 12;      // BASE_PAGE_BITS
     }
-    else if (type == ObjType_VNode_AARCH64_l1 ||
+    else if (type == ObjType_VNode_AARCH64_l0 ||
+             type == ObjType_VNode_AARCH64_l1 ||
              type == ObjType_VNode_AARCH64_l2 ||
              type == ObjType_VNode_AARCH64_l3)
     {
@@ -120,7 +122,7 @@ static inline size_t vnode_objbits(enum objtype type)
  */
 static inline size_t vnode_entry_bits(enum objtype type) {
     // This function should be emitted by hamlet or somesuch.
-    STATIC_ASSERT(46 == ObjType_Num, "Check VNode definitions");
+    STATIC_ASSERT(48 == ObjType_Num, "Check VNode definitions");
 
     if (type == ObjType_VNode_x86_64_pml4 ||
         type == ObjType_VNode_x86_64_pdpt ||
@@ -147,12 +149,9 @@ static inline size_t vnode_entry_bits(enum objtype type) {
     }
 #endif
 
-    if (type == ObjType_VNode_AARCH64_l1)
-    {
-           return 2;
-    }
-
-    if (type == ObjType_VNode_AARCH64_l2 ||
+    if (type == ObjType_VNode_AARCH64_l0 ||
+        type == ObjType_VNode_AARCH64_l1 ||
+        type == ObjType_VNode_AARCH64_l2 ||
         type == ObjType_VNode_AARCH64_l3)
     {
         return 9;       // log2(ARM_MAX_ENTRIES)
@@ -173,7 +172,7 @@ static inline size_t vnode_entry_bits(enum objtype type) {
 
 static inline enum objtype get_mapping_type(enum objtype captype)
 {
-    STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all mapping types");
+    STATIC_ASSERT(48 == ObjType_Num, "Knowledge of all mapping types");
 
     switch (captype) {
         case ObjType_Frame:
@@ -198,6 +197,8 @@ static inline enum objtype get_mapping_type(enum objtype captype)
             return ObjType_VNode_ARM_l1_Mapping;
         case ObjType_VNode_ARM_l2:
             return ObjType_VNode_ARM_l2_Mapping;
+        case ObjType_VNode_AARCH64_l0:
+            return ObjType_VNode_AARCH64_l0_Mapping;
         case ObjType_VNode_AARCH64_l1:
             return ObjType_VNode_AARCH64_l1_Mapping;
         case ObjType_VNode_AARCH64_l2:
@@ -212,7 +213,7 @@ static inline enum objtype get_mapping_type(enum objtype captype)
 
 static inline bool type_is_mapping(enum objtype type)
 {
-    STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all mapping types");
+    STATIC_ASSERT(48 == ObjType_Num, "Knowledge of all mapping types");
 
     switch (type) {
         case ObjType_Frame_Mapping:
@@ -226,6 +227,7 @@ static inline bool type_is_mapping(enum objtype type)
         case ObjType_VNode_x86_32_ptable_Mapping:
         case ObjType_VNode_ARM_l1_Mapping:
         case ObjType_VNode_ARM_l2_Mapping:
+        case ObjType_VNode_AARCH64_l0_Mapping:
         case ObjType_VNode_AARCH64_l1_Mapping:
         case ObjType_VNode_AARCH64_l2_Mapping:
         case ObjType_VNode_AARCH64_l3_Mapping:
index b225156..9bc9542 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012, ETH Zurich.
- * Copyright (c) 2015, Hewlett Packard Enterprise Development LP.
+ * Copyright (c) 2015, 016 Hewlett Packard Enterprise Development LP.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -40,7 +40,7 @@ distcap_state_is_foreign(distcap_state_t state)
  * Predicates related to sharing capabilities
  */
 
-STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all cap types");
+STATIC_ASSERT(48 == ObjType_Num, "Knowledge of all cap types");
 static inline bool
 distcap_needs_locality(enum objtype type)
 {
@@ -62,11 +62,13 @@ distcap_needs_locality(enum objtype type)
     case ObjType_VNode_x86_32_ptable:
     case ObjType_VNode_ARM_l1:
     case ObjType_VNode_ARM_l2:
+    case ObjType_VNode_AARCH64_l0:
     case ObjType_VNode_AARCH64_l1:
     case ObjType_VNode_AARCH64_l2:
     case ObjType_VNode_AARCH64_l3:
     case ObjType_VNode_ARM_l1_Mapping:
     case ObjType_VNode_ARM_l2_Mapping:
+    case ObjType_VNode_AARCH64_l0_Mapping:
     case ObjType_VNode_AARCH64_l1_Mapping:
     case ObjType_VNode_AARCH64_l2_Mapping:
     case ObjType_VNode_AARCH64_l3_Mapping:
@@ -87,7 +89,7 @@ distcap_needs_locality(enum objtype type)
     }
 }
 
-STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all cap types");
+STATIC_ASSERT(48 == ObjType_Num, "Knowledge of all cap types");
 static inline bool
 distcap_is_moveable(enum objtype type)
 {
index 3ca4915..3fa1bde 100644 (file)
@@ -5,7 +5,7 @@
 
 /*
  * Copyright (c) 2007-2012,2015, ETH Zurich.
- * Copyright (c) 2015, Hewlett Packard Enterprise Development LP.
+ * Copyright (c) 2015, 2016 Hewlett Packard Enterprise Development LP.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -52,7 +52,7 @@ void caps_trace_ctrl(uint64_t types, genpaddr_t start, gensize_t size)
 
 struct capability monitor_ep;
 
-STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all cap types");
+STATIC_ASSERT(48 == ObjType_Num, "Knowledge of all cap types");
 int sprint_cap(char *buf, size_t len, struct capability *cap)
 {
     switch (cap->type) {
@@ -95,6 +95,10 @@ int sprint_cap(char *buf, size_t len, struct capability *cap)
         return snprintf(buf, len, "ARM L2 table at 0x%" PRIxGENPADDR,
                         cap->u.vnode_arm_l2.base);
 
+    case ObjType_VNode_AARCH64_l0:
+        return snprintf(buf, len, "AARCH64 L0 table at 0x%" PRIxGENPADDR,
+                        cap->u.vnode_aarch64_l0.base);
+
     case ObjType_VNode_AARCH64_l1:
         return snprintf(buf, len, "AARCH64 L1 table at 0x%" PRIxGENPADDR,
                         cap->u.vnode_aarch64_l1.base);
@@ -212,6 +216,13 @@ int sprint_cap(char *buf, size_t len, struct capability *cap)
                                   cap->u.vnode_arm_l2_mapping.pte,
                                   cap->u.vnode_arm_l2_mapping.pte_count);
 
+    case ObjType_VNode_AARCH64_l0_Mapping:
+        return snprintf(buf, len, "AARCH64 l0 Mapping (AARCH64 l0 cap @%p, "
+                                  "pte @0x%"PRIxLVADDR", pte_count=%hu)",
+                                  cap->u.vnode_aarch64_l0_mapping.frame,
+                                  cap->u.vnode_aarch64_l0_mapping.pte,
+                                  cap->u.vnode_aarch64_l0_mapping.pte_count);
+
     case ObjType_VNode_AARCH64_l1_Mapping:
         return snprintf(buf, len, "AARCH64 l1 Mapping (AARCH64 l1 cap @%p, "
                                   "pte @0x%"PRIxLVADDR", pte_count=%hu)",
@@ -336,7 +347,7 @@ static errval_t set_cap(struct capability *dest, struct capability *src)
 
 // If you create more capability types you need to deal with them
 // in the table below.
-STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all cap types");
+STATIC_ASSERT(48 == ObjType_Num, "Knowledge of all cap types");
 
 static size_t caps_numobjs(enum objtype type, uint8_t bits, uint8_t objbits)
 {
@@ -367,6 +378,7 @@ static size_t caps_numobjs(enum objtype type, uint8_t bits, uint8_t objbits)
     case ObjType_VNode_x86_32_ptable:
     case ObjType_VNode_ARM_l1:
     case ObjType_VNode_ARM_l2:
+    case ObjType_VNode_AARCH64_l0:
     case ObjType_VNode_AARCH64_l1:
     case ObjType_VNode_AARCH64_l2:
     case ObjType_VNode_AARCH64_l3:
@@ -406,6 +418,7 @@ static size_t caps_numobjs(enum objtype type, uint8_t bits, uint8_t objbits)
     case ObjType_IPI:
     case ObjType_VNode_ARM_l1_Mapping:
     case ObjType_VNode_ARM_l2_Mapping:
+    case ObjType_VNode_AARCH64_l0_Mapping:
     case ObjType_VNode_AARCH64_l1_Mapping:
     case ObjType_VNode_AARCH64_l2_Mapping:
     case ObjType_VNode_AARCH64_l3_Mapping:
@@ -431,7 +444,7 @@ static size_t caps_numobjs(enum objtype type, uint8_t bits, uint8_t objbits)
  *
  * For the meaning of the parameters, see the 'caps_create' function.
  */
-STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all cap types");
+STATIC_ASSERT(48 == ObjType_Num, "Knowledge of all cap types");
 
 static errval_t caps_init_objects(enum objtype type, lpaddr_t lpaddr, uint8_t
                                   bits, uint8_t objbits, size_t numobjs)
@@ -464,6 +477,7 @@ static errval_t caps_init_objects(enum objtype type, lpaddr_t lpaddr, uint8_t
     case ObjType_CNode:
     case ObjType_VNode_ARM_l1:
     case ObjType_VNode_ARM_l2:
+    case ObjType_VNode_AARCH64_l0:
     case ObjType_VNode_AARCH64_l1:
     case ObjType_VNode_AARCH64_l2:
     case ObjType_VNode_AARCH64_l3:
@@ -511,7 +525,7 @@ static errval_t caps_init_objects(enum objtype type, lpaddr_t lpaddr, uint8_t
  */
 // If you create more capability types you need to deal with them
 // in the table below.
-STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all cap types");
+STATIC_ASSERT(48 == ObjType_Num, "Knowledge of all cap types");
 
 static errval_t caps_create(enum objtype type, lpaddr_t lpaddr, uint8_t bits,
                             uint8_t objbits, size_t numobjs, coreid_t owner,
@@ -698,6 +712,29 @@ static errval_t caps_create(enum objtype type, lpaddr_t lpaddr, uint8_t bits,
         break;
     }
 
+    case ObjType_VNode_AARCH64_l0:
+    {
+        size_t objbits_vnode = vnode_objbits(type);
+
+        TRACE(KERNEL, BZERO, 1);
+        memset((void*)lvaddr, 0, 1UL << bits);
+        TRACE(KERNEL, BZERO, 0);
+
+        for(dest_i = 0; dest_i < numobjs; dest_i++) {
+            // Initialize type specific fields
+            src_cap.u.vnode_aarch64_l0.base =
+                genpaddr + dest_i * ((genpaddr_t)1 << objbits_vnode);
+
+            // Insert the capability
+            err = set_cap(&dest_caps[dest_i].cap, &src_cap);
+            if (err_is_fail(err)) {
+                break;
+            }
+        }
+
+        break;
+    }
+
     case ObjType_VNode_AARCH64_l1:
     {
         size_t objbits_vnode = vnode_objbits(type);
@@ -1273,7 +1310,7 @@ errval_t caps_create_new(enum objtype type, lpaddr_t addr, size_t bits,
 }
 
 
-STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all cap types");
+STATIC_ASSERT(48 == ObjType_Num, "Knowledge of all cap types");
 /// Retype caps
 errval_t caps_retype(enum objtype type, size_t objbits,
                      struct capability *dest_cnode, cslot_t dest_slot,
index 4213908..d6ad600 100644 (file)
@@ -5,7 +5,7 @@
 
 /*
  * Copyright (c) 2008-2011, ETH Zurich.
- * Copyright (c) 2015, Hewlett Packard Enterprise Development LP.
+ * Copyright (c) 2015, 2016 Hewlett Packard Enterprise Development LP.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -128,7 +128,7 @@ void debug_printf(const char *fmt, ...)
 /**
  * \brief Function to do the actual printing based on the type of capability
  */
-STATIC_ASSERT(46 == ObjType_Num, "Knowledge of all cap types");
+STATIC_ASSERT(48 == ObjType_Num, "Knowledge of all cap types");
 int debug_print_cap(char *buf, size_t len, struct capability *cap)
 {
     switch (cap->type) {
@@ -171,6 +171,10 @@ int debug_print_cap(char *buf, size_t len, struct capability *cap)
         return snprintf(buf, len, "ARM L2 table at 0x%" PRIxGENPADDR,
                         cap->u.vnode_arm_l2.base);
 
+    case ObjType_VNode_AARCH64_l0:
+        return snprintf(buf, len, "AARCH64 L0 table at 0x%" PRIxGENPADDR,
+                        cap->u.vnode_aarch64_l0.base);
+
     case ObjType_VNode_AARCH64_l1:
         return snprintf(buf, len, "AARCH64 L1 table at 0x%" PRIxGENPADDR,
                         cap->u.vnode_aarch64_l1.base);
@@ -288,6 +292,13 @@ int debug_print_cap(char *buf, size_t len, struct capability *cap)
                                   cap->u.vnode_arm_l2_mapping.pte,
                                   cap->u.vnode_arm_l2_mapping.pte_count);
 
+    case ObjType_VNode_AARCH64_l0_Mapping:
+        return snprintf(buf, len, "AARCH64 l0 Mapping (AARCH64 l0 cap @0x%p, "
+                                  "pte @0x%"PRIxLVADDR", pte_count=%hu)",
+                                  cap->u.vnode_aarch64_l0_mapping.frame,
+                                  cap->u.vnode_aarch64_l0_mapping.pte,
+                                  cap->u.vnode_aarch64_l0_mapping.pte_count);
+
     case ObjType_VNode_AARCH64_l1_Mapping:
         return snprintf(buf, len, "AARCH64 l1 Mapping (AARCH64 l1 cap @0x%p, "
                                   "pte @0x%"PRIxLVADDR", pte_count=%hu)",