T191: change PhysAddr, RAM, Frame, DevFrame and VNode_* cap types to have size in...
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Wed, 16 Dec 2015 15:40:54 +0000 (16:40 +0100)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Fri, 26 Feb 2016 16:26:19 +0000 (17:26 +0100)
This only changes the actual struct capability reprensentation for these
types.  Most of the code dealing with these types now uses log2ceil(bits) to
set the new `bytes` field.

Signed-off-by: Simon Gerber <simon.gerber@inf.ethz.ch>

18 files changed:
capabilities/caps.hl
kernel/arch/x86_64/page_mappings_arch.c
kernel/arch/x86_64/syscall.c
kernel/cap_delete.c
kernel/capabilities.c
kernel/include/kernel.h
lib/barrelfish/debug.c
usr/bench/mdb_bench/main.c
usr/bench/mdb_bench/reset.c
usr/mem_serv_dist/mem_serv.c
usr/mem_serv_dist/steal.c
usr/monitor/capops/delete.c
usr/monitor/domain.c
usr/monitor/inter.c
usr/monitor/spawn.c
usr/monitor/ump_support.c
usr/tests/mdbtests/test_addr_zero.c
usr/tests/mdbtests/test_range_query.c

index ce30d0c..8082af0 100644 (file)
@@ -27,7 +27,7 @@ define cte_size 6;
 /* Size of DCB: */
 define dispatcher_size 10;
 /* Size of (x86_64) VNode: */
-define vnode_size 12; /* BASE_PAGE_BITS */
+define vnode_size 4096; /* BASE_PAGE_SIZE */
 /* size of a kernel control block */
 define kcb_size 16; /* OBJBITS_KCB */
 
@@ -58,8 +58,7 @@ cap PhysAddr from_self {
 
     address genpaddr base;  /* Base address of untyped region */
     pasid pasid;            /* Physical Address Space ID */
-    size_bits uint8 bits;   /* Address bits that untyped region bears */
-
+    size gensize bytes;     /* size of region */
 };
 
 /** The following caps are similar to the previous one **/
@@ -69,8 +68,7 @@ cap RAM from PhysAddr from_self {
 
     address genpaddr base;  /* Base address of untyped region */
     pasid pasid;            /* Physical Address Space ID */
-    size_bits uint8 bits;   /* Address bits that untyped region bears */
-
+    size gensize bytes;     /* Size of region in bytes */
 };
 
 cap CNode from RAM {
@@ -158,7 +156,7 @@ cap Frame from RAM from_self {
 
     address genpaddr base;  /* Physical base address of frame */
     pasid pasid;            /* Physical Address Space ID */
-    size_bits uint8 bits;   /* Address bits this frame bears */
+    size gensize bytes;     /* Size of region in bytes */
 };
 
 cap Frame_Mapping from Frame {
@@ -174,7 +172,7 @@ cap DevFrame from PhysAddr from_self {
 
     address genpaddr base;  /* Physical base address of frame */
     pasid pasid;            /* Physical Address Space ID */
-    size_bits uint8 bits;   /* Address bits this frame bears */
+    size gensize bytes;     /* Size of region in bytes */
 };
 
 cap DevFrame_Mapping from DevFrame {
@@ -197,7 +195,7 @@ cap VNode_x86_64_pml4 from RAM {
     /* PML4 */
 
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_x86_64_pml4_Mapping from VNode_x86_64_pml4 {
@@ -213,7 +211,7 @@ cap VNode_x86_64_pdpt from RAM {
     /* PDPT */
 
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_x86_64_pdpt_Mapping from VNode_x86_64_pdpt {
@@ -228,7 +226,7 @@ cap VNode_x86_64_pdir from RAM {
     /* Page directory */
 
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_x86_64_pdir_Mapping from VNode_x86_64_pdir {
@@ -243,7 +241,7 @@ cap VNode_x86_64_ptable from RAM {
     /* Page table */
 
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_x86_64_ptable_Mapping from VNode_x86_64_ptable {
@@ -261,7 +259,7 @@ cap VNode_x86_32_pdpt from RAM {
     /* PDPT */
 
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_x86_32_pdpt_Mapping from VNode_x86_32_pdpt {
@@ -276,7 +274,7 @@ cap VNode_x86_32_pdir from RAM {
     /* Page directory */
 
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_x86_32_pdir_Mapping from VNode_x86_32_pdir {
@@ -291,7 +289,7 @@ cap VNode_x86_32_ptable from RAM {
     /* Page table */
 
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_x86_32_ptable_Mapping from VNode_x86_32_ptable {
@@ -308,7 +306,7 @@ cap VNode_ARM_l1 from RAM {
     /* L1 Page Table */
 
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_ARM_l1_Mapping from VNode_ARM_l1 {
@@ -322,7 +320,7 @@ cap VNode_ARM_l1_Mapping from VNode_ARM_l1 {
 cap VNode_ARM_l2 from RAM {
     /* L2 Page Table */
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_ARM_l2_Mapping from VNode_ARM_l2 {
@@ -338,7 +336,7 @@ cap VNode_ARM_l2_Mapping from VNode_ARM_l2 {
 cap VNode_AARCH64_l1 from RAM {
     /* L1 Page Table */
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_AARCH64_l1_Mapping from VNode_AARCH64_l1 {
@@ -352,7 +350,7 @@ cap VNode_AARCH64_l1_Mapping from VNode_AARCH64_l1 {
 cap VNode_AARCH64_l2 from RAM {
     /* L2 Page Table */
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_AARCH64_l2_Mapping from VNode_AARCH64_l2 {
@@ -366,7 +364,7 @@ cap VNode_AARCH64_l2_Mapping from VNode_AARCH64_l2 {
 cap VNode_AARCH64_l3 from RAM {
     /* L3 Page Table */
     address genpaddr base;  /* Base address of VNode */
-    size_bits { vnode_size };
+    size { vnode_size };
 };
 
 cap VNode_AARCH64_l3_Mapping from VNode_AARCH64_l3 {
index d983b2b..c32e775 100644 (file)
@@ -88,6 +88,8 @@ static errval_t x86_64_non_ptable(struct capability *dest, cslot_t slot,
                 genpaddr_t off = offset;
 
                 if (off + pte_count * X86_64_HUGE_PAGE_SIZE > get_size(src)) {
+                    printk(LOG_NOTE, "frame offset invalid: %zx > 0x%"PRIxGENSIZE"\n",
+                            off + pte_count * X86_64_BASE_PAGE_SIZE, get_size(src));
                     return SYS_ERR_FRAME_OFFSET_INVALID;
                 }
                 // Calculate page access protection flags /
@@ -124,6 +126,8 @@ static errval_t x86_64_non_ptable(struct capability *dest, cslot_t slot,
                 genpaddr_t off = offset;
 
                 if (off + pte_count * X86_64_LARGE_PAGE_SIZE > get_size(src)) {
+                    printk(LOG_NOTE, "frame offset invalid: %zx > 0x%"PRIxGENSIZE"\n",
+                            off + pte_count * X86_64_BASE_PAGE_SIZE, get_size(src));
                     return SYS_ERR_FRAME_OFFSET_INVALID;
                 }
                 // Calculate page access protection flags /
@@ -212,7 +216,13 @@ static errval_t x86_64_ptable(struct capability *dest, cslot_t slot,
     // check offset within frame
     genpaddr_t off = offset;
     if (off + pte_count * X86_64_BASE_PAGE_SIZE > get_size(src)) {
-        debug(SUBSYS_PAGING, "frame offset invalid\n");
+        debug(SUBSYS_PAGING, "frame offset invalid: %zx > 0x%"PRIxGENSIZE"\n",
+                off + pte_count * X86_64_BASE_PAGE_SIZE, get_size(src));
+        printk(LOG_NOTE, "frame offset invalid: %zx > 0x%"PRIxGENSIZE"\n",
+                off + pte_count * X86_64_BASE_PAGE_SIZE, get_size(src));
+        char buf[256];
+        sprint_cap(buf,256,src);
+        printk(LOG_NOTE, "src = %s\n", buf);
         return SYS_ERR_FRAME_OFFSET_INVALID;
     }
 
index beb69b6..36e3b1a 100644 (file)
@@ -508,7 +508,7 @@ static struct sysret handle_frame_identify(struct capability *to,
     assert((to->u.frame.base & BASE_PAGE_MASK) == 0);
     return (struct sysret) {
         .error = SYS_ERR_OK,
-        .value = to->u.frame.base | to->u.frame.bits,
+        .value = to->u.frame.base | log2cl(to->u.frame.bytes),
     };
 }
 
@@ -676,7 +676,7 @@ handle_dispatcher_setup_guest (struct capability *to, int cmd, uintptr_t *args)
         return SYSRET(err);
     }
     if (vmcb_cte->cap.type != ObjType_Frame ||
-        vmcb_cte->cap.u.frame.bits < BASE_PAGE_BITS) {
+        vmcb_cte->cap.u.frame.bytes < BASE_PAGE_SIZE) {
         return SYSRET(SYS_ERR_VMKIT_VMCB_INVALID);
     }
     err = caps_copy_to_cte(&dcb->guest_desc.vmcb, vmcb_cte, false, 0, 0);
@@ -692,7 +692,7 @@ handle_dispatcher_setup_guest (struct capability *to, int cmd, uintptr_t *args)
         return SYSRET(err);
     }
     if (ctrl_cte->cap.type != ObjType_Frame ||
-        ctrl_cte->cap.u.frame.bits < BASE_PAGE_BITS) {
+        ctrl_cte->cap.u.frame.bytes < BASE_PAGE_SIZE) {
         return SYSRET(SYS_ERR_VMKIT_CTRL_INVALID);
     }
     err = caps_copy_to_cte(&dcb->guest_desc.ctrl, ctrl_cte, false, 0, 0);
index ecb0c5b..53a2463 100644 (file)
@@ -215,7 +215,7 @@ cleanup_last(struct cte *cte, struct cte *ret_ram_cap)
         return SYS_ERR_SLOT_IN_USE;
     }
 
-    struct RAM ram = { .bits = 0 };
+    struct RAM ram = { .bytes = 0 };
     size_t len = sizeof(struct RAM) / sizeof(uintptr_t) + 1;
 
     if (!has_descendants(cte) && !has_ancestors(cte)) {
@@ -224,30 +224,30 @@ cleanup_last(struct cte *cte, struct cte *ret_ram_cap)
         switch(cap->type) {
         case ObjType_RAM:
             ram.base = cap->u.ram.base;
-            ram.bits = cap->u.ram.bits;
+            ram.bytes = cap->u.ram.bytes;
             break;
 
         case ObjType_Frame:
             ram.base = cap->u.frame.base;
-            ram.bits = cap->u.frame.bits;
+            ram.bytes = cap->u.frame.bytes;
             break;
 
         case ObjType_CNode:
             ram.base = cap->u.cnode.cnode;
-            ram.bits = cap->u.cnode.bits + OBJBITS_CTE;
+            ram.bytes = 1UL << (cap->u.cnode.bits + OBJBITS_CTE);
             break;
 
         case ObjType_Dispatcher:
             // Convert to genpaddr
             ram.base = local_phys_to_gen_phys(mem_to_local_phys((lvaddr_t)cap->u.dispatcher.dcb));
-            ram.bits = OBJBITS_DISPATCHER;
+            ram.bytes = 1UL << OBJBITS_DISPATCHER;
             break;
 
         default:
             // Handle VNodes here
             if(type_is_vnode(cap->type)) {
                 ram.base = get_address(cap);
-                ram.bits = vnode_objbits(cap->type);
+                ram.bytes = 1UL << vnode_objbits(cap->type);
             }
             break;
         }
@@ -255,7 +255,7 @@ cleanup_last(struct cte *cte, struct cte *ret_ram_cap)
 
     // have cap to return to monitor but no allocated slot and no room in
     // monitor channel; have user retry over monitor rpc interface
-    if (ram.bits > 0 &&
+    if (ram.bytes > 0 &&
         !ret_ram_cap &&
         monitor_ep.type == ObjType_EndPoint &&
         err_is_fail(lmp_can_deliver_payload(&monitor_ep, len)))
@@ -269,7 +269,7 @@ cleanup_last(struct cte *cte, struct cte *ret_ram_cap)
         return err;
     }
 
-    if(ram.bits > 0) {
+    if(ram.bytes > 0) {
         // Send back as RAM cap to monitor
         if (ret_ram_cap) {
             if (dcb_current != monitor_ep.u.endpoint.listener) {
@@ -298,10 +298,10 @@ cleanup_last(struct cte *cte, struct cte *ret_ram_cap)
                                       len, false);
         }
         else {
-            printk(LOG_WARN, "dropping ram cap base %08"PRIxGENPADDR" bits %"PRIu8"\n", ram.base, ram.bits);
+            printk(LOG_WARN, "dropping ram cap base %08"PRIxGENPADDR" bytes 0x%"PRIxGENSIZE"\n", ram.base, ram.bytes);
         }
         if (err_no(err) == SYS_ERR_LMP_BUF_OVERFLOW) {
-            printk(LOG_WARN, "dropped ram cap base %08"PRIxGENPADDR" bits %"PRIu8"\n", ram.base, ram.bits);
+            printk(LOG_WARN, "dropped ram cap base %08"PRIxGENPADDR" bytes 0x%"PRIxGENSIZE"\n", ram.base, ram.bytes);
             err = SYS_ERR_OK;
 
         } else {
index 8dc6f27..465ce6b 100644 (file)
@@ -58,12 +58,12 @@ int sprint_cap(char *buf, size_t len, struct capability *cap)
     switch (cap->type) {
     case ObjType_PhysAddr:
         return snprintf(buf, len,
-                        "physical address range cap (0x%" PRIxGENPADDR ":%u)",
-                        cap->u.physaddr.base, cap->u.physaddr.bits);
+                        "physical address range cap (0x%" PRIxGENPADDR ":0x%zx)",
+                        cap->u.physaddr.base, cap->u.physaddr.bytes);
 
     case ObjType_RAM:
-        return snprintf(buf, len, "RAM cap (0x%" PRIxGENPADDR ":%u)",
-                        cap->u.ram.base, cap->u.ram.bits);
+        return snprintf(buf, len, "RAM cap (0x%" PRIxGENPADDR ":0x%zx)",
+                        cap->u.ram.base, cap->u.ram.bytes);
 
     case ObjType_CNode: {
         int ret = snprintf(buf, len, "CNode cap "
@@ -80,12 +80,12 @@ int sprint_cap(char *buf, size_t len, struct capability *cap)
         return snprintf(buf, len, "Dispatcher cap %p", cap->u.dispatcher.dcb);
 
     case ObjType_Frame:
-        return snprintf(buf, len, "Frame cap (0x%" PRIxGENPADDR ":%u)",
-                        cap->u.frame.base, cap->u.frame.bits);
+        return snprintf(buf, len, "Frame cap (0x%" PRIxGENPADDR ":0x%zx)",
+                        cap->u.frame.base, cap->u.frame.bytes);
 
     case ObjType_DevFrame:
-        return snprintf(buf, len, "Device Frame cap (0x%" PRIxGENPADDR ":%u)",
-                        cap->u.frame.base, cap->u.devframe.bits);
+        return snprintf(buf, len, "Device Frame cap (0x%" PRIxGENPADDR ":0x%zx)",
+                        cap->u.frame.base, cap->u.devframe.bytes);
 
     case ObjType_VNode_ARM_l1:
         return snprintf(buf, len, "ARM L1 table at 0x%" PRIxGENPADDR,
@@ -563,7 +563,8 @@ static errval_t caps_create(enum objtype type, lpaddr_t lpaddr, uint8_t bits,
         for(dest_i = 0; dest_i < numobjs; dest_i++) {
             // Initialize type specific fields
             src_cap.u.frame.base = genpaddr + dest_i * ((genpaddr_t)1 << objbits);
-            src_cap.u.frame.bits = objbits;
+            src_cap.u.frame.bytes = 1UL << objbits;
+            assert((get_size(&src_cap) & BASE_PAGE_MASK) == 0);
             // Insert the capabilities
             err = set_cap(&dest_caps[dest_i].cap, &src_cap);
             if (err_is_fail(err)) {
@@ -576,7 +577,7 @@ static errval_t caps_create(enum objtype type, lpaddr_t lpaddr, uint8_t bits,
         for(dest_i = 0; dest_i < numobjs; dest_i++) {
             // Initialize type specific fields
             src_cap.u.physaddr.base = genpaddr + dest_i * ((genpaddr_t)1 << objbits);
-            src_cap.u.physaddr.bits = objbits;
+            src_cap.u.physaddr.bytes = 1UL << objbits;
             // Insert the capabilities
             err = set_cap(&dest_caps[dest_i].cap, &src_cap);
             if (err_is_fail(err)) {
@@ -589,7 +590,7 @@ static errval_t caps_create(enum objtype type, lpaddr_t lpaddr, uint8_t bits,
         for(dest_i = 0; dest_i < numobjs; dest_i++) {
             // Initialize type specific fields
             src_cap.u.ram.base = genpaddr + dest_i * ((genpaddr_t)1 << objbits);
-            src_cap.u.ram.bits = objbits;
+            src_cap.u.ram.bytes = 1UL << objbits;
             // Insert the capabilities
             err = set_cap(&dest_caps[dest_i].cap, &src_cap);
             if (err_is_fail(err)) {
@@ -602,7 +603,7 @@ static errval_t caps_create(enum objtype type, lpaddr_t lpaddr, uint8_t bits,
         for(dest_i = 0; dest_i < numobjs; dest_i++) {
             // Initialize type specific fields
             src_cap.u.devframe.base = genpaddr + dest_i * ((genpaddr_t)1 << objbits);
-            src_cap.u.devframe.bits = objbits;
+            src_cap.u.devframe.bytes = 1UL << objbits;
             // Insert the capabilities
             err = set_cap(&dest_caps[dest_i].cap, &src_cap);
             if (err_is_fail(err)) {
@@ -1303,12 +1304,12 @@ errval_t caps_retype(enum objtype type, size_t objbits,
     /* Create Destination caps as per source and destination type */
     switch(src_cap->type) {
     case ObjType_PhysAddr:
-        bits = src_cap->u.physaddr.bits;
+        bits = log2cl(src_cap->u.physaddr.bytes);
         base = src_cap->u.physaddr.base;
         break;
 
     case ObjType_RAM:
-        bits = src_cap->u.ram.bits;
+        bits = log2cl(src_cap->u.ram.bytes);
         base = src_cap->u.ram.base;
         break;
 
@@ -1317,12 +1318,12 @@ errval_t caps_retype(enum objtype type, size_t objbits,
         break;
 
     case ObjType_Frame:
-        bits = src_cap->u.frame.bits;
+        bits = log2cl(src_cap->u.frame.bytes);
         base = src_cap->u.frame.base;
         break;
 
     case ObjType_DevFrame:
-        bits = src_cap->u.devframe.bits;
+        bits = log2cl(src_cap->u.devframe.bytes);
         base = src_cap->u.devframe.base;
         break;
 
index 27f8bde..7fd8c4a 100644 (file)
@@ -78,6 +78,17 @@ static inline uint8_t log2flr(uintptr_t num)
     return l;
 }
 
+/// Computes the ceiling of log_2 of the given number
+static inline uint8_t log2cl(uintptr_t num)
+{
+    uint8_t l = log2flr(num);
+    if (num == ((uintptr_t)1) << l) { /* fencepost case */
+        return l;
+    } else {
+        return l + 1;
+    }
+}
+
 static inline int bitaddralign(size_t n, lpaddr_t base_addr)
 {
     int exponent = sizeof(size_t) * NBBY - 1;
index 998e935..1ff4d09 100644 (file)
@@ -134,12 +134,12 @@ int debug_print_cap(char *buf, size_t len, struct capability *cap)
     switch (cap->type) {
     case ObjType_PhysAddr:
         return snprintf(buf, len,
-                        "physical address range cap (0x%" PRIxGENPADDR ":%u)",
-                        cap->u.physaddr.base, cap->u.physaddr.bits);
+                        "physical address range cap (0x%" PRIxGENPADDR ":0x%zx)",
+                        cap->u.physaddr.base, cap->u.physaddr.bytes);
 
     case ObjType_RAM:
-        return snprintf(buf, len, "RAM cap (0x%" PRIxGENPADDR ":%u)",
-                        cap->u.ram.base, cap->u.ram.bits);
+        return snprintf(buf, len, "RAM cap (0x%" PRIxGENPADDR ":0x%zx)",
+                        cap->u.ram.base, cap->u.ram.bytes);
 
     case ObjType_CNode: {
         int ret = snprintf(buf, len, "CNode cap "
@@ -156,12 +156,12 @@ int debug_print_cap(char *buf, size_t len, struct capability *cap)
         return snprintf(buf, len, "Dispatcher cap %p", cap->u.dispatcher.dcb);
 
     case ObjType_Frame:
-        return snprintf(buf, len, "Frame cap (0x%" PRIxGENPADDR ":%u)",
-                        cap->u.frame.base, cap->u.frame.bits);
+        return snprintf(buf, len, "Frame cap (0x%" PRIxGENPADDR ":0x%zx)",
+                        cap->u.frame.base, cap->u.frame.bytes);
 
     case ObjType_DevFrame:
-        return snprintf(buf, len, "Device Frame cap (0x%" PRIxGENPADDR ":%u)",
-                        cap->u.frame.base, cap->u.devframe.bits);
+        return snprintf(buf, len, "Device Frame cap (0x%" PRIxGENPADDR ":%zx)",
+                        cap->u.frame.base, cap->u.devframe.bytes);
 
     case ObjType_VNode_ARM_l1:
         return snprintf(buf, len, "ARM L1 table at 0x%" PRIxGENPADDR,
index e03c285..f6588a7 100644 (file)
@@ -63,8 +63,8 @@ reset_and_dump(char *base, size_t size, size_t runs, reset_fn reset, const char
             struct cte *cte = &ctes[i];
             struct capability *curr = &cte->cap;
             assert(curr->type == ObjType_RAM);
-            printf("%s/%zu:dump:%zu: 0x%08"PRIxGENPADDR"/%"PRIu8" %c%c%c\n",
-                   name, num_caps, run, curr->u.ram.base, curr->u.ram.bits,
+            printf("%s/%zu:dump:%zu: 0x%08"PRIxGENPADDR"/0x%"PRIxGENSIZE" %c%c%c\n",
+                   name, num_caps, run, curr->u.ram.base, curr->u.ram.bytes,
                    (HASCOP(cte) ? 'c' : '.'), (HASANC(cte) ? 'a' : '.'),
                    (HASDESC(cte) ? 'd' : '.'));
         }
index 0b825ad..9f427c3 100644 (file)
@@ -25,7 +25,7 @@ static void reset_mdb_seq_1b_ram(char *base, size_t size)
     for (int i = 0; i < num_caps; i++) {
         struct RAM ram = {
             .base = i,
-            .bits = 0,
+            .bytes = 0,
         };
         struct capability cap = {
             .type = ObjType_RAM,
@@ -47,7 +47,7 @@ static void reset_mdb_random_nat_ram(char *base, size_t size)
         int bits = rand() % 16;
         struct RAM ram = {
             .base = ((uint32_t)rand())<<bits,
-            .bits = bits,
+            .bytes = 1UL << bits,
         };
         struct capability cap = {
             .type = ObjType_RAM,
@@ -77,7 +77,7 @@ static void reset_mdb_propszrand_nat_ram(char *base, size_t size)
 
         struct RAM ram = {
             .base = capbase & ((1<<size_bits)-1),
-            .bits = capbits,
+            .bytes = 1UL << capbits,
         };
         struct capability cap = {
             .type = ObjType_RAM,
@@ -124,7 +124,7 @@ static void reset_mdb_szprob_cp_nat_ram(char *base, size_t size)
 
             struct RAM ram = {
                 .base = capbase & ((1<<size_bits)-1),
-                .bits = capbits,
+                .bytes = 1UL << capbits,
             };
             struct capability cap = {
                 .type = ObjType_RAM,
index 651b07b..736e6f4 100644 (file)
@@ -184,7 +184,7 @@ static errval_t percore_free(struct capref ramcap)
 #endif
 
     return do_free(&mm_percore, ramcap, info.u.ram.base,
-                   info.u.ram.bits, &mem_avail);
+                   log2ceil(info.u.ram.bytes), &mem_avail);
 }
 
 errval_t percore_free_handler_common(struct capref ramcap, genpaddr_t base,
@@ -438,7 +438,7 @@ static memsize_t fill_mm(struct mm *mm, memsize_t mem_requested, uint8_t bits,
                      info.type, info.u.ram.base, info.u.ram.base, 
                      info.u.ram.bits);
 #endif
-        assert(bits == info.u.ram.bits);
+        assert(bits == log2ceil(info.u.ram.bytes));
         
         mem_to_add = (memsize_t)1 << bits;
 
@@ -452,8 +452,8 @@ static memsize_t fill_mm(struct mm *mm, memsize_t mem_requested, uint8_t bits,
             uint8_t new_bits = log2floor(mem_requested);
             bits = MIN(bits, new_bits);
         } else {
-            DEBUG_ERR(err, "Warning: adding RAM region (%p/%d) FAILED", 
-                      info.u.ram.base, info.u.ram.bits);
+            DEBUG_ERR(err, "Warning: adding RAM region (%p/0x%"PRIxGENSIZE") FAILED",
+                      info.u.ram.base, info.u.ram.bytes);
         }
     }
 
@@ -497,7 +497,7 @@ static errval_t init_mm(struct mm *mm, char nodebuf[], memsize_t nodebuf_size,
     printf("Cap is type %d Ram base 0x%"PRIxGENPADDR" Bits %d\n",
            info.type, info.u.ram.base, info.u.ram.bits);
 #endif
-    assert(SMALLCAP_BITS == info.u.ram.bits);
+    assert(SMALLCAP_BITS == log2ceil(info.u.ram.bytes));
 
     *mem_tot += (memsize_t)1<<SMALLCAP_BITS;
 
index 3f5bfaa..21e8ea3 100644 (file)
@@ -204,19 +204,19 @@ static errval_t steal_and_alloc(struct capref *ret_cap, uint8_t steal_bits,
                  info.type, info.u.ram.base, info.u.ram.base, 
                  info.u.ram.bits);
 #endif
-    if(steal_bits != info.u.ram.bits) {
+    if(steal_bits != log2ceil(info.u.ram.bytes)) {
       printf("asked for %d bits, but got %d bits of type %d\n",
-            steal_bits, info.u.ram.bits, info.type);
+            steal_bits, log2ceil(info.u.ram.bytes), info.type);
     }
-    assert(steal_bits == info.u.ram.bits);
+    assert(steal_bits == log2ceil(info.u.ram.bytes));
 
-    memsize_t mem_to_add = (memsize_t)1 << info.u.ram.bits;
+    memsize_t mem_to_add = (memsize_t)info.u.ram.bytes;
 
-    err = mm_free(&mm_percore, ramcap, info.u.ram.base, info.u.ram.bits);
+    err = mm_free(&mm_percore, ramcap, info.u.ram.base, log2ceil(info.u.ram.bytes));
     if (err_is_fail(err)) {
         if (err_no(err) == MM_ERR_NOT_FOUND) {
             // memory wasn't there initially, add it
-            err = mm_add(&mm_percore, ramcap, info.u.ram.bits, info.u.ram.base);
+            err = mm_add(&mm_percore, ramcap, log2ceil(info.u.ram.bytes), info.u.ram.base);
             if (err_is_fail(err)) {
                 return err_push(err, MM_ERR_MM_ADD);
             }
index 706fb47..444027b 100644 (file)
@@ -74,13 +74,13 @@ send_new_ram_cap(struct capref cap)
     if (!b) {
         DEBUG_CAPOPS("%s: forwarding to monitor.0\n", __FUNCTION__);
         // we're not on core 0, so forward free_monitor msg to monitor.0
-        err = mon_ram_free(&cap_data, ram.base, ram.bits);
+        err = mon_ram_free(&cap_data, ram.base, log2ceil(ram.bytes));
         assert(err_is_ok(err));
     } else {
         DEBUG_CAPOPS("%s: we are monitor.0\n", __FUNCTION__);
         // XXX: This should not be an RPC! It could stall the monitor, but
         // we trust mem_serv for the moment.
-        err = b->vtbl.free_monitor(b, cap, ram.base, ram.bits, &result);
+        err = b->vtbl.free_monitor(b, cap, ram.base, log2ceil(ram.bytes), &result);
         assert(err_is_ok(err));
         assert(err_is_ok(result));
     }
index 920cd12..ccaf26d 100644 (file)
@@ -35,7 +35,7 @@ static errval_t reclaim_memory(genpaddr_t base, uint8_t bits)
         .type = ObjType_RAM,
         .u.ram = {
             .base = base,
-            .bits = bits,
+            .bytes = 1UL << bits,
         }
     };
     struct capref ramcap;
@@ -106,7 +106,7 @@ static void handle_notification(void *arg)
                 /* printf("%s.%d: RAM cap deleted, base = %" PRIxGENPADDR ", bits = %u\n", */
                 /*        disp_name(), disp_get_core_id(), ram->base, ram->bits); */
 
-                err = reclaim_memory(u->ram.base, u->ram.bits);
+                err = reclaim_memory(u->ram.base, log2ceil(u->ram.bytes));
                 if(err_is_fail(err)) {
                     DEBUG_ERR(err, "reclaim_memory");
                 }
index 6eb1073..ce05801 100644 (file)
@@ -357,7 +357,7 @@ static void span_domain_request(struct intermon_binding *b,
         .rights = CAPRIGHTS_READ_WRITE, // XXX
         .u.frame = {
             .base = framebase,
-            .bits = framebits
+            .bytes = 1UL << framebits
         }
     };
     struct capref disp;
index 412a192..32e6f5e 100644 (file)
@@ -340,7 +340,7 @@ errval_t spawn_spawnd(struct intermon_binding *b)
         .rights = CAPRIGHTS_ALLRIGHTS,
         .u.frame = {
             .base = spawnd_image.base,
-            .bits = log2ceil(spawnd_image.bytes),
+            .bytes = ROUND_UP(spawnd_image.bytes, BASE_PAGE_SIZE),
         }
     };
     struct capref frame;
index a9b66f7..f45b847 100644 (file)
@@ -397,7 +397,7 @@ static void intermon_bind_ump_request(struct intermon_binding *ib,
         .rights = CAPRIGHTS_READ_WRITE, // XXX
         .u.frame = {
             .base = framebase,
-            .bits = framebits
+            .bytes = 1UL << framebits
         }
     };
 
index d35ca51..1d11ea2 100644 (file)
@@ -27,7 +27,7 @@ static inline void setup(void) {
         cap->type = ObjType_PhysAddr;
         cap->rights = CAPRIGHTS_ALLRIGHTS;
         cap->u.ram.base = 0x0;
-        cap->u.ram.bits = BASE_BITS + i;
+        cap->u.ram.bytes = 1UL << (BASE_BITS + i);
         mdb_insert(&caps[i]);
     }
 }
@@ -41,7 +41,7 @@ int main(int argc, char *argv[])
     cap->type = ObjType_DevFrame;
     cap->rights = CAPRIGHTS_ALLRIGHTS;
     cap->u.devframe.base = 0x0;
-    cap->u.devframe.bits = BASE_BITS;
+    cap->u.devframe.bytes = 1UL << BASE_BITS;
     mdb_insert(&devframe);
 
     struct cte *retcte;
index 72cf014..46cbb87 100644 (file)
@@ -68,7 +68,7 @@ get_ranges(size_t count, uint8_t max_addr_bits, struct cte *out)
             memset(&out[gencount], 0, sizeof(struct cte));
             out[gencount].cap.type = ObjType_RAM;
             out[gencount].cap.rights = CAPRIGHTS_ALLRIGHTS;
-            out[gencount].cap.u.ram = (struct RAM) { .base = begin, .bits = sizebits };
+            out[gencount].cap.u.ram = (struct RAM) { .base = begin, .bytes = 1UL << sizebits };
             gencount++;
         }
     }
@@ -191,8 +191,8 @@ __attribute__((unused))
 static void dump_ranges(struct cte *ranges, size_t count)
 {
     for (int i = 0; i < count; i++) {
-        printf("address = %"PRIxGENVADDR"\nsize=%d\n",
-                ranges[i].cap.u.ram.base, ranges[i].cap.u.ram.bits);
+        printf("address = %"PRIxGENVADDR"\nsize=0x%"PRIxGENSIZE"\n",
+                ranges[i].cap.u.ram.base, ranges[i].cap.u.ram.bytes);
     }
 }
 
@@ -236,10 +236,10 @@ int main(int argc, char *argv[])
             if (retcap != q->target) {
                 printf("Query: address = 0x%"PRIxGENVADDR", size = %zu\n", q->begin, q->size);
                 USER_PANIC("mdb_find_range returned cap (.base = 0x%"
-                        PRIxGENVADDR", .bits = %"PRIu8") (expected (.base = 0x%"
-                        PRIxGENVADDR", .bits = %"PRIu8"))\n",
-                        retcap->cap.u.ram.base, retcap->cap.u.ram.bits,
-                        q->target->cap.u.ram.base, q->target->cap.u.ram.bits);
+                        PRIxGENVADDR", .bytes = 0x%"PRIxGENSIZE") (expected (.base = 0x%"
+                        PRIxGENVADDR", .bytes = 0x%"PRIxGENSIZE"))\n",
+                        retcap->cap.u.ram.base, retcap->cap.u.ram.bytes,
+                        q->target->cap.u.ram.base, q->target->cap.u.ram.bytes);
             }
         }
         // empty tree