static void mdb_dump_and_fail(struct cte *cte, enum mdb_invariant failure) { mdb_dump(cte, 0); panic("failed on cte %p with failure %s (%d)\n", cte, mdb_invariant_to_str(failure), failure); }
void mdb_dump(struct cte *cte, int indent) { // Print a tree with root on the left, the smallest element at the top and the // largest at the bottom. /* make an indent buffer */ char indent_buff[indent+2]; for (int i=0; i < indent+1; i++) { indent_buff[i]='\t'; } indent_buff[indent+1] = '\0'; if (!cte) { printf("NULL{}\n"); return; } struct mdbnode *node = N(cte); if (node->left) { if (node->left == cte) { printf("%sSELF!!!!\n", indent_buff); } else { mdb_dump(node->left, indent+1); } } printf("%s%p{left=%p,right=%p,end=0x%08"PRIxGENPADDR",end_root=%"PRIu8"," "level=%"PRIu8",address=0x%08"PRIxGENPADDR",size=0x%08"PRIx64"," "type=%"PRIu8",remote_rels=%d}\n", indent_buff, cte, node->left, node->right, node->end, node->end_root, node->level, get_address(C(cte)), get_size(C(cte)), (uint8_t)C(cte)->type, N(cte)->remote_relations); if (node->right) { if (node->right == cte) { printf("%sSELF!!!!\n", indent_buff); } else { mdb_dump(node->right, indent+1); } } }
// on failure, dump mdb and terminate static void mdb_dump_and_fail(struct cte *cte, int failure) { mdb_dump(cte, 0); printf("failed on cte %p with failure %d\n", cte, failure); // XXX: what is "proper" way to always terminate? assert(false); }
void mdb_dump(struct cte *cte, int indent) { // Print a tree with root on the left, the smallest element at the top and the // largest at the bottom. /* make an indent buffer */ char indent_buff[indent+2]; for (int i=0; i < indent+1; i++) { indent_buff[i]='\t'; } indent_buff[indent+1] = '\0'; if (!cte) { printf("NULL{}\n"); return; } struct mdbnode *node = N(cte); assert(node); if (node->left) { if (node->left == cte) { printf("%sSELF!!!!\n", indent_buff); } else { mdb_dump(node->left, indent+1); } } print_cte(cte, indent_buff); if (node->right) { if (node->right == cte) { printf("%sSELF!!!!\n", indent_buff); } else { mdb_dump(node->right, indent+1); } } }
void mdb_dump_all_the_things(void) { mdb_dump(mdb_root, 0); }