/* 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 */
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 **/
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 {
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 {
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 {
/* 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 {
/* 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 {
/* 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 {
/* 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 {
/* 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 {
/* 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 {
/* 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 {
/* 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 {
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 {
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 {
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 {
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 {
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 /
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 /
// 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;
}
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),
};
}
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);
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);
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)) {
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;
}
// 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)))
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) {
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 {
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 "
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,
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)) {
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)) {
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)) {
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)) {
/* 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;
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;
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;
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 "
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,
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' : '.'));
}
for (int i = 0; i < num_caps; i++) {
struct RAM ram = {
.base = i,
- .bits = 0,
+ .bytes = 0,
};
struct capability cap = {
.type = ObjType_RAM,
int bits = rand() % 16;
struct RAM ram = {
.base = ((uint32_t)rand())<<bits,
- .bits = bits,
+ .bytes = 1UL << bits,
};
struct capability cap = {
.type = ObjType_RAM,
struct RAM ram = {
.base = capbase & ((1<<size_bits)-1),
- .bits = capbits,
+ .bytes = 1UL << capbits,
};
struct capability cap = {
.type = ObjType_RAM,
struct RAM ram = {
.base = capbase & ((1<<size_bits)-1),
- .bits = capbits,
+ .bytes = 1UL << capbits,
};
struct capability cap = {
.type = ObjType_RAM,
#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,
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;
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);
}
}
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;
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);
}
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));
}
.type = ObjType_RAM,
.u.ram = {
.base = base,
- .bits = bits,
+ .bytes = 1UL << bits,
}
};
struct capref ramcap;
/* 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");
}
.rights = CAPRIGHTS_READ_WRITE, // XXX
.u.frame = {
.base = framebase,
- .bits = framebits
+ .bytes = 1UL << framebits
}
};
struct capref disp;
.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;
.rights = CAPRIGHTS_READ_WRITE, // XXX
.u.frame = {
.base = framebase,
- .bits = framebits
+ .bytes = 1UL << framebits
}
};
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]);
}
}
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;
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++;
}
}
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);
}
}
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