diff options
Diffstat (limited to 'cooker/emit.c')
-rw-r--r-- | cooker/emit.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/cooker/emit.c b/cooker/emit.c index efe70eb..7899fa5 100644 --- a/cooker/emit.c +++ b/cooker/emit.c @@ -119,7 +119,7 @@ void emit_call(struct gluten_ctx *g, struct context_desc *cdesc, long nr, memcpy(desc->args, offset, sizeof(struct gluten_offset) * count); desc->args[count] = ret_offset; - debug(" %i: OP_CALL: %s, arguments:", g->ip.offset, syscall_name_str[nr]); + debug(" %i: OP_CALL: %s, arguments:", g->ip.offset, syscall_name(nr)); for (i = 0; i < count; i++) { debug("\t%i: %s %s%i", i, gluten_offset_name[offset[i].type], is_ptr[i] ? "*" : "", offset[i].offset); @@ -180,6 +180,42 @@ void emit_store(struct gluten_ctx *g, struct gluten_offset dst, } /** + * emit_iovload() - Emit OP_IOVLOAD instruction: IO vector from loaded pointers + * @g: gluten context + * @iov: Pointer to msg_iov, already stored in gluten + * @iovlen: Pointer to msg_iovlen, already stored in gluten + * @dst: gluten destination to copy dereferenced data + * @len: Maximum length of data to copy altogether + */ +struct gluten_offset emit_iovload(struct gluten_ctx *g, + struct gluten_offset iov, + struct gluten_offset iovlen, + size_t len) +{ + struct op *op = (struct op *)gluten_ptr(&g->g, g->ip); + struct op_iovload *load = &op->op.iovload; + struct gluten_offset dst; + + dst = gluten_rw_alloc(g, len); + + op->type = OP_IOVLOAD; + + load->iov = iov; + load->iovlen = iovlen; + + load->dst = dst; + load->size = len; + + debug(" %i: OP_IOVLOAD: #%i < (#%i) as iovec (size: %lu)", + g->ip.offset, dst.offset, iov.offset, len); + + if (++g->ip.offset > INST_MAX) + die("Too many instructions"); + + return dst; +} + +/** * emit_resolved() - Emit OP_RESOLVEFD instruction: resolve file descriptor with path * @g: gluten context * @fd: offset of the file descriptor value |