aboutgitcodelistschat:MatrixIRC
path: root/cooker/emit.c
diff options
context:
space:
mode:
Diffstat (limited to 'cooker/emit.c')
-rw-r--r--cooker/emit.c38
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