/* image.c -- start a node from a capsule image. See image.h. * * Nothing here uses the C library: the bare-metal kernel links this file. */ #include "v4/image.h" int v4_image_boot(v4_node *n, v4_exec_state *es, v4_heat *h, const v4_image *im, unsigned char *disk, unsigned blocks) { unsigned i; if (im->cell_bits != (unsigned)V4_CELL_BITS || im->node_words != (unsigned)V4_NODE_WORDS || im->data_ring != (unsigned)V4_DATA_RING || im->ret_ring != (unsigned)V4_RET_RING) return 0; v4_node_reset(n); v4_exec_reset(es); v4_heat_reset(h); for (i = 0; i < im->count; i++) if (v4_node_addr_ok(im->cells[i].addr)) n->mem[im->cells[i].addr] = im->cells[i].value; v4_node_console_attach(n, im->console_tx); v4_node_console_input_attach(n, im->console_rx, im->console_status); v4_node_stack_regs_attach(n, im->dstack_reg, im->rstack_reg); v4_node_error_attach(n, im->node_error); v4_node_fault_attach(n, im->fault_table); if (disk && blocks) v4_node_storage_attach(n, im->storage_reg, disk, blocks); n->p = im->entry; return 1; } int v4_image_waiting(const v4_node *n, const v4_image *im) { return n->input_pos == n->input_len && n->p >= im->key_start && n->p < im->key_end; }