Rename "tsc" to "timestamp"
[lttng-modules.git] / src / lttng-bytecode-validator.c
CommitLineData
9f36eaed
MJ
1/* SPDX-License-Identifier: MIT
2 *
80c2a69a 3 * lttng-bytecode-validator.c
07dfc1d0 4 *
80c2a69a 5 * LTTng modules bytecode bytecode validator.
07dfc1d0 6 *
bbf3aef5 7 * Copyright (C) 2010-2016 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
07dfc1d0
MD
8 */
9
499cc3f7 10#include <linux/types.h>
07dfc1d0
MD
11#include <linux/jhash.h>
12#include <linux/slab.h>
13
241ae9a8 14#include <wrapper/list.h>
80c2a69a 15#include <lttng/lttng-bytecode.h>
07dfc1d0
MD
16
17#define MERGE_POINT_TABLE_BITS 7
18#define MERGE_POINT_TABLE_SIZE (1U << MERGE_POINT_TABLE_BITS)
19
20/* merge point table node */
21struct mp_node {
22 struct hlist_node node;
23
24 /* Context at merge point */
25 struct vstack stack;
26 unsigned long target_pc;
27};
28
29struct mp_table {
30 struct hlist_head mp_head[MERGE_POINT_TABLE_SIZE];
31};
32
33static
34int lttng_hash_match(struct mp_node *mp_node, unsigned long key_pc)
35{
36 if (mp_node->target_pc == key_pc)
37 return 1;
38 else
39 return 0;
40}
41
42static
43int merge_points_compare(const struct vstack *stacka,
44 const struct vstack *stackb)
45{
46 int i, len;
47
48 if (stacka->top != stackb->top)
49 return 1;
50 len = stacka->top + 1;
51 WARN_ON_ONCE(len < 0);
52 for (i = 0; i < len; i++) {
53 if (stacka->e[i].type != stackb->e[i].type)
54 return 1;
55 }
56 return 0;
57}
58
59static
60int merge_point_add_check(struct mp_table *mp_table, unsigned long target_pc,
61 const struct vstack *stack)
62{
63 struct mp_node *mp_node;
64 unsigned long hash = jhash_1word(target_pc, 0);
65 struct hlist_head *head;
66 struct mp_node *lookup_node;
67 int found = 0;
68
80c2a69a 69 dbg_printk("Bytecode: adding merge point at offset %lu, hash %lu\n",
07dfc1d0
MD
70 target_pc, hash);
71 mp_node = kzalloc(sizeof(struct mp_node), GFP_KERNEL);
72 if (!mp_node)
73 return -ENOMEM;
74 mp_node->target_pc = target_pc;
75 memcpy(&mp_node->stack, stack, sizeof(mp_node->stack));
76
77 head = &mp_table->mp_head[hash & (MERGE_POINT_TABLE_SIZE - 1)];
d216ecae 78 lttng_hlist_for_each_entry(lookup_node, head, node) {
07dfc1d0
MD
79 if (lttng_hash_match(lookup_node, target_pc)) {
80 found = 1;
81 break;
82 }
83 }
84 if (found) {
85 /* Key already present */
80c2a69a 86 dbg_printk("Bytecode: compare merge points for offset %lu, hash %lu\n",
07dfc1d0
MD
87 target_pc, hash);
88 kfree(mp_node);
89 if (merge_points_compare(stack, &lookup_node->stack)) {
80c2a69a 90 printk(KERN_WARNING "LTTng: bytecode: Merge points differ for offset %lu\n",
07dfc1d0
MD
91 target_pc);
92 return -EINVAL;
93 }
5e13eb3c
MD
94 } else {
95 hlist_add_head(&mp_node->node, head);
07dfc1d0 96 }
07dfc1d0
MD
97 return 0;
98}
99
100/*
101 * Binary comparators use top of stack and top of stack -1.
102 */
103static
80c2a69a 104int bin_op_compare_check(struct vstack *stack, const bytecode_opcode_t opcode,
02aca193 105 const char *str)
07dfc1d0
MD
106{
107 if (unlikely(!vstack_ax(stack) || !vstack_bx(stack)))
3834b99f 108 goto error_empty;
07dfc1d0
MD
109
110 switch (vstack_ax(stack)->type) {
111 default:
112 case REG_DOUBLE:
3834b99f 113 goto error_type;
07dfc1d0
MD
114
115 case REG_STRING:
116 switch (vstack_bx(stack)->type) {
117 default:
118 case REG_DOUBLE:
3834b99f
MD
119 goto error_type;
120 case REG_TYPE_UNKNOWN:
121 goto unknown;
07dfc1d0
MD
122 case REG_STRING:
123 break;
02aca193 124 case REG_STAR_GLOB_STRING:
80c2a69a 125 if (opcode != BYTECODE_OP_EQ && opcode != BYTECODE_OP_NE) {
02aca193
PP
126 goto error_mismatch;
127 }
128 break;
129 case REG_S64:
1242217a 130 case REG_U64:
02aca193
PP
131 goto error_mismatch;
132 }
133 break;
134 case REG_STAR_GLOB_STRING:
135 switch (vstack_bx(stack)->type) {
136 default:
137 case REG_DOUBLE:
3834b99f
MD
138 goto error_type;
139 case REG_TYPE_UNKNOWN:
140 goto unknown;
02aca193 141 case REG_STRING:
80c2a69a 142 if (opcode != BYTECODE_OP_EQ && opcode != BYTECODE_OP_NE) {
02aca193
PP
143 goto error_mismatch;
144 }
145 break;
146 case REG_STAR_GLOB_STRING:
07dfc1d0 147 case REG_S64:
1242217a 148 case REG_U64:
07dfc1d0
MD
149 goto error_mismatch;
150 }
151 break;
152 case REG_S64:
1242217a 153 case REG_U64:
07dfc1d0
MD
154 switch (vstack_bx(stack)->type) {
155 default:
156 case REG_DOUBLE:
3834b99f
MD
157 goto error_type;
158 case REG_TYPE_UNKNOWN:
159 goto unknown;
07dfc1d0 160 case REG_STRING:
02aca193 161 case REG_STAR_GLOB_STRING:
07dfc1d0 162 goto error_mismatch;
07dfc1d0 163 case REG_S64:
1242217a 164 case REG_U64:
07dfc1d0
MD
165 break;
166 }
167 break;
3834b99f
MD
168 case REG_TYPE_UNKNOWN:
169 switch (vstack_bx(stack)->type) {
170 default:
171 case REG_DOUBLE:
172 goto error_type;
173 case REG_TYPE_UNKNOWN:
174 case REG_STRING:
175 case REG_STAR_GLOB_STRING:
176 case REG_S64:
1242217a 177 case REG_U64:
3834b99f
MD
178 goto unknown;
179 }
180 break;
07dfc1d0
MD
181 }
182 return 0;
183
3834b99f
MD
184unknown:
185 return 1;
186
187error_empty:
80c2a69a 188 printk(KERN_WARNING "LTTng: bytecode: empty stack for '%s' binary operator\n", str);
07dfc1d0
MD
189 return -EINVAL;
190
191error_mismatch:
80c2a69a 192 printk(KERN_WARNING "LTTng: bytecode: type mismatch for '%s' binary operator\n", str);
07dfc1d0 193 return -EINVAL;
3834b99f
MD
194
195error_type:
80c2a69a 196 printk(KERN_WARNING "LTTng: bytecode: unknown type for '%s' binary operator\n", str);
3834b99f
MD
197 return -EINVAL;
198}
199
200/*
201 * Binary bitwise operators use top of stack and top of stack -1.
202 * Return 0 if typing is known to match, 1 if typing is dynamic
203 * (unknown), negative error value on error.
204 */
205static
80c2a69a 206int bin_op_bitwise_check(struct vstack *stack, bytecode_opcode_t opcode,
3834b99f
MD
207 const char *str)
208{
209 if (unlikely(!vstack_ax(stack) || !vstack_bx(stack)))
210 goto error_empty;
211
212 switch (vstack_ax(stack)->type) {
213 default:
214 case REG_DOUBLE:
215 goto error_type;
216
217 case REG_TYPE_UNKNOWN:
218 switch (vstack_bx(stack)->type) {
219 default:
220 case REG_DOUBLE:
221 goto error_type;
222 case REG_TYPE_UNKNOWN:
3834b99f 223 case REG_S64:
1242217a 224 case REG_U64:
3834b99f
MD
225 goto unknown;
226 }
227 break;
228 case REG_S64:
1242217a 229 case REG_U64:
3834b99f
MD
230 switch (vstack_bx(stack)->type) {
231 default:
232 case REG_DOUBLE:
233 goto error_type;
234 case REG_TYPE_UNKNOWN:
235 goto unknown;
236 case REG_S64:
1242217a 237 case REG_U64:
3834b99f
MD
238 break;
239 }
240 break;
241 }
242 return 0;
243
244unknown:
245 return 1;
246
247error_empty:
80c2a69a 248 printk(KERN_WARNING "LTTng: bytecode: empty stack for '%s' binary operator\n", str);
3834b99f
MD
249 return -EINVAL;
250
251error_type:
80c2a69a 252 printk(KERN_WARNING "LTTng: bytecode: unknown type for '%s' binary operator\n", str);
3834b99f
MD
253 return -EINVAL;
254}
255
256static
257int validate_get_symbol(struct bytecode_runtime *bytecode,
258 const struct get_symbol *sym)
259{
260 const char *str, *str_limit;
261 size_t len_limit;
262
263 if (sym->offset >= bytecode->p.bc->bc.len - bytecode->p.bc->bc.reloc_offset)
264 return -EINVAL;
265
266 str = bytecode->p.bc->bc.data + bytecode->p.bc->bc.reloc_offset + sym->offset;
267 str_limit = bytecode->p.bc->bc.data + bytecode->p.bc->bc.len;
268 len_limit = str_limit - str;
269 if (strnlen(str, len_limit) == len_limit)
270 return -EINVAL;
271 return 0;
07dfc1d0
MD
272}
273
274/*
275 * Validate bytecode range overflow within the validation pass.
276 * Called for each instruction encountered.
277 */
278static
279int bytecode_validate_overflow(struct bytecode_runtime *bytecode,
7962cb86 280 char *start_pc, char *pc)
07dfc1d0
MD
281{
282 int ret = 0;
283
80c2a69a
FD
284 switch (*(bytecode_opcode_t *) pc) {
285 case BYTECODE_OP_UNKNOWN:
07dfc1d0
MD
286 default:
287 {
80c2a69a
FD
288 printk(KERN_WARNING "LTTng: bytecode: unknown bytecode op %u\n",
289 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
290 ret = -EINVAL;
291 break;
292 }
293
80c2a69a
FD
294 case BYTECODE_OP_RETURN:
295 case BYTECODE_OP_RETURN_S64:
07dfc1d0
MD
296 {
297 if (unlikely(pc + sizeof(struct return_op)
298 > start_pc + bytecode->len)) {
299 ret = -ERANGE;
300 }
301 break;
302 }
303
304 /* binary */
80c2a69a
FD
305 case BYTECODE_OP_MUL:
306 case BYTECODE_OP_DIV:
307 case BYTECODE_OP_MOD:
308 case BYTECODE_OP_PLUS:
309 case BYTECODE_OP_MINUS:
310 case BYTECODE_OP_EQ_DOUBLE:
311 case BYTECODE_OP_NE_DOUBLE:
312 case BYTECODE_OP_GT_DOUBLE:
313 case BYTECODE_OP_LT_DOUBLE:
314 case BYTECODE_OP_GE_DOUBLE:
315 case BYTECODE_OP_LE_DOUBLE:
07dfc1d0 316 /* Floating point */
80c2a69a
FD
317 case BYTECODE_OP_EQ_DOUBLE_S64:
318 case BYTECODE_OP_NE_DOUBLE_S64:
319 case BYTECODE_OP_GT_DOUBLE_S64:
320 case BYTECODE_OP_LT_DOUBLE_S64:
321 case BYTECODE_OP_GE_DOUBLE_S64:
322 case BYTECODE_OP_LE_DOUBLE_S64:
323 case BYTECODE_OP_EQ_S64_DOUBLE:
324 case BYTECODE_OP_NE_S64_DOUBLE:
325 case BYTECODE_OP_GT_S64_DOUBLE:
326 case BYTECODE_OP_LT_S64_DOUBLE:
327 case BYTECODE_OP_GE_S64_DOUBLE:
328 case BYTECODE_OP_LE_S64_DOUBLE:
329 case BYTECODE_OP_LOAD_FIELD_REF_DOUBLE:
330 case BYTECODE_OP_GET_CONTEXT_REF_DOUBLE:
331 case BYTECODE_OP_LOAD_DOUBLE:
332 case BYTECODE_OP_CAST_DOUBLE_TO_S64:
333 case BYTECODE_OP_UNARY_PLUS_DOUBLE:
334 case BYTECODE_OP_UNARY_MINUS_DOUBLE:
335 case BYTECODE_OP_UNARY_NOT_DOUBLE:
336 {
337 printk(KERN_WARNING "LTTng: bytecode: unsupported bytecode op %u\n",
338 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
339 ret = -EINVAL;
340 break;
341 }
342
80c2a69a
FD
343 case BYTECODE_OP_EQ:
344 case BYTECODE_OP_NE:
345 case BYTECODE_OP_GT:
346 case BYTECODE_OP_LT:
347 case BYTECODE_OP_GE:
348 case BYTECODE_OP_LE:
349 case BYTECODE_OP_EQ_STRING:
350 case BYTECODE_OP_NE_STRING:
351 case BYTECODE_OP_GT_STRING:
352 case BYTECODE_OP_LT_STRING:
353 case BYTECODE_OP_GE_STRING:
354 case BYTECODE_OP_LE_STRING:
355 case BYTECODE_OP_EQ_STAR_GLOB_STRING:
356 case BYTECODE_OP_NE_STAR_GLOB_STRING:
357 case BYTECODE_OP_EQ_S64:
358 case BYTECODE_OP_NE_S64:
359 case BYTECODE_OP_GT_S64:
360 case BYTECODE_OP_LT_S64:
361 case BYTECODE_OP_GE_S64:
362 case BYTECODE_OP_LE_S64:
363 case BYTECODE_OP_BIT_RSHIFT:
364 case BYTECODE_OP_BIT_LSHIFT:
365 case BYTECODE_OP_BIT_AND:
366 case BYTECODE_OP_BIT_OR:
367 case BYTECODE_OP_BIT_XOR:
07dfc1d0
MD
368 {
369 if (unlikely(pc + sizeof(struct binary_op)
370 > start_pc + bytecode->len)) {
371 ret = -ERANGE;
372 }
373 break;
374 }
375
376 /* unary */
80c2a69a
FD
377 case BYTECODE_OP_UNARY_PLUS:
378 case BYTECODE_OP_UNARY_MINUS:
379 case BYTECODE_OP_UNARY_NOT:
380 case BYTECODE_OP_UNARY_PLUS_S64:
381 case BYTECODE_OP_UNARY_MINUS_S64:
382 case BYTECODE_OP_UNARY_NOT_S64:
383 case BYTECODE_OP_UNARY_BIT_NOT:
07dfc1d0
MD
384 {
385 if (unlikely(pc + sizeof(struct unary_op)
386 > start_pc + bytecode->len)) {
387 ret = -ERANGE;
388 }
389 break;
390 }
391
392 /* logical */
80c2a69a
FD
393 case BYTECODE_OP_AND:
394 case BYTECODE_OP_OR:
07dfc1d0
MD
395 {
396 if (unlikely(pc + sizeof(struct logical_op)
397 > start_pc + bytecode->len)) {
398 ret = -ERANGE;
399 }
400 break;
401 }
402
e2a52595 403 /* load field and get context ref */
80c2a69a 404 case BYTECODE_OP_LOAD_FIELD_REF:
80c2a69a 405 case BYTECODE_OP_GET_CONTEXT_REF:
80c2a69a
FD
406 case BYTECODE_OP_LOAD_FIELD_REF_STRING:
407 case BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE:
408 case BYTECODE_OP_LOAD_FIELD_REF_USER_STRING:
409 case BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE:
410 case BYTECODE_OP_LOAD_FIELD_REF_S64:
411 case BYTECODE_OP_GET_CONTEXT_REF_STRING:
412 case BYTECODE_OP_GET_CONTEXT_REF_S64:
07dfc1d0
MD
413 {
414 if (unlikely(pc + sizeof(struct load_op) + sizeof(struct field_ref)
415 > start_pc + bytecode->len)) {
416 ret = -ERANGE;
417 }
418 break;
419 }
420
421 /* load from immediate operand */
80c2a69a
FD
422 case BYTECODE_OP_LOAD_STRING:
423 case BYTECODE_OP_LOAD_STAR_GLOB_STRING:
07dfc1d0
MD
424 {
425 struct load_op *insn = (struct load_op *) pc;
426 uint32_t str_len, maxlen;
427
428 if (unlikely(pc + sizeof(struct load_op)
429 > start_pc + bytecode->len)) {
430 ret = -ERANGE;
431 break;
432 }
433
434 maxlen = start_pc + bytecode->len - pc - sizeof(struct load_op);
435 str_len = strnlen(insn->data, maxlen);
436 if (unlikely(str_len >= maxlen)) {
437 /* Final '\0' not found within range */
438 ret = -ERANGE;
439 }
440 break;
441 }
442
80c2a69a 443 case BYTECODE_OP_LOAD_S64:
07dfc1d0
MD
444 {
445 if (unlikely(pc + sizeof(struct load_op) + sizeof(struct literal_numeric)
446 > start_pc + bytecode->len)) {
447 ret = -ERANGE;
448 }
449 break;
450 }
451
80c2a69a
FD
452 case BYTECODE_OP_CAST_TO_S64:
453 case BYTECODE_OP_CAST_NOP:
07dfc1d0
MD
454 {
455 if (unlikely(pc + sizeof(struct cast_op)
456 > start_pc + bytecode->len)) {
457 ret = -ERANGE;
458 }
459 break;
460 }
461
3834b99f
MD
462 /*
463 * Instructions for recursive traversal through composed types.
464 */
80c2a69a
FD
465 case BYTECODE_OP_GET_CONTEXT_ROOT:
466 case BYTECODE_OP_GET_APP_CONTEXT_ROOT:
467 case BYTECODE_OP_GET_PAYLOAD_ROOT:
468 case BYTECODE_OP_LOAD_FIELD:
469 case BYTECODE_OP_LOAD_FIELD_S8:
470 case BYTECODE_OP_LOAD_FIELD_S16:
471 case BYTECODE_OP_LOAD_FIELD_S32:
472 case BYTECODE_OP_LOAD_FIELD_S64:
473 case BYTECODE_OP_LOAD_FIELD_U8:
474 case BYTECODE_OP_LOAD_FIELD_U16:
475 case BYTECODE_OP_LOAD_FIELD_U32:
476 case BYTECODE_OP_LOAD_FIELD_U64:
477 case BYTECODE_OP_LOAD_FIELD_STRING:
478 case BYTECODE_OP_LOAD_FIELD_SEQUENCE:
479 case BYTECODE_OP_LOAD_FIELD_DOUBLE:
3834b99f
MD
480 if (unlikely(pc + sizeof(struct load_op)
481 > start_pc + bytecode->len)) {
482 ret = -ERANGE;
483 }
484 break;
485
80c2a69a 486 case BYTECODE_OP_GET_SYMBOL:
3834b99f
MD
487 {
488 struct load_op *insn = (struct load_op *) pc;
489 struct get_symbol *sym = (struct get_symbol *) insn->data;
490
491 if (unlikely(pc + sizeof(struct load_op) + sizeof(struct get_symbol)
492 > start_pc + bytecode->len)) {
493 ret = -ERANGE;
3aeca857 494 break;
3834b99f
MD
495 }
496 ret = validate_get_symbol(bytecode, sym);
497 break;
498 }
499
80c2a69a
FD
500 case BYTECODE_OP_GET_SYMBOL_FIELD:
501 printk(KERN_WARNING "LTTng: bytecode: Unexpected get symbol field\n");
3834b99f
MD
502 ret = -EINVAL;
503 break;
504
80c2a69a 505 case BYTECODE_OP_GET_INDEX_U16:
3834b99f
MD
506 if (unlikely(pc + sizeof(struct load_op) + sizeof(struct get_index_u16)
507 > start_pc + bytecode->len)) {
508 ret = -ERANGE;
509 }
510 break;
511
80c2a69a 512 case BYTECODE_OP_GET_INDEX_U64:
3834b99f
MD
513 if (unlikely(pc + sizeof(struct load_op) + sizeof(struct get_index_u64)
514 > start_pc + bytecode->len)) {
515 ret = -ERANGE;
516 }
517 break;
07dfc1d0
MD
518 }
519
520 return ret;
521}
522
523static
524unsigned long delete_all_nodes(struct mp_table *mp_table)
525{
526 struct mp_node *mp_node;
527 struct hlist_node *tmp;
528 unsigned long nr_nodes = 0;
529 int i;
530
531 for (i = 0; i < MERGE_POINT_TABLE_SIZE; i++) {
532 struct hlist_head *head;
533
534 head = &mp_table->mp_head[i];
d216ecae 535 lttng_hlist_for_each_entry_safe(mp_node, tmp, head, node) {
07dfc1d0
MD
536 kfree(mp_node);
537 nr_nodes++;
538 }
539 }
540 return nr_nodes;
541}
542
543/*
544 * Return value:
3834b99f 545 * >=0: success
07dfc1d0
MD
546 * <0: error
547 */
548static
549int validate_instruction_context(struct bytecode_runtime *bytecode,
550 struct vstack *stack,
7962cb86
MD
551 char *start_pc,
552 char *pc)
07dfc1d0
MD
553{
554 int ret = 0;
80c2a69a 555 const bytecode_opcode_t opcode = *(bytecode_opcode_t *) pc;
07dfc1d0 556
02aca193 557 switch (opcode) {
80c2a69a 558 case BYTECODE_OP_UNKNOWN:
07dfc1d0
MD
559 default:
560 {
80c2a69a
FD
561 printk(KERN_WARNING "LTTng: bytecode: unknown bytecode op %u\n",
562 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
563 ret = -EINVAL;
564 goto end;
565 }
566
80c2a69a
FD
567 case BYTECODE_OP_RETURN:
568 case BYTECODE_OP_RETURN_S64:
07dfc1d0
MD
569 {
570 goto end;
571 }
572
573 /* binary */
80c2a69a
FD
574 case BYTECODE_OP_MUL:
575 case BYTECODE_OP_DIV:
576 case BYTECODE_OP_MOD:
577 case BYTECODE_OP_PLUS:
578 case BYTECODE_OP_MINUS:
07dfc1d0 579 /* Floating point */
80c2a69a
FD
580 case BYTECODE_OP_EQ_DOUBLE:
581 case BYTECODE_OP_NE_DOUBLE:
582 case BYTECODE_OP_GT_DOUBLE:
583 case BYTECODE_OP_LT_DOUBLE:
584 case BYTECODE_OP_GE_DOUBLE:
585 case BYTECODE_OP_LE_DOUBLE:
586 case BYTECODE_OP_EQ_DOUBLE_S64:
587 case BYTECODE_OP_NE_DOUBLE_S64:
588 case BYTECODE_OP_GT_DOUBLE_S64:
589 case BYTECODE_OP_LT_DOUBLE_S64:
590 case BYTECODE_OP_GE_DOUBLE_S64:
591 case BYTECODE_OP_LE_DOUBLE_S64:
592 case BYTECODE_OP_EQ_S64_DOUBLE:
593 case BYTECODE_OP_NE_S64_DOUBLE:
594 case BYTECODE_OP_GT_S64_DOUBLE:
595 case BYTECODE_OP_LT_S64_DOUBLE:
596 case BYTECODE_OP_GE_S64_DOUBLE:
597 case BYTECODE_OP_LE_S64_DOUBLE:
598 case BYTECODE_OP_UNARY_PLUS_DOUBLE:
599 case BYTECODE_OP_UNARY_MINUS_DOUBLE:
600 case BYTECODE_OP_UNARY_NOT_DOUBLE:
601 case BYTECODE_OP_LOAD_FIELD_REF_DOUBLE:
602 case BYTECODE_OP_LOAD_DOUBLE:
603 case BYTECODE_OP_CAST_DOUBLE_TO_S64:
604 case BYTECODE_OP_GET_CONTEXT_REF_DOUBLE:
605 {
606 printk(KERN_WARNING "LTTng: bytecode: unsupported bytecode op %u\n",
607 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
608 ret = -EINVAL;
609 goto end;
610 }
611
80c2a69a 612 case BYTECODE_OP_EQ:
07dfc1d0 613 {
02aca193 614 ret = bin_op_compare_check(stack, opcode, "==");
3834b99f 615 if (ret < 0)
07dfc1d0
MD
616 goto end;
617 break;
618 }
80c2a69a 619 case BYTECODE_OP_NE:
07dfc1d0 620 {
02aca193 621 ret = bin_op_compare_check(stack, opcode, "!=");
3834b99f 622 if (ret < 0)
07dfc1d0
MD
623 goto end;
624 break;
625 }
80c2a69a 626 case BYTECODE_OP_GT:
07dfc1d0 627 {
02aca193 628 ret = bin_op_compare_check(stack, opcode, ">");
3834b99f 629 if (ret < 0)
07dfc1d0
MD
630 goto end;
631 break;
632 }
80c2a69a 633 case BYTECODE_OP_LT:
07dfc1d0 634 {
02aca193 635 ret = bin_op_compare_check(stack, opcode, "<");
3834b99f 636 if (ret < 0)
07dfc1d0
MD
637 goto end;
638 break;
639 }
80c2a69a 640 case BYTECODE_OP_GE:
07dfc1d0 641 {
02aca193 642 ret = bin_op_compare_check(stack, opcode, ">=");
3834b99f 643 if (ret < 0)
07dfc1d0
MD
644 goto end;
645 break;
646 }
80c2a69a 647 case BYTECODE_OP_LE:
07dfc1d0 648 {
02aca193 649 ret = bin_op_compare_check(stack, opcode, "<=");
3834b99f 650 if (ret < 0)
07dfc1d0
MD
651 goto end;
652 break;
653 }
654
80c2a69a
FD
655 case BYTECODE_OP_EQ_STRING:
656 case BYTECODE_OP_NE_STRING:
657 case BYTECODE_OP_GT_STRING:
658 case BYTECODE_OP_LT_STRING:
659 case BYTECODE_OP_GE_STRING:
660 case BYTECODE_OP_LE_STRING:
07dfc1d0
MD
661 {
662 if (!vstack_ax(stack) || !vstack_bx(stack)) {
80c2a69a 663 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
664 ret = -EINVAL;
665 goto end;
666 }
667 if (vstack_ax(stack)->type != REG_STRING
668 || vstack_bx(stack)->type != REG_STRING) {
80c2a69a 669 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type for string comparator\n");
07dfc1d0
MD
670 ret = -EINVAL;
671 goto end;
672 }
673 break;
674 }
675
02aca193 676
80c2a69a
FD
677 case BYTECODE_OP_EQ_STAR_GLOB_STRING:
678 case BYTECODE_OP_NE_STAR_GLOB_STRING:
02aca193
PP
679 {
680 if (!vstack_ax(stack) || !vstack_bx(stack)) {
80c2a69a 681 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
02aca193
PP
682 ret = -EINVAL;
683 goto end;
684 }
685 if (vstack_ax(stack)->type != REG_STAR_GLOB_STRING
686 && vstack_bx(stack)->type != REG_STAR_GLOB_STRING) {
80c2a69a 687 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type for globbing pattern comparator\n");
02aca193
PP
688 ret = -EINVAL;
689 goto end;
690 }
691 break;
692 }
693
80c2a69a
FD
694 case BYTECODE_OP_EQ_S64:
695 case BYTECODE_OP_NE_S64:
696 case BYTECODE_OP_GT_S64:
697 case BYTECODE_OP_LT_S64:
698 case BYTECODE_OP_GE_S64:
699 case BYTECODE_OP_LE_S64:
07dfc1d0
MD
700 {
701 if (!vstack_ax(stack) || !vstack_bx(stack)) {
80c2a69a 702 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
703 ret = -EINVAL;
704 goto end;
705 }
1242217a
FD
706 switch (vstack_ax(stack)->type) {
707 case REG_S64:
708 case REG_U64:
709 break;
710 default:
80c2a69a 711 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type for s64 comparator\n");
1242217a
FD
712 ret = -EINVAL;
713 goto end;
714 }
715 switch (vstack_bx(stack)->type) {
716 case REG_S64:
717 case REG_U64:
718 break;
719 default:
80c2a69a 720 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type for s64 comparator\n");
07dfc1d0
MD
721 ret = -EINVAL;
722 goto end;
723 }
724 break;
725 }
726
80c2a69a 727 case BYTECODE_OP_BIT_RSHIFT:
e16c054b
MD
728 ret = bin_op_bitwise_check(stack, opcode, ">>");
729 if (ret < 0)
730 goto end;
731 break;
80c2a69a 732 case BYTECODE_OP_BIT_LSHIFT:
e16c054b
MD
733 ret = bin_op_bitwise_check(stack, opcode, "<<");
734 if (ret < 0)
735 goto end;
736 break;
80c2a69a 737 case BYTECODE_OP_BIT_AND:
3834b99f
MD
738 ret = bin_op_bitwise_check(stack, opcode, "&");
739 if (ret < 0)
740 goto end;
741 break;
80c2a69a 742 case BYTECODE_OP_BIT_OR:
3834b99f
MD
743 ret = bin_op_bitwise_check(stack, opcode, "|");
744 if (ret < 0)
745 goto end;
746 break;
80c2a69a 747 case BYTECODE_OP_BIT_XOR:
3834b99f
MD
748 ret = bin_op_bitwise_check(stack, opcode, "^");
749 if (ret < 0)
750 goto end;
751 break;
752
07dfc1d0 753 /* unary */
80c2a69a
FD
754 case BYTECODE_OP_UNARY_PLUS:
755 case BYTECODE_OP_UNARY_MINUS:
756 case BYTECODE_OP_UNARY_NOT:
07dfc1d0
MD
757 {
758 if (!vstack_ax(stack)) {
80c2a69a 759 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
760 ret = -EINVAL;
761 goto end;
762 }
763 switch (vstack_ax(stack)->type) {
764 default:
765 case REG_DOUBLE:
80c2a69a 766 printk(KERN_WARNING "LTTng: bytecode: unknown register type\n");
07dfc1d0
MD
767 ret = -EINVAL;
768 goto end;
769
770 case REG_STRING:
02aca193 771 case REG_STAR_GLOB_STRING:
80c2a69a 772 printk(KERN_WARNING "LTTng: bytecode: Unary op can only be applied to numeric or floating point registers\n");
07dfc1d0
MD
773 ret = -EINVAL;
774 goto end;
775 case REG_S64:
1242217a 776 case REG_U64:
3834b99f 777 case REG_TYPE_UNKNOWN:
07dfc1d0
MD
778 break;
779 }
780 break;
781 }
80c2a69a 782 case BYTECODE_OP_UNARY_BIT_NOT:
e16c054b
MD
783 {
784 if (!vstack_ax(stack)) {
80c2a69a 785 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
e16c054b
MD
786 ret = -EINVAL;
787 goto end;
788 }
789 switch (vstack_ax(stack)->type) {
790 default:
80c2a69a 791 printk(KERN_WARNING "LTTng: bytecode: unknown register type\n");
e16c054b
MD
792 ret = -EINVAL;
793 goto end;
794
795 case REG_STRING:
796 case REG_STAR_GLOB_STRING:
797 case REG_DOUBLE:
80c2a69a 798 printk(KERN_WARNING "LTTng: bytecode: Unary bitwise op can only be applied to numeric registers\n");
e16c054b
MD
799 ret = -EINVAL;
800 goto end;
801 case REG_S64:
1242217a 802 case REG_U64:
e16c054b
MD
803 case REG_TYPE_UNKNOWN:
804 break;
805 }
806 break;
807 }
07dfc1d0 808
80c2a69a
FD
809 case BYTECODE_OP_UNARY_PLUS_S64:
810 case BYTECODE_OP_UNARY_MINUS_S64:
811 case BYTECODE_OP_UNARY_NOT_S64:
07dfc1d0
MD
812 {
813 if (!vstack_ax(stack)) {
80c2a69a 814 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
815 ret = -EINVAL;
816 goto end;
817 }
1242217a
FD
818 if (vstack_ax(stack)->type != REG_S64 &&
819 vstack_ax(stack)->type != REG_U64) {
80c2a69a 820 printk(KERN_WARNING "LTTng: bytecode: Invalid register type\n");
07dfc1d0
MD
821 ret = -EINVAL;
822 goto end;
823 }
824 break;
825 }
826
827 /* logical */
80c2a69a
FD
828 case BYTECODE_OP_AND:
829 case BYTECODE_OP_OR:
07dfc1d0
MD
830 {
831 struct logical_op *insn = (struct logical_op *) pc;
832
833 if (!vstack_ax(stack)) {
80c2a69a 834 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
835 ret = -EINVAL;
836 goto end;
837 }
1242217a
FD
838 if (vstack_ax(stack)->type != REG_S64 &&
839 vstack_ax(stack)->type != REG_U64) {
80c2a69a 840 printk(KERN_WARNING "LTTng: bytecode: Logical comparator expects S64 register\n");
07dfc1d0
MD
841 ret = -EINVAL;
842 goto end;
843 }
844
845 dbg_printk("Validate jumping to bytecode offset %u\n",
846 (unsigned int) insn->skip_offset);
847 if (unlikely(start_pc + insn->skip_offset <= pc)) {
80c2a69a 848 printk(KERN_WARNING "LTTng: bytecode: Loops are not allowed in bytecode\n");
07dfc1d0
MD
849 ret = -EINVAL;
850 goto end;
851 }
852 break;
853 }
854
855 /* load field ref */
80c2a69a 856 case BYTECODE_OP_LOAD_FIELD_REF:
07dfc1d0 857 {
80c2a69a 858 printk(KERN_WARNING "LTTng: bytecode: Unknown field ref type\n");
07dfc1d0
MD
859 ret = -EINVAL;
860 goto end;
861 }
80c2a69a
FD
862 case BYTECODE_OP_LOAD_FIELD_REF_STRING:
863 case BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE:
864 case BYTECODE_OP_LOAD_FIELD_REF_USER_STRING:
865 case BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE:
07dfc1d0
MD
866 {
867 struct load_op *insn = (struct load_op *) pc;
868 struct field_ref *ref = (struct field_ref *) insn->data;
869
870 dbg_printk("Validate load field ref offset %u type string\n",
871 ref->offset);
872 break;
873 }
80c2a69a 874 case BYTECODE_OP_LOAD_FIELD_REF_S64:
07dfc1d0
MD
875 {
876 struct load_op *insn = (struct load_op *) pc;
877 struct field_ref *ref = (struct field_ref *) insn->data;
878
879 dbg_printk("Validate load field ref offset %u type s64\n",
880 ref->offset);
881 break;
882 }
883
884 /* load from immediate operand */
80c2a69a
FD
885 case BYTECODE_OP_LOAD_STRING:
886 case BYTECODE_OP_LOAD_STAR_GLOB_STRING:
07dfc1d0
MD
887 {
888 break;
889 }
890
80c2a69a 891 case BYTECODE_OP_LOAD_S64:
07dfc1d0
MD
892 {
893 break;
894 }
895
80c2a69a 896 case BYTECODE_OP_CAST_TO_S64:
07dfc1d0
MD
897 {
898 struct cast_op *insn = (struct cast_op *) pc;
899
900 if (!vstack_ax(stack)) {
80c2a69a 901 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
902 ret = -EINVAL;
903 goto end;
904 }
905 switch (vstack_ax(stack)->type) {
906 default:
907 case REG_DOUBLE:
80c2a69a 908 printk(KERN_WARNING "LTTng: bytecode: unknown register type\n");
07dfc1d0
MD
909 ret = -EINVAL;
910 goto end;
911
912 case REG_STRING:
02aca193 913 case REG_STAR_GLOB_STRING:
80c2a69a 914 printk(KERN_WARNING "LTTng: bytecode: Cast op can only be applied to numeric or floating point registers\n");
07dfc1d0
MD
915 ret = -EINVAL;
916 goto end;
917 case REG_S64:
918 break;
919 }
80c2a69a 920 if (insn->op == BYTECODE_OP_CAST_DOUBLE_TO_S64) {
07dfc1d0 921 if (vstack_ax(stack)->type != REG_DOUBLE) {
80c2a69a 922 printk(KERN_WARNING "LTTng: bytecode: Cast expects double\n");
07dfc1d0
MD
923 ret = -EINVAL;
924 goto end;
925 }
926 }
927 break;
928 }
80c2a69a 929 case BYTECODE_OP_CAST_NOP:
07dfc1d0
MD
930 {
931 break;
932 }
933
934 /* get context ref */
80c2a69a 935 case BYTECODE_OP_GET_CONTEXT_REF:
07dfc1d0 936 {
80c2a69a 937 printk(KERN_WARNING "LTTng: bytecode: Unknown get context ref type\n");
07dfc1d0
MD
938 ret = -EINVAL;
939 goto end;
940 }
80c2a69a 941 case BYTECODE_OP_GET_CONTEXT_REF_STRING:
07dfc1d0
MD
942 {
943 struct load_op *insn = (struct load_op *) pc;
944 struct field_ref *ref = (struct field_ref *) insn->data;
945
946 dbg_printk("Validate get context ref offset %u type string\n",
947 ref->offset);
948 break;
949 }
80c2a69a 950 case BYTECODE_OP_GET_CONTEXT_REF_S64:
07dfc1d0
MD
951 {
952 struct load_op *insn = (struct load_op *) pc;
953 struct field_ref *ref = (struct field_ref *) insn->data;
954
955 dbg_printk("Validate get context ref offset %u type s64\n",
956 ref->offset);
957 break;
958 }
959
3834b99f
MD
960 /*
961 * Instructions for recursive traversal through composed types.
962 */
80c2a69a 963 case BYTECODE_OP_GET_CONTEXT_ROOT:
3834b99f
MD
964 {
965 dbg_printk("Validate get context root\n");
966 break;
967 }
80c2a69a 968 case BYTECODE_OP_GET_APP_CONTEXT_ROOT:
3834b99f
MD
969 {
970 dbg_printk("Validate get app context root\n");
971 break;
972 }
80c2a69a 973 case BYTECODE_OP_GET_PAYLOAD_ROOT:
3834b99f
MD
974 {
975 dbg_printk("Validate get payload root\n");
976 break;
977 }
80c2a69a 978 case BYTECODE_OP_LOAD_FIELD:
3834b99f
MD
979 {
980 /*
981 * We tolerate that field type is unknown at validation,
982 * because we are performing the load specialization in
983 * a phase after validation.
984 */
985 dbg_printk("Validate load field\n");
986 break;
987 }
c4bf9003
MD
988
989 /*
990 * Disallow already specialized bytecode op load field instructions to
991 * ensure that the received bytecode does not:
992 *
993 * - Read user-space memory without proper get_user accessors,
994 * - Read a memory area larger than the memory targeted by the instrumentation.
995 */
80c2a69a 996 case BYTECODE_OP_LOAD_FIELD_S8:
80c2a69a 997 case BYTECODE_OP_LOAD_FIELD_S16:
80c2a69a 998 case BYTECODE_OP_LOAD_FIELD_S32:
80c2a69a 999 case BYTECODE_OP_LOAD_FIELD_S64:
80c2a69a 1000 case BYTECODE_OP_LOAD_FIELD_U8:
80c2a69a 1001 case BYTECODE_OP_LOAD_FIELD_U16:
80c2a69a 1002 case BYTECODE_OP_LOAD_FIELD_U32:
80c2a69a 1003 case BYTECODE_OP_LOAD_FIELD_U64:
80c2a69a 1004 case BYTECODE_OP_LOAD_FIELD_STRING:
80c2a69a 1005 case BYTECODE_OP_LOAD_FIELD_SEQUENCE:
80c2a69a 1006 case BYTECODE_OP_LOAD_FIELD_DOUBLE:
3834b99f 1007 {
c4bf9003
MD
1008 dbg_printk("Validate load field, reject specialized load instruction (%d)\n",
1009 (int) opcode);
1010 ret = -EINVAL;
1011 goto end;
3834b99f
MD
1012 }
1013
80c2a69a 1014 case BYTECODE_OP_GET_SYMBOL:
3834b99f
MD
1015 {
1016 struct load_op *insn = (struct load_op *) pc;
1017 struct get_symbol *sym = (struct get_symbol *) insn->data;
1018
1019 dbg_printk("Validate get symbol offset %u\n", sym->offset);
1020 break;
1021 }
1022
80c2a69a 1023 case BYTECODE_OP_GET_SYMBOL_FIELD:
3834b99f
MD
1024 {
1025 struct load_op *insn = (struct load_op *) pc;
1026 struct get_symbol *sym = (struct get_symbol *) insn->data;
1027
1028 dbg_printk("Validate get symbol field offset %u\n", sym->offset);
1029 break;
1030 }
1031
80c2a69a 1032 case BYTECODE_OP_GET_INDEX_U16:
3834b99f
MD
1033 {
1034 struct load_op *insn = (struct load_op *) pc;
1035 struct get_index_u16 *get_index = (struct get_index_u16 *) insn->data;
1036
1037 dbg_printk("Validate get index u16 index %u\n", get_index->index);
1038 break;
1039 }
1040
80c2a69a 1041 case BYTECODE_OP_GET_INDEX_U64:
3834b99f
MD
1042 {
1043 struct load_op *insn = (struct load_op *) pc;
1044 struct get_index_u64 *get_index = (struct get_index_u64 *) insn->data;
1045
1046 dbg_printk("Validate get index u64 index %llu\n",
1047 (unsigned long long) get_index->index);
1048 break;
1049 }
07dfc1d0
MD
1050 }
1051end:
1052 return ret;
1053}
1054
1055/*
1056 * Return value:
1057 * 0: success
1058 * <0: error
1059 */
1060static
1061int validate_instruction_all_contexts(struct bytecode_runtime *bytecode,
1062 struct mp_table *mp_table,
1063 struct vstack *stack,
7962cb86
MD
1064 char *start_pc,
1065 char *pc)
07dfc1d0
MD
1066{
1067 int ret, found = 0;
1068 unsigned long target_pc = pc - start_pc;
1069 unsigned long hash;
1070 struct hlist_head *head;
1071 struct mp_node *mp_node;
1072
1073 /* Validate the context resulting from the previous instruction */
1074 ret = validate_instruction_context(bytecode, stack, start_pc, pc);
3834b99f 1075 if (ret < 0)
07dfc1d0
MD
1076 return ret;
1077
1078 /* Validate merge points */
1079 hash = jhash_1word(target_pc, 0);
1080 head = &mp_table->mp_head[hash & (MERGE_POINT_TABLE_SIZE - 1)];
d216ecae 1081 lttng_hlist_for_each_entry(mp_node, head, node) {
07dfc1d0
MD
1082 if (lttng_hash_match(mp_node, target_pc)) {
1083 found = 1;
1084 break;
1085 }
1086 }
1087 if (found) {
80c2a69a 1088 dbg_printk("Bytecode: validate merge point at offset %lu\n",
07dfc1d0
MD
1089 target_pc);
1090 if (merge_points_compare(stack, &mp_node->stack)) {
80c2a69a 1091 printk(KERN_WARNING "LTTng: bytecode: Merge points differ for offset %lu\n",
07dfc1d0
MD
1092 target_pc);
1093 return -EINVAL;
1094 }
1095 /* Once validated, we can remove the merge point */
80c2a69a 1096 dbg_printk("Bytecode: remove merge point at offset %lu\n",
07dfc1d0
MD
1097 target_pc);
1098 hlist_del(&mp_node->node);
1099 }
1100 return 0;
1101}
1102
e2a52595
MD
1103/*
1104 * Validate load instructions: specialized instructions not accepted as input.
1105 *
1106 * Return value:
1107 * >0: going to next insn.
1108 * 0: success, stop iteration.
1109 * <0: error
1110 */
1111static
1112int validate_load(char **_next_pc,
1113 char *pc)
1114{
1115 int ret = 0;
1116 char *next_pc = *_next_pc;
1117
1118 switch (*(bytecode_opcode_t *) pc) {
1119 case BYTECODE_OP_UNKNOWN:
1120 default:
1121 {
1122 printk(KERN_WARNING "LTTng: bytecode: unknown bytecode op %u\n",
1123 (unsigned int) *(bytecode_opcode_t *) pc);
1124 ret = -EINVAL;
1125 goto end;
1126 }
1127
1128 case BYTECODE_OP_RETURN:
1129 {
1130 next_pc += sizeof(struct return_op);
1131 break;
1132 }
1133
1134 case BYTECODE_OP_RETURN_S64:
1135 {
1136 next_pc += sizeof(struct return_op);
1137 break;
1138 }
1139
1140 /* binary */
1141 case BYTECODE_OP_MUL:
1142 case BYTECODE_OP_DIV:
1143 case BYTECODE_OP_MOD:
1144 case BYTECODE_OP_PLUS:
1145 case BYTECODE_OP_MINUS:
1146 /* Floating point */
1147 case BYTECODE_OP_EQ_DOUBLE:
1148 case BYTECODE_OP_NE_DOUBLE:
1149 case BYTECODE_OP_GT_DOUBLE:
1150 case BYTECODE_OP_LT_DOUBLE:
1151 case BYTECODE_OP_GE_DOUBLE:
1152 case BYTECODE_OP_LE_DOUBLE:
1153 case BYTECODE_OP_EQ_DOUBLE_S64:
1154 case BYTECODE_OP_NE_DOUBLE_S64:
1155 case BYTECODE_OP_GT_DOUBLE_S64:
1156 case BYTECODE_OP_LT_DOUBLE_S64:
1157 case BYTECODE_OP_GE_DOUBLE_S64:
1158 case BYTECODE_OP_LE_DOUBLE_S64:
1159 case BYTECODE_OP_EQ_S64_DOUBLE:
1160 case BYTECODE_OP_NE_S64_DOUBLE:
1161 case BYTECODE_OP_GT_S64_DOUBLE:
1162 case BYTECODE_OP_LT_S64_DOUBLE:
1163 case BYTECODE_OP_GE_S64_DOUBLE:
1164 case BYTECODE_OP_LE_S64_DOUBLE:
1165 case BYTECODE_OP_UNARY_PLUS_DOUBLE:
1166 case BYTECODE_OP_UNARY_MINUS_DOUBLE:
1167 case BYTECODE_OP_UNARY_NOT_DOUBLE:
1168 case BYTECODE_OP_LOAD_FIELD_REF_DOUBLE:
1169 case BYTECODE_OP_GET_CONTEXT_REF_DOUBLE:
1170 case BYTECODE_OP_LOAD_DOUBLE:
1171 case BYTECODE_OP_CAST_DOUBLE_TO_S64:
1172 {
1173 printk(KERN_WARNING "LTTng: bytecode: unsupported bytecode op %u\n",
1174 (unsigned int) *(bytecode_opcode_t *) pc);
1175 ret = -EINVAL;
1176 goto end;
1177 }
1178
1179 case BYTECODE_OP_EQ:
1180 case BYTECODE_OP_NE:
1181 case BYTECODE_OP_GT:
1182 case BYTECODE_OP_LT:
1183 case BYTECODE_OP_GE:
1184 case BYTECODE_OP_LE:
1185 case BYTECODE_OP_EQ_STRING:
1186 case BYTECODE_OP_NE_STRING:
1187 case BYTECODE_OP_GT_STRING:
1188 case BYTECODE_OP_LT_STRING:
1189 case BYTECODE_OP_GE_STRING:
1190 case BYTECODE_OP_LE_STRING:
1191 case BYTECODE_OP_EQ_STAR_GLOB_STRING:
1192 case BYTECODE_OP_NE_STAR_GLOB_STRING:
1193 case BYTECODE_OP_EQ_S64:
1194 case BYTECODE_OP_NE_S64:
1195 case BYTECODE_OP_GT_S64:
1196 case BYTECODE_OP_LT_S64:
1197 case BYTECODE_OP_GE_S64:
1198 case BYTECODE_OP_LE_S64:
1199 case BYTECODE_OP_BIT_RSHIFT:
1200 case BYTECODE_OP_BIT_LSHIFT:
1201 case BYTECODE_OP_BIT_AND:
1202 case BYTECODE_OP_BIT_OR:
1203 case BYTECODE_OP_BIT_XOR:
1204 {
1205 next_pc += sizeof(struct binary_op);
1206 break;
1207 }
1208
1209 /* unary */
1210 case BYTECODE_OP_UNARY_PLUS:
1211 case BYTECODE_OP_UNARY_MINUS:
1212 case BYTECODE_OP_UNARY_PLUS_S64:
1213 case BYTECODE_OP_UNARY_MINUS_S64:
1214 case BYTECODE_OP_UNARY_NOT_S64:
1215 case BYTECODE_OP_UNARY_NOT:
1216 case BYTECODE_OP_UNARY_BIT_NOT:
1217 {
1218 next_pc += sizeof(struct unary_op);
1219 break;
1220 }
1221
1222 /* logical */
1223 case BYTECODE_OP_AND:
1224 case BYTECODE_OP_OR:
1225 {
1226 next_pc += sizeof(struct logical_op);
1227 break;
1228 }
1229
1230 /* load field ref */
1231 case BYTECODE_OP_LOAD_FIELD_REF:
1232 /* get context ref */
1233 case BYTECODE_OP_GET_CONTEXT_REF:
1234 {
1235 next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
1236 break;
1237 }
1238 case BYTECODE_OP_LOAD_FIELD_REF_STRING:
1239 case BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE:
1240 case BYTECODE_OP_GET_CONTEXT_REF_STRING:
1241 case BYTECODE_OP_LOAD_FIELD_REF_USER_STRING:
1242 case BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE:
1243 case BYTECODE_OP_LOAD_FIELD_REF_S64:
1244 case BYTECODE_OP_GET_CONTEXT_REF_S64:
1245 {
1246 /*
1247 * Reject specialized load field ref instructions.
1248 */
1249 ret = -EINVAL;
1250 goto end;
1251 }
1252
1253 /* load from immediate operand */
1254 case BYTECODE_OP_LOAD_STRING:
1255 case BYTECODE_OP_LOAD_STAR_GLOB_STRING:
1256 {
1257 struct load_op *insn = (struct load_op *) pc;
1258
1259 next_pc += sizeof(struct load_op) + strlen(insn->data) + 1;
1260 break;
1261 }
1262
1263 case BYTECODE_OP_LOAD_S64:
1264 {
1265 next_pc += sizeof(struct load_op) + sizeof(struct literal_numeric);
1266 break;
1267 }
1268
1269 case BYTECODE_OP_CAST_TO_S64:
1270 case BYTECODE_OP_CAST_NOP:
1271 {
1272 next_pc += sizeof(struct cast_op);
1273 break;
1274 }
1275
1276 /*
1277 * Instructions for recursive traversal through composed types.
1278 */
1279 case BYTECODE_OP_GET_CONTEXT_ROOT:
1280 case BYTECODE_OP_GET_APP_CONTEXT_ROOT:
1281 case BYTECODE_OP_GET_PAYLOAD_ROOT:
1282 case BYTECODE_OP_LOAD_FIELD:
1283 {
1284 next_pc += sizeof(struct load_op);
1285 break;
1286 }
1287
1288 case BYTECODE_OP_LOAD_FIELD_S8:
1289 case BYTECODE_OP_LOAD_FIELD_S16:
1290 case BYTECODE_OP_LOAD_FIELD_S32:
1291 case BYTECODE_OP_LOAD_FIELD_S64:
1292 case BYTECODE_OP_LOAD_FIELD_U8:
1293 case BYTECODE_OP_LOAD_FIELD_U16:
1294 case BYTECODE_OP_LOAD_FIELD_U32:
1295 case BYTECODE_OP_LOAD_FIELD_U64:
1296 case BYTECODE_OP_LOAD_FIELD_STRING:
1297 case BYTECODE_OP_LOAD_FIELD_SEQUENCE:
1298 case BYTECODE_OP_LOAD_FIELD_DOUBLE:
1299 {
1300 /*
1301 * Reject specialized load field instructions.
1302 */
1303 ret = -EINVAL;
1304 goto end;
1305 }
1306
1307 case BYTECODE_OP_GET_SYMBOL:
1308 case BYTECODE_OP_GET_SYMBOL_FIELD:
1309 {
1310 next_pc += sizeof(struct load_op) + sizeof(struct get_symbol);
1311 break;
1312 }
1313
1314 case BYTECODE_OP_GET_INDEX_U16:
1315 {
1316 next_pc += sizeof(struct load_op) + sizeof(struct get_index_u16);
1317 break;
1318 }
1319
1320 case BYTECODE_OP_GET_INDEX_U64:
1321 {
1322 next_pc += sizeof(struct load_op) + sizeof(struct get_index_u64);
1323 break;
1324 }
1325
1326 }
1327end:
1328 *_next_pc = next_pc;
1329 return ret;
1330}
1331
07dfc1d0
MD
1332/*
1333 * Return value:
1334 * >0: going to next insn.
1335 * 0: success, stop iteration.
1336 * <0: error
1337 */
1338static
1339int exec_insn(struct bytecode_runtime *bytecode,
1340 struct mp_table *mp_table,
1341 struct vstack *stack,
7962cb86
MD
1342 char **_next_pc,
1343 char *pc)
07dfc1d0
MD
1344{
1345 int ret = 1;
7962cb86 1346 char *next_pc = *_next_pc;
07dfc1d0 1347
80c2a69a
FD
1348 switch (*(bytecode_opcode_t *) pc) {
1349 case BYTECODE_OP_UNKNOWN:
07dfc1d0
MD
1350 default:
1351 {
80c2a69a
FD
1352 printk(KERN_WARNING "LTTng: bytecode: unknown bytecode op %u\n",
1353 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
1354 ret = -EINVAL;
1355 goto end;
1356 }
1357
80c2a69a 1358 case BYTECODE_OP_RETURN:
07dfc1d0
MD
1359 {
1360 if (!vstack_ax(stack)) {
80c2a69a 1361 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
1362 ret = -EINVAL;
1363 goto end;
1364 }
3834b99f
MD
1365 switch (vstack_ax(stack)->type) {
1366 case REG_S64:
1242217a 1367 case REG_U64:
fd41f360
FD
1368 case REG_DOUBLE:
1369 case REG_STRING:
1370 case REG_PTR:
3834b99f
MD
1371 case REG_TYPE_UNKNOWN:
1372 break;
1373 default:
80c2a69a 1374 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d at end of bytecode\n",
3834b99f
MD
1375 (int) vstack_ax(stack)->type);
1376 ret = -EINVAL;
1377 goto end;
1378 }
1379
07dfc1d0
MD
1380 ret = 0;
1381 goto end;
1382 }
1383
80c2a69a 1384 case BYTECODE_OP_RETURN_S64:
57ba4b41
MD
1385 {
1386 if (!vstack_ax(stack)) {
80c2a69a 1387 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
57ba4b41
MD
1388 ret = -EINVAL;
1389 goto end;
1390 }
1391 switch (vstack_ax(stack)->type) {
1392 case REG_S64:
1242217a 1393 case REG_U64:
57ba4b41
MD
1394 break;
1395 default:
1396 case REG_TYPE_UNKNOWN:
80c2a69a 1397 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d at end of bytecode\n",
57ba4b41
MD
1398 (int) vstack_ax(stack)->type);
1399 ret = -EINVAL;
1400 goto end;
1401 }
1402
1403 ret = 0;
1404 goto end;
1405 }
1406
07dfc1d0 1407 /* binary */
80c2a69a
FD
1408 case BYTECODE_OP_MUL:
1409 case BYTECODE_OP_DIV:
1410 case BYTECODE_OP_MOD:
1411 case BYTECODE_OP_PLUS:
1412 case BYTECODE_OP_MINUS:
07dfc1d0 1413 /* Floating point */
80c2a69a
FD
1414 case BYTECODE_OP_EQ_DOUBLE:
1415 case BYTECODE_OP_NE_DOUBLE:
1416 case BYTECODE_OP_GT_DOUBLE:
1417 case BYTECODE_OP_LT_DOUBLE:
1418 case BYTECODE_OP_GE_DOUBLE:
1419 case BYTECODE_OP_LE_DOUBLE:
1420 case BYTECODE_OP_EQ_DOUBLE_S64:
1421 case BYTECODE_OP_NE_DOUBLE_S64:
1422 case BYTECODE_OP_GT_DOUBLE_S64:
1423 case BYTECODE_OP_LT_DOUBLE_S64:
1424 case BYTECODE_OP_GE_DOUBLE_S64:
1425 case BYTECODE_OP_LE_DOUBLE_S64:
1426 case BYTECODE_OP_EQ_S64_DOUBLE:
1427 case BYTECODE_OP_NE_S64_DOUBLE:
1428 case BYTECODE_OP_GT_S64_DOUBLE:
1429 case BYTECODE_OP_LT_S64_DOUBLE:
1430 case BYTECODE_OP_GE_S64_DOUBLE:
1431 case BYTECODE_OP_LE_S64_DOUBLE:
1432 case BYTECODE_OP_UNARY_PLUS_DOUBLE:
1433 case BYTECODE_OP_UNARY_MINUS_DOUBLE:
1434 case BYTECODE_OP_UNARY_NOT_DOUBLE:
1435 case BYTECODE_OP_LOAD_FIELD_REF_DOUBLE:
1436 case BYTECODE_OP_GET_CONTEXT_REF_DOUBLE:
1437 case BYTECODE_OP_LOAD_DOUBLE:
1438 case BYTECODE_OP_CAST_DOUBLE_TO_S64:
1439 {
1440 printk(KERN_WARNING "LTTng: bytecode: unsupported bytecode op %u\n",
1441 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
1442 ret = -EINVAL;
1443 goto end;
1444 }
1445
80c2a69a
FD
1446 case BYTECODE_OP_EQ:
1447 case BYTECODE_OP_NE:
1448 case BYTECODE_OP_GT:
1449 case BYTECODE_OP_LT:
1450 case BYTECODE_OP_GE:
1451 case BYTECODE_OP_LE:
1452 case BYTECODE_OP_EQ_STRING:
1453 case BYTECODE_OP_NE_STRING:
1454 case BYTECODE_OP_GT_STRING:
1455 case BYTECODE_OP_LT_STRING:
1456 case BYTECODE_OP_GE_STRING:
1457 case BYTECODE_OP_LE_STRING:
1458 case BYTECODE_OP_EQ_STAR_GLOB_STRING:
1459 case BYTECODE_OP_NE_STAR_GLOB_STRING:
1460 case BYTECODE_OP_EQ_S64:
1461 case BYTECODE_OP_NE_S64:
1462 case BYTECODE_OP_GT_S64:
1463 case BYTECODE_OP_LT_S64:
1464 case BYTECODE_OP_GE_S64:
1465 case BYTECODE_OP_LE_S64:
1242217a
FD
1466 {
1467 /* Pop 2, push 1 */
1468 if (vstack_pop(stack)) {
1469 ret = -EINVAL;
1470 goto end;
1471 }
1472 if (!vstack_ax(stack)) {
1473 printk(KERN_WARNING "Empty stack\n");
1474 ret = -EINVAL;
1475 goto end;
1476 }
1477 switch (vstack_ax(stack)->type) {
1478 case REG_S64:
1479 case REG_U64:
1480 case REG_DOUBLE:
1481 case REG_STRING:
1482 case REG_STAR_GLOB_STRING:
1483 case REG_TYPE_UNKNOWN:
1484 break;
1485 default:
1486 printk(KERN_WARNING "Unexpected register type %d for operation\n",
1487 (int) vstack_ax(stack)->type);
1488 ret = -EINVAL;
1489 goto end;
1490 }
1491
1492 vstack_ax(stack)->type = REG_S64;
1493 next_pc += sizeof(struct binary_op);
1494 break;
1495 }
80c2a69a
FD
1496 case BYTECODE_OP_BIT_RSHIFT:
1497 case BYTECODE_OP_BIT_LSHIFT:
1498 case BYTECODE_OP_BIT_AND:
1499 case BYTECODE_OP_BIT_OR:
1500 case BYTECODE_OP_BIT_XOR:
07dfc1d0
MD
1501 {
1502 /* Pop 2, push 1 */
1503 if (vstack_pop(stack)) {
1504 ret = -EINVAL;
1505 goto end;
1506 }
1507 if (!vstack_ax(stack)) {
80c2a69a 1508 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
1509 ret = -EINVAL;
1510 goto end;
1511 }
3834b99f
MD
1512 switch (vstack_ax(stack)->type) {
1513 case REG_S64:
1242217a 1514 case REG_U64:
3834b99f
MD
1515 case REG_DOUBLE:
1516 case REG_STRING:
1517 case REG_STAR_GLOB_STRING:
1518 case REG_TYPE_UNKNOWN:
1519 break;
1520 default:
80c2a69a 1521 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d for operation\n",
3834b99f
MD
1522 (int) vstack_ax(stack)->type);
1523 ret = -EINVAL;
1524 goto end;
1525 }
1526
1242217a 1527 vstack_ax(stack)->type = REG_U64;
07dfc1d0
MD
1528 next_pc += sizeof(struct binary_op);
1529 break;
1530 }
1531
1532 /* unary */
80c2a69a
FD
1533 case BYTECODE_OP_UNARY_PLUS:
1534 case BYTECODE_OP_UNARY_MINUS:
3834b99f
MD
1535 {
1536 /* Pop 1, push 1 */
1537 if (!vstack_ax(stack)) {
80c2a69a 1538 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1539 ret = -EINVAL;
1540 goto end;
1541 }
1542 switch (vstack_ax(stack)->type) {
1543 case REG_S64:
1242217a 1544 case REG_U64:
3834b99f
MD
1545 case REG_TYPE_UNKNOWN:
1546 break;
1547 default:
80c2a69a 1548 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d for operation\n",
3834b99f
MD
1549 (int) vstack_ax(stack)->type);
1550 ret = -EINVAL;
1551 goto end;
1552 }
1553
1554 vstack_ax(stack)->type = REG_TYPE_UNKNOWN;
1555 next_pc += sizeof(struct unary_op);
1556 break;
1557 }
1558
80c2a69a
FD
1559 case BYTECODE_OP_UNARY_PLUS_S64:
1560 case BYTECODE_OP_UNARY_MINUS_S64:
1561 case BYTECODE_OP_UNARY_NOT_S64:
07dfc1d0
MD
1562 {
1563 /* Pop 1, push 1 */
1564 if (!vstack_ax(stack)) {
80c2a69a 1565 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1566 ret = -EINVAL;
1567 goto end;
1568 }
1569 switch (vstack_ax(stack)->type) {
1570 case REG_S64:
1242217a 1571 case REG_U64:
3834b99f
MD
1572 break;
1573 default:
80c2a69a 1574 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d for operation\n",
3834b99f
MD
1575 (int) vstack_ax(stack)->type);
1576 ret = -EINVAL;
1577 goto end;
1578 }
1579
3834b99f
MD
1580 next_pc += sizeof(struct unary_op);
1581 break;
1582 }
1583
80c2a69a 1584 case BYTECODE_OP_UNARY_NOT:
3834b99f
MD
1585 {
1586 /* Pop 1, push 1 */
1587 if (!vstack_ax(stack)) {
80c2a69a 1588 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1589 ret = -EINVAL;
1590 goto end;
1591 }
1592 switch (vstack_ax(stack)->type) {
1593 case REG_S64:
1242217a 1594 case REG_U64:
3834b99f
MD
1595 case REG_TYPE_UNKNOWN:
1596 break;
1597 default:
80c2a69a 1598 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d for operation\n",
e16c054b
MD
1599 (int) vstack_ax(stack)->type);
1600 ret = -EINVAL;
1601 goto end;
1602 }
1603
e16c054b
MD
1604 next_pc += sizeof(struct unary_op);
1605 break;
1606 }
1607
80c2a69a 1608 case BYTECODE_OP_UNARY_BIT_NOT:
e16c054b
MD
1609 {
1610 /* Pop 1, push 1 */
1611 if (!vstack_ax(stack)) {
80c2a69a 1612 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
e16c054b
MD
1613 ret = -EINVAL;
1614 goto end;
1615 }
1616 switch (vstack_ax(stack)->type) {
1617 case REG_S64:
1242217a 1618 case REG_U64:
e16c054b
MD
1619 case REG_TYPE_UNKNOWN:
1620 break;
1621 case REG_DOUBLE:
1622 default:
80c2a69a 1623 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d for operation\n",
3834b99f 1624 (int) vstack_ax(stack)->type);
07dfc1d0
MD
1625 ret = -EINVAL;
1626 goto end;
1627 }
3834b99f 1628
1242217a 1629 vstack_ax(stack)->type = REG_U64;
07dfc1d0
MD
1630 next_pc += sizeof(struct unary_op);
1631 break;
1632 }
1633
1634 /* logical */
80c2a69a
FD
1635 case BYTECODE_OP_AND:
1636 case BYTECODE_OP_OR:
07dfc1d0
MD
1637 {
1638 struct logical_op *insn = (struct logical_op *) pc;
1639 int merge_ret;
1640
1641 /* Add merge point to table */
1642 merge_ret = merge_point_add_check(mp_table,
1643 insn->skip_offset, stack);
1644 if (merge_ret) {
1645 ret = merge_ret;
1646 goto end;
1647 }
3834b99f
MD
1648
1649 if (!vstack_ax(stack)) {
80c2a69a 1650 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1651 ret = -EINVAL;
1652 goto end;
1653 }
1654 /* There is always a cast-to-s64 operation before a or/and op. */
1655 switch (vstack_ax(stack)->type) {
1656 case REG_S64:
1242217a 1657 case REG_U64:
3834b99f
MD
1658 break;
1659 default:
80c2a69a 1660 printk(KERN_WARNING "LTTng: bytecode: Incorrect register type %d for operation\n",
3834b99f
MD
1661 (int) vstack_ax(stack)->type);
1662 ret = -EINVAL;
1663 goto end;
1664 }
1665
07dfc1d0
MD
1666 /* Continue to next instruction */
1667 /* Pop 1 when jump not taken */
1668 if (vstack_pop(stack)) {
1669 ret = -EINVAL;
1670 goto end;
1671 }
1672 next_pc += sizeof(struct logical_op);
1673 break;
1674 }
1675
1676 /* load field ref */
80c2a69a 1677 case BYTECODE_OP_LOAD_FIELD_REF:
07dfc1d0 1678 {
80c2a69a 1679 printk(KERN_WARNING "LTTng: bytecode: Unknown field ref type\n");
07dfc1d0
MD
1680 ret = -EINVAL;
1681 goto end;
1682 }
1683 /* get context ref */
80c2a69a 1684 case BYTECODE_OP_GET_CONTEXT_REF:
07dfc1d0 1685 {
80c2a69a 1686 printk(KERN_WARNING "LTTng: bytecode: Unknown get context ref type\n");
07dfc1d0
MD
1687 ret = -EINVAL;
1688 goto end;
1689 }
80c2a69a
FD
1690 case BYTECODE_OP_LOAD_FIELD_REF_STRING:
1691 case BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE:
1692 case BYTECODE_OP_GET_CONTEXT_REF_STRING:
1693 case BYTECODE_OP_LOAD_FIELD_REF_USER_STRING:
1694 case BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE:
07dfc1d0
MD
1695 {
1696 if (vstack_push(stack)) {
1697 ret = -EINVAL;
1698 goto end;
1699 }
1700 vstack_ax(stack)->type = REG_STRING;
1701 next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
1702 break;
1703 }
80c2a69a
FD
1704 case BYTECODE_OP_LOAD_FIELD_REF_S64:
1705 case BYTECODE_OP_GET_CONTEXT_REF_S64:
07dfc1d0
MD
1706 {
1707 if (vstack_push(stack)) {
1708 ret = -EINVAL;
1709 goto end;
1710 }
1711 vstack_ax(stack)->type = REG_S64;
1712 next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
1713 break;
1714 }
1715
1716 /* load from immediate operand */
80c2a69a 1717 case BYTECODE_OP_LOAD_STRING:
07dfc1d0
MD
1718 {
1719 struct load_op *insn = (struct load_op *) pc;
1720
1721 if (vstack_push(stack)) {
1722 ret = -EINVAL;
1723 goto end;
1724 }
1725 vstack_ax(stack)->type = REG_STRING;
1726 next_pc += sizeof(struct load_op) + strlen(insn->data) + 1;
02aca193
PP
1727 break;
1728 }
1729
80c2a69a 1730 case BYTECODE_OP_LOAD_STAR_GLOB_STRING:
02aca193
PP
1731 {
1732 struct load_op *insn = (struct load_op *) pc;
1733
1734 if (vstack_push(stack)) {
1735 ret = -EINVAL;
1736 goto end;
1737 }
1738 vstack_ax(stack)->type = REG_STAR_GLOB_STRING;
1739 next_pc += sizeof(struct load_op) + strlen(insn->data) + 1;
07dfc1d0
MD
1740 break;
1741 }
1742
80c2a69a 1743 case BYTECODE_OP_LOAD_S64:
07dfc1d0
MD
1744 {
1745 if (vstack_push(stack)) {
1746 ret = -EINVAL;
1747 goto end;
1748 }
1749 vstack_ax(stack)->type = REG_S64;
1750 next_pc += sizeof(struct load_op)
1751 + sizeof(struct literal_numeric);
1752 break;
1753 }
1754
80c2a69a 1755 case BYTECODE_OP_CAST_TO_S64:
07dfc1d0
MD
1756 {
1757 /* Pop 1, push 1 */
1758 if (!vstack_ax(stack)) {
80c2a69a 1759 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
1760 ret = -EINVAL;
1761 goto end;
1762 }
3834b99f
MD
1763 switch (vstack_ax(stack)->type) {
1764 case REG_S64:
1242217a 1765 case REG_U64:
3834b99f
MD
1766 case REG_DOUBLE:
1767 case REG_TYPE_UNKNOWN:
1768 break;
1769 default:
80c2a69a 1770 printk(KERN_WARNING "LTTng: bytecode: Incorrect register type %d for cast\n",
3834b99f
MD
1771 (int) vstack_ax(stack)->type);
1772 ret = -EINVAL;
1773 goto end;
1774 }
07dfc1d0
MD
1775 vstack_ax(stack)->type = REG_S64;
1776 next_pc += sizeof(struct cast_op);
1777 break;
1778 }
80c2a69a 1779 case BYTECODE_OP_CAST_NOP:
07dfc1d0
MD
1780 {
1781 next_pc += sizeof(struct cast_op);
1782 break;
1783 }
1784
3834b99f
MD
1785 /*
1786 * Instructions for recursive traversal through composed types.
1787 */
80c2a69a
FD
1788 case BYTECODE_OP_GET_CONTEXT_ROOT:
1789 case BYTECODE_OP_GET_APP_CONTEXT_ROOT:
1790 case BYTECODE_OP_GET_PAYLOAD_ROOT:
3834b99f
MD
1791 {
1792 if (vstack_push(stack)) {
1793 ret = -EINVAL;
1794 goto end;
1795 }
1796 vstack_ax(stack)->type = REG_PTR;
1797 next_pc += sizeof(struct load_op);
1798 break;
1799 }
1800
80c2a69a 1801 case BYTECODE_OP_LOAD_FIELD:
3834b99f
MD
1802 {
1803 /* Pop 1, push 1 */
1804 if (!vstack_ax(stack)) {
80c2a69a 1805 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1806 ret = -EINVAL;
1807 goto end;
1808 }
1809 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1810 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1811 ret = -EINVAL;
1812 goto end;
1813 }
1814 vstack_ax(stack)->type = REG_TYPE_UNKNOWN;
1815 next_pc += sizeof(struct load_op);
1816 break;
1817 }
1818
80c2a69a
FD
1819 case BYTECODE_OP_LOAD_FIELD_S8:
1820 case BYTECODE_OP_LOAD_FIELD_S16:
1821 case BYTECODE_OP_LOAD_FIELD_S32:
1822 case BYTECODE_OP_LOAD_FIELD_S64:
1242217a
FD
1823 {
1824 /* Pop 1, push 1 */
1825 if (!vstack_ax(stack)) {
1826 printk(KERN_WARNING "Empty stack\n\n");
1827 ret = -EINVAL;
1828 goto end;
1829 }
1830 if (vstack_ax(stack)->type != REG_PTR) {
1831 printk(KERN_WARNING "Expecting pointer on top of stack\n\n");
1832 ret = -EINVAL;
1833 goto end;
1834 }
1835 vstack_ax(stack)->type = REG_S64;
1836 next_pc += sizeof(struct load_op);
1837 break;
1838 }
80c2a69a
FD
1839 case BYTECODE_OP_LOAD_FIELD_U8:
1840 case BYTECODE_OP_LOAD_FIELD_U16:
1841 case BYTECODE_OP_LOAD_FIELD_U32:
1842 case BYTECODE_OP_LOAD_FIELD_U64:
3834b99f
MD
1843 {
1844 /* Pop 1, push 1 */
1845 if (!vstack_ax(stack)) {
80c2a69a 1846 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1847 ret = -EINVAL;
1848 goto end;
1849 }
1850 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1851 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1852 ret = -EINVAL;
1853 goto end;
1854 }
1242217a 1855 vstack_ax(stack)->type = REG_U64;
3834b99f
MD
1856 next_pc += sizeof(struct load_op);
1857 break;
1858 }
80c2a69a
FD
1859 case BYTECODE_OP_LOAD_FIELD_STRING:
1860 case BYTECODE_OP_LOAD_FIELD_SEQUENCE:
3834b99f
MD
1861 {
1862 /* Pop 1, push 1 */
1863 if (!vstack_ax(stack)) {
80c2a69a 1864 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1865 ret = -EINVAL;
1866 goto end;
1867 }
1868 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1869 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1870 ret = -EINVAL;
1871 goto end;
1872 }
1873 vstack_ax(stack)->type = REG_STRING;
1874 next_pc += sizeof(struct load_op);
1875 break;
1876 }
1877
80c2a69a 1878 case BYTECODE_OP_LOAD_FIELD_DOUBLE:
3834b99f
MD
1879 {
1880 /* Pop 1, push 1 */
1881 if (!vstack_ax(stack)) {
80c2a69a 1882 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1883 ret = -EINVAL;
1884 goto end;
1885 }
1886 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1887 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1888 ret = -EINVAL;
1889 goto end;
1890 }
1891 vstack_ax(stack)->type = REG_DOUBLE;
1892 next_pc += sizeof(struct load_op);
1893 break;
1894 }
1895
80c2a69a
FD
1896 case BYTECODE_OP_GET_SYMBOL:
1897 case BYTECODE_OP_GET_SYMBOL_FIELD:
3834b99f
MD
1898 {
1899 /* Pop 1, push 1 */
1900 if (!vstack_ax(stack)) {
80c2a69a 1901 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1902 ret = -EINVAL;
1903 goto end;
1904 }
1905 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1906 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1907 ret = -EINVAL;
1908 goto end;
1909 }
1910 next_pc += sizeof(struct load_op) + sizeof(struct get_symbol);
1911 break;
1912 }
1913
80c2a69a 1914 case BYTECODE_OP_GET_INDEX_U16:
3834b99f
MD
1915 {
1916 /* Pop 1, push 1 */
1917 if (!vstack_ax(stack)) {
80c2a69a 1918 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1919 ret = -EINVAL;
1920 goto end;
1921 }
1922 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1923 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1924 ret = -EINVAL;
1925 goto end;
1926 }
1927 next_pc += sizeof(struct load_op) + sizeof(struct get_index_u16);
1928 break;
1929 }
1930
80c2a69a 1931 case BYTECODE_OP_GET_INDEX_U64:
3834b99f
MD
1932 {
1933 /* Pop 1, push 1 */
1934 if (!vstack_ax(stack)) {
80c2a69a 1935 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1936 ret = -EINVAL;
1937 goto end;
1938 }
1939 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1940 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1941 ret = -EINVAL;
1942 goto end;
1943 }
1944 next_pc += sizeof(struct load_op) + sizeof(struct get_index_u64);
1945 break;
1946 }
1947
07dfc1d0
MD
1948 }
1949end:
1950 *_next_pc = next_pc;
1951 return ret;
1952}
1953
e2a52595
MD
1954int lttng_bytecode_validate_load(struct bytecode_runtime *bytecode)
1955{
1956 char *pc, *next_pc, *start_pc;
1957 int ret = -EINVAL;
1958
1959 start_pc = &bytecode->code[0];
1960 for (pc = next_pc = start_pc; pc - start_pc < bytecode->len;
1961 pc = next_pc) {
1962 ret = bytecode_validate_overflow(bytecode, start_pc, pc);
1963 if (ret != 0) {
1964 if (ret == -ERANGE)
1965 printk(KERN_WARNING "LTTng: bytecode: bytecode overflow\n");
1966 goto end;
1967 }
1968 dbg_printk("Validating loads: op %s (%u)\n",
1969 lttng_bytecode_print_op((unsigned int) *(bytecode_opcode_t *) pc),
1970 (unsigned int) *(bytecode_opcode_t *) pc);
1971
1972 ret = validate_load(&next_pc, pc);
1973 if (ret)
1974 goto end;
1975 }
1976end:
1977 return ret;
1978}
1979
07dfc1d0
MD
1980/*
1981 * Never called concurrently (hash seed is shared).
1982 */
80c2a69a 1983int lttng_bytecode_validate(struct bytecode_runtime *bytecode)
07dfc1d0
MD
1984{
1985 struct mp_table *mp_table;
7962cb86 1986 char *pc, *next_pc, *start_pc;
07dfc1d0
MD
1987 int ret = -EINVAL;
1988 struct vstack stack;
1989
1990 vstack_init(&stack);
1991
1992 mp_table = kzalloc(sizeof(*mp_table), GFP_KERNEL);
1993 if (!mp_table) {
80c2a69a 1994 printk(KERN_WARNING "LTTng: bytecode: Error allocating hash table for bytecode validation\n");
07dfc1d0
MD
1995 return -ENOMEM;
1996 }
3834b99f 1997 start_pc = &bytecode->code[0];
07dfc1d0
MD
1998 for (pc = next_pc = start_pc; pc - start_pc < bytecode->len;
1999 pc = next_pc) {
2000 ret = bytecode_validate_overflow(bytecode, start_pc, pc);
2001 if (ret != 0) {
2002 if (ret == -ERANGE)
80c2a69a 2003 printk(KERN_WARNING "LTTng: bytecode: bytecode overflow\n");
07dfc1d0
MD
2004 goto end;
2005 }
2006 dbg_printk("Validating op %s (%u)\n",
80c2a69a
FD
2007 lttng_bytecode_print_op((unsigned int) *(bytecode_opcode_t *) pc),
2008 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
2009
2010 /*
2011 * For each instruction, validate the current context
2012 * (traversal of entire execution flow), and validate
3834b99f 2013 * all merge points targeting this instruction.
07dfc1d0
MD
2014 */
2015 ret = validate_instruction_all_contexts(bytecode, mp_table,
2016 &stack, start_pc, pc);
2017 if (ret)
2018 goto end;
2019 ret = exec_insn(bytecode, mp_table, &stack, &next_pc, pc);
2020 if (ret <= 0)
2021 goto end;
2022 }
2023end:
2024 if (delete_all_nodes(mp_table)) {
2025 if (!ret) {
80c2a69a 2026 printk(KERN_WARNING "LTTng: bytecode: Unexpected merge points\n");
07dfc1d0
MD
2027 ret = -EINVAL;
2028 }
2029 }
2030 kfree(mp_table);
2031 return ret;
2032}
This page took 0.147337 seconds and 4 git commands to generate.