Adding a function that builds a 'struct cnoderef' given a 'struct capref'.
authorRaphael Fuchs <raphaelfuchs@student.ethz.ch>
Fri, 22 Jun 2012 09:04:54 +0000 (11:04 +0200)
committerRaphael Fuchs <raphaelfuchs@student.ethz.ch>
Fri, 22 Jun 2012 09:04:54 +0000 (11:04 +0200)
The function uses cap identification to get the missing information.

errors/errno.fugu
include/barrelfish/capabilities.h
lib/barrelfish/capabilities.c

index cc5e4bd..c965e9e 100644 (file)
@@ -142,6 +142,7 @@ errors libbarrelfish LIB_ERR_ {
     failure SLAB_REFILL         "Refilling slab allocator failed",
     failure NOT_IMPLEMENTED     "functionality not implemented yet",
     failure SHOULD_NOT_GET_HERE "Should not get here",
+    failure NOT_CNODE           "Function invoked on a capref, that does not represent a CNode",
 
     // nested errors in specific functions
     failure FRAME_ALLOC         "Failure in frame_alloc()",
index 5d289b0..a601852 100644 (file)
@@ -54,6 +54,9 @@ errval_t endpoint_create(size_t buflen, struct capref *retcap,
 errval_t idcap_alloc(struct capref *dest);
 errval_t idcap_create(struct capref dest);
 
+errval_t build_cnoderef_from_capref(struct cnoderef *cnoder,
+                                    struct capref capr);
+
 /**
  * \brief Mint (Copy changing type-specific parameters) a capability
  *
index ccd1fb8..7fc9e30 100644 (file)
@@ -726,3 +726,30 @@ errval_t idcap_create(struct capref dest)
 {
     return cap_create(dest, ObjType_ID, 0);
 }
+
+/**
+ * \brief Builds a #cnoderef struct from a #capref struct using cap
+ *        identification.
+ *
+ * \param cnoder Pointer to a cnoderef struct, fill-in by function.
+ * \param capr   Capref to a CNode capability.
+ */
+errval_t build_cnoderef_from_capref(struct cnoderef *cnoder, struct capref capr)
+{
+    struct capability cap;
+    errval_t err = debug_cap_identify(capr, &cap);
+    if (err_is_fail(err)) {
+        return err;
+    }
+
+    if (cap.type != ObjType_CNode) {
+        return LIB_ERR_NOT_A_CNODE;
+    }
+
+    cnoder->address = get_cap_addr(capr);
+    cnoder->address_bits = get_cap_valid_bits(capr);
+    cnoder->size_bits = cap.u.cnode.bits;
+    cnoder->guard_size = cap.u.cnode.guard_size;
+
+    return SYS_ERR_OK;
+}