+}
+
+void
+dtpx_compile_proplet(struct dtprop_def* proplet)
+{
+ int i;
+ unsigned int acc = 0;
+
+ for (i = 0; proplet[i].type && i < 10; ++i)
+ {
+ proplet[i].acc_sz = acc;
+ acc += proplet[i].cell;
+ }
+
+ if (proplet[i - 1].type && i == 10) {
+ FATAL("invalid proplet: no terminator detected");
+ }
+
+ proplet[i].acc_sz = acc;
+}
+
+void
+dtpx_prepare_with(struct dtpropx* propx, struct dtp_val* prop,
+ struct dtprop_def* proplet)
+{
+ int i;
+ bool has_str = false;
+
+ for (i = 0; proplet[i].type; ++i);
+
+ propx->proplet = proplet;
+ propx->proplet_len = i;
+ propx->proplet_sz = proplet[i].acc_sz;
+ propx->raw = prop;
+ propx->row_loc = 0;
+}
+
+bool
+dtpx_goto_row(struct dtpropx* propx, int row)
+{
+ off_t loc;
+
+ loc = propx->proplet_sz;
+ loc *= row;
+
+ if (loc * sizeof(u32_t) >= propx->raw->size) {
+ return false;
+ }
+
+ propx->row_loc = loc;
+ return true;
+}
+
+bool
+dtpx_next_row(struct dtpropx* propx)
+{
+ off_t loc;
+
+ loc = propx->row_loc;
+ loc += propx->proplet_sz;
+
+ if (loc * sizeof(u32_t) >= propx->raw->size) {
+ return false;
+ }
+
+ propx->row_loc = loc;
+ return true;
+}
+
+bool
+dtpx_extract_at(struct dtpropx* propx,
+ struct dtprop_xval* val, int col)
+{
+ struct dtprop_def* def;
+ union dtp_baseval* raw;
+ dt_enc_t enc;
+
+ if (unlikely(col >= propx->proplet_len)) {
+ return false;
+ }
+
+ def = &propx->proplet[col];
+ enc = &propx->raw->encoded[propx->row_loc + def->acc_sz];
+ raw = (union dtp_baseval*)enc;
+
+ val->archetype = def;
+
+ switch (def->type)
+ {
+ case DTP_U32:
+ val->u32 = raw->u32_val;
+ break;
+
+ case DTP_U64:
+ val->u64 = raw->u64_val;
+ break;
+
+ case DTP_PHANDLE:
+ {
+ ptr_t hnd = raw->phandle;
+ val->phandle = dt_resolve_phandle(hnd);
+ } break;
+
+ case DTP_COMPX:
+ val->composite = enc;
+ break;
+
+ default:
+ break;
+ }
+
+ return true;
+}
+
+bool
+dtpx_extract_loc(struct dtpropx* propx,
+ struct dtprop_xval* val, int row, int col)
+{
+ ptr_t loc = propx->row_loc;
+
+ if (!dtpx_goto_row(propx, row))
+ return false;
+
+
+ bool r = dtpx_extract_at(propx, val, col);
+ propx->row_loc = loc;
+ return r;
+}
+
+bool
+dtpx_extract_row(struct dtpropx* propx, struct dtprop_xval* vals, int len)
+{
+ assert(len == propx->proplet_len);
+
+ for (int i = 0; i < len; i++)
+ {
+ if (!dtpx_extract_at(propx, &vals[i], i)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+struct dt_context*
+dt_main_context()
+{
+ return &dtctx;
+}
+
+static void
+__init_devtree()
+{
+ devtree_obj_root = changeling_spawn(NULL, NULL);
+}
+owloysius_fetch_init(__init_devtree, on_sysconf);
\ No newline at end of file