fix: block: don't call blk_status_to_errno in blk_update_request (v5.16)
[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
403 /* load field ref */
80c2a69a 404 case BYTECODE_OP_LOAD_FIELD_REF:
07dfc1d0 405 {
80c2a69a 406 printk(KERN_WARNING "LTTng: bytecode: Unknown field ref type\n");
07dfc1d0
MD
407 ret = -EINVAL;
408 break;
409 }
3834b99f 410
07dfc1d0 411 /* get context ref */
80c2a69a 412 case BYTECODE_OP_GET_CONTEXT_REF:
07dfc1d0 413 {
80c2a69a 414 printk(KERN_WARNING "LTTng: bytecode: Unknown field ref type\n");
07dfc1d0
MD
415 ret = -EINVAL;
416 break;
417 }
80c2a69a
FD
418 case BYTECODE_OP_LOAD_FIELD_REF_STRING:
419 case BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE:
420 case BYTECODE_OP_LOAD_FIELD_REF_USER_STRING:
421 case BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE:
422 case BYTECODE_OP_LOAD_FIELD_REF_S64:
423 case BYTECODE_OP_GET_CONTEXT_REF_STRING:
424 case BYTECODE_OP_GET_CONTEXT_REF_S64:
07dfc1d0
MD
425 {
426 if (unlikely(pc + sizeof(struct load_op) + sizeof(struct field_ref)
427 > start_pc + bytecode->len)) {
428 ret = -ERANGE;
429 }
430 break;
431 }
432
433 /* load from immediate operand */
80c2a69a
FD
434 case BYTECODE_OP_LOAD_STRING:
435 case BYTECODE_OP_LOAD_STAR_GLOB_STRING:
07dfc1d0
MD
436 {
437 struct load_op *insn = (struct load_op *) pc;
438 uint32_t str_len, maxlen;
439
440 if (unlikely(pc + sizeof(struct load_op)
441 > start_pc + bytecode->len)) {
442 ret = -ERANGE;
443 break;
444 }
445
446 maxlen = start_pc + bytecode->len - pc - sizeof(struct load_op);
447 str_len = strnlen(insn->data, maxlen);
448 if (unlikely(str_len >= maxlen)) {
449 /* Final '\0' not found within range */
450 ret = -ERANGE;
451 }
452 break;
453 }
454
80c2a69a 455 case BYTECODE_OP_LOAD_S64:
07dfc1d0
MD
456 {
457 if (unlikely(pc + sizeof(struct load_op) + sizeof(struct literal_numeric)
458 > start_pc + bytecode->len)) {
459 ret = -ERANGE;
460 }
461 break;
462 }
463
80c2a69a
FD
464 case BYTECODE_OP_CAST_TO_S64:
465 case BYTECODE_OP_CAST_NOP:
07dfc1d0
MD
466 {
467 if (unlikely(pc + sizeof(struct cast_op)
468 > start_pc + bytecode->len)) {
469 ret = -ERANGE;
470 }
471 break;
472 }
473
3834b99f
MD
474 /*
475 * Instructions for recursive traversal through composed types.
476 */
80c2a69a
FD
477 case BYTECODE_OP_GET_CONTEXT_ROOT:
478 case BYTECODE_OP_GET_APP_CONTEXT_ROOT:
479 case BYTECODE_OP_GET_PAYLOAD_ROOT:
480 case BYTECODE_OP_LOAD_FIELD:
481 case BYTECODE_OP_LOAD_FIELD_S8:
482 case BYTECODE_OP_LOAD_FIELD_S16:
483 case BYTECODE_OP_LOAD_FIELD_S32:
484 case BYTECODE_OP_LOAD_FIELD_S64:
485 case BYTECODE_OP_LOAD_FIELD_U8:
486 case BYTECODE_OP_LOAD_FIELD_U16:
487 case BYTECODE_OP_LOAD_FIELD_U32:
488 case BYTECODE_OP_LOAD_FIELD_U64:
489 case BYTECODE_OP_LOAD_FIELD_STRING:
490 case BYTECODE_OP_LOAD_FIELD_SEQUENCE:
491 case BYTECODE_OP_LOAD_FIELD_DOUBLE:
3834b99f
MD
492 if (unlikely(pc + sizeof(struct load_op)
493 > start_pc + bytecode->len)) {
494 ret = -ERANGE;
495 }
496 break;
497
80c2a69a 498 case BYTECODE_OP_GET_SYMBOL:
3834b99f
MD
499 {
500 struct load_op *insn = (struct load_op *) pc;
501 struct get_symbol *sym = (struct get_symbol *) insn->data;
502
503 if (unlikely(pc + sizeof(struct load_op) + sizeof(struct get_symbol)
504 > start_pc + bytecode->len)) {
505 ret = -ERANGE;
3aeca857 506 break;
3834b99f
MD
507 }
508 ret = validate_get_symbol(bytecode, sym);
509 break;
510 }
511
80c2a69a
FD
512 case BYTECODE_OP_GET_SYMBOL_FIELD:
513 printk(KERN_WARNING "LTTng: bytecode: Unexpected get symbol field\n");
3834b99f
MD
514 ret = -EINVAL;
515 break;
516
80c2a69a 517 case BYTECODE_OP_GET_INDEX_U16:
3834b99f
MD
518 if (unlikely(pc + sizeof(struct load_op) + sizeof(struct get_index_u16)
519 > start_pc + bytecode->len)) {
520 ret = -ERANGE;
521 }
522 break;
523
80c2a69a 524 case BYTECODE_OP_GET_INDEX_U64:
3834b99f
MD
525 if (unlikely(pc + sizeof(struct load_op) + sizeof(struct get_index_u64)
526 > start_pc + bytecode->len)) {
527 ret = -ERANGE;
528 }
529 break;
07dfc1d0
MD
530 }
531
532 return ret;
533}
534
535static
536unsigned long delete_all_nodes(struct mp_table *mp_table)
537{
538 struct mp_node *mp_node;
539 struct hlist_node *tmp;
540 unsigned long nr_nodes = 0;
541 int i;
542
543 for (i = 0; i < MERGE_POINT_TABLE_SIZE; i++) {
544 struct hlist_head *head;
545
546 head = &mp_table->mp_head[i];
d216ecae 547 lttng_hlist_for_each_entry_safe(mp_node, tmp, head, node) {
07dfc1d0
MD
548 kfree(mp_node);
549 nr_nodes++;
550 }
551 }
552 return nr_nodes;
553}
554
555/*
556 * Return value:
3834b99f 557 * >=0: success
07dfc1d0
MD
558 * <0: error
559 */
560static
561int validate_instruction_context(struct bytecode_runtime *bytecode,
562 struct vstack *stack,
7962cb86
MD
563 char *start_pc,
564 char *pc)
07dfc1d0
MD
565{
566 int ret = 0;
80c2a69a 567 const bytecode_opcode_t opcode = *(bytecode_opcode_t *) pc;
07dfc1d0 568
02aca193 569 switch (opcode) {
80c2a69a 570 case BYTECODE_OP_UNKNOWN:
07dfc1d0
MD
571 default:
572 {
80c2a69a
FD
573 printk(KERN_WARNING "LTTng: bytecode: unknown bytecode op %u\n",
574 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
575 ret = -EINVAL;
576 goto end;
577 }
578
80c2a69a
FD
579 case BYTECODE_OP_RETURN:
580 case BYTECODE_OP_RETURN_S64:
07dfc1d0
MD
581 {
582 goto end;
583 }
584
585 /* binary */
80c2a69a
FD
586 case BYTECODE_OP_MUL:
587 case BYTECODE_OP_DIV:
588 case BYTECODE_OP_MOD:
589 case BYTECODE_OP_PLUS:
590 case BYTECODE_OP_MINUS:
07dfc1d0 591 /* Floating point */
80c2a69a
FD
592 case BYTECODE_OP_EQ_DOUBLE:
593 case BYTECODE_OP_NE_DOUBLE:
594 case BYTECODE_OP_GT_DOUBLE:
595 case BYTECODE_OP_LT_DOUBLE:
596 case BYTECODE_OP_GE_DOUBLE:
597 case BYTECODE_OP_LE_DOUBLE:
598 case BYTECODE_OP_EQ_DOUBLE_S64:
599 case BYTECODE_OP_NE_DOUBLE_S64:
600 case BYTECODE_OP_GT_DOUBLE_S64:
601 case BYTECODE_OP_LT_DOUBLE_S64:
602 case BYTECODE_OP_GE_DOUBLE_S64:
603 case BYTECODE_OP_LE_DOUBLE_S64:
604 case BYTECODE_OP_EQ_S64_DOUBLE:
605 case BYTECODE_OP_NE_S64_DOUBLE:
606 case BYTECODE_OP_GT_S64_DOUBLE:
607 case BYTECODE_OP_LT_S64_DOUBLE:
608 case BYTECODE_OP_GE_S64_DOUBLE:
609 case BYTECODE_OP_LE_S64_DOUBLE:
610 case BYTECODE_OP_UNARY_PLUS_DOUBLE:
611 case BYTECODE_OP_UNARY_MINUS_DOUBLE:
612 case BYTECODE_OP_UNARY_NOT_DOUBLE:
613 case BYTECODE_OP_LOAD_FIELD_REF_DOUBLE:
614 case BYTECODE_OP_LOAD_DOUBLE:
615 case BYTECODE_OP_CAST_DOUBLE_TO_S64:
616 case BYTECODE_OP_GET_CONTEXT_REF_DOUBLE:
617 {
618 printk(KERN_WARNING "LTTng: bytecode: unsupported bytecode op %u\n",
619 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
620 ret = -EINVAL;
621 goto end;
622 }
623
80c2a69a 624 case BYTECODE_OP_EQ:
07dfc1d0 625 {
02aca193 626 ret = bin_op_compare_check(stack, opcode, "==");
3834b99f 627 if (ret < 0)
07dfc1d0
MD
628 goto end;
629 break;
630 }
80c2a69a 631 case BYTECODE_OP_NE:
07dfc1d0 632 {
02aca193 633 ret = bin_op_compare_check(stack, opcode, "!=");
3834b99f 634 if (ret < 0)
07dfc1d0
MD
635 goto end;
636 break;
637 }
80c2a69a 638 case BYTECODE_OP_GT:
07dfc1d0 639 {
02aca193 640 ret = bin_op_compare_check(stack, opcode, ">");
3834b99f 641 if (ret < 0)
07dfc1d0
MD
642 goto end;
643 break;
644 }
80c2a69a 645 case BYTECODE_OP_LT:
07dfc1d0 646 {
02aca193 647 ret = bin_op_compare_check(stack, opcode, "<");
3834b99f 648 if (ret < 0)
07dfc1d0
MD
649 goto end;
650 break;
651 }
80c2a69a 652 case BYTECODE_OP_GE:
07dfc1d0 653 {
02aca193 654 ret = bin_op_compare_check(stack, opcode, ">=");
3834b99f 655 if (ret < 0)
07dfc1d0
MD
656 goto end;
657 break;
658 }
80c2a69a 659 case BYTECODE_OP_LE:
07dfc1d0 660 {
02aca193 661 ret = bin_op_compare_check(stack, opcode, "<=");
3834b99f 662 if (ret < 0)
07dfc1d0
MD
663 goto end;
664 break;
665 }
666
80c2a69a
FD
667 case BYTECODE_OP_EQ_STRING:
668 case BYTECODE_OP_NE_STRING:
669 case BYTECODE_OP_GT_STRING:
670 case BYTECODE_OP_LT_STRING:
671 case BYTECODE_OP_GE_STRING:
672 case BYTECODE_OP_LE_STRING:
07dfc1d0
MD
673 {
674 if (!vstack_ax(stack) || !vstack_bx(stack)) {
80c2a69a 675 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
676 ret = -EINVAL;
677 goto end;
678 }
679 if (vstack_ax(stack)->type != REG_STRING
680 || vstack_bx(stack)->type != REG_STRING) {
80c2a69a 681 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type for string comparator\n");
07dfc1d0
MD
682 ret = -EINVAL;
683 goto end;
684 }
685 break;
686 }
687
02aca193 688
80c2a69a
FD
689 case BYTECODE_OP_EQ_STAR_GLOB_STRING:
690 case BYTECODE_OP_NE_STAR_GLOB_STRING:
02aca193
PP
691 {
692 if (!vstack_ax(stack) || !vstack_bx(stack)) {
80c2a69a 693 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
02aca193
PP
694 ret = -EINVAL;
695 goto end;
696 }
697 if (vstack_ax(stack)->type != REG_STAR_GLOB_STRING
698 && vstack_bx(stack)->type != REG_STAR_GLOB_STRING) {
80c2a69a 699 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type for globbing pattern comparator\n");
02aca193
PP
700 ret = -EINVAL;
701 goto end;
702 }
703 break;
704 }
705
80c2a69a
FD
706 case BYTECODE_OP_EQ_S64:
707 case BYTECODE_OP_NE_S64:
708 case BYTECODE_OP_GT_S64:
709 case BYTECODE_OP_LT_S64:
710 case BYTECODE_OP_GE_S64:
711 case BYTECODE_OP_LE_S64:
07dfc1d0
MD
712 {
713 if (!vstack_ax(stack) || !vstack_bx(stack)) {
80c2a69a 714 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
715 ret = -EINVAL;
716 goto end;
717 }
1242217a
FD
718 switch (vstack_ax(stack)->type) {
719 case REG_S64:
720 case REG_U64:
721 break;
722 default:
80c2a69a 723 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type for s64 comparator\n");
1242217a
FD
724 ret = -EINVAL;
725 goto end;
726 }
727 switch (vstack_bx(stack)->type) {
728 case REG_S64:
729 case REG_U64:
730 break;
731 default:
80c2a69a 732 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type for s64 comparator\n");
07dfc1d0
MD
733 ret = -EINVAL;
734 goto end;
735 }
736 break;
737 }
738
80c2a69a 739 case BYTECODE_OP_BIT_RSHIFT:
e16c054b
MD
740 ret = bin_op_bitwise_check(stack, opcode, ">>");
741 if (ret < 0)
742 goto end;
743 break;
80c2a69a 744 case BYTECODE_OP_BIT_LSHIFT:
e16c054b
MD
745 ret = bin_op_bitwise_check(stack, opcode, "<<");
746 if (ret < 0)
747 goto end;
748 break;
80c2a69a 749 case BYTECODE_OP_BIT_AND:
3834b99f
MD
750 ret = bin_op_bitwise_check(stack, opcode, "&");
751 if (ret < 0)
752 goto end;
753 break;
80c2a69a 754 case BYTECODE_OP_BIT_OR:
3834b99f
MD
755 ret = bin_op_bitwise_check(stack, opcode, "|");
756 if (ret < 0)
757 goto end;
758 break;
80c2a69a 759 case BYTECODE_OP_BIT_XOR:
3834b99f
MD
760 ret = bin_op_bitwise_check(stack, opcode, "^");
761 if (ret < 0)
762 goto end;
763 break;
764
07dfc1d0 765 /* unary */
80c2a69a
FD
766 case BYTECODE_OP_UNARY_PLUS:
767 case BYTECODE_OP_UNARY_MINUS:
768 case BYTECODE_OP_UNARY_NOT:
07dfc1d0
MD
769 {
770 if (!vstack_ax(stack)) {
80c2a69a 771 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
772 ret = -EINVAL;
773 goto end;
774 }
775 switch (vstack_ax(stack)->type) {
776 default:
777 case REG_DOUBLE:
80c2a69a 778 printk(KERN_WARNING "LTTng: bytecode: unknown register type\n");
07dfc1d0
MD
779 ret = -EINVAL;
780 goto end;
781
782 case REG_STRING:
02aca193 783 case REG_STAR_GLOB_STRING:
80c2a69a 784 printk(KERN_WARNING "LTTng: bytecode: Unary op can only be applied to numeric or floating point registers\n");
07dfc1d0
MD
785 ret = -EINVAL;
786 goto end;
787 case REG_S64:
1242217a 788 case REG_U64:
3834b99f 789 case REG_TYPE_UNKNOWN:
07dfc1d0
MD
790 break;
791 }
792 break;
793 }
80c2a69a 794 case BYTECODE_OP_UNARY_BIT_NOT:
e16c054b
MD
795 {
796 if (!vstack_ax(stack)) {
80c2a69a 797 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
e16c054b
MD
798 ret = -EINVAL;
799 goto end;
800 }
801 switch (vstack_ax(stack)->type) {
802 default:
80c2a69a 803 printk(KERN_WARNING "LTTng: bytecode: unknown register type\n");
e16c054b
MD
804 ret = -EINVAL;
805 goto end;
806
807 case REG_STRING:
808 case REG_STAR_GLOB_STRING:
809 case REG_DOUBLE:
80c2a69a 810 printk(KERN_WARNING "LTTng: bytecode: Unary bitwise op can only be applied to numeric registers\n");
e16c054b
MD
811 ret = -EINVAL;
812 goto end;
813 case REG_S64:
1242217a 814 case REG_U64:
e16c054b
MD
815 case REG_TYPE_UNKNOWN:
816 break;
817 }
818 break;
819 }
07dfc1d0 820
80c2a69a
FD
821 case BYTECODE_OP_UNARY_PLUS_S64:
822 case BYTECODE_OP_UNARY_MINUS_S64:
823 case BYTECODE_OP_UNARY_NOT_S64:
07dfc1d0
MD
824 {
825 if (!vstack_ax(stack)) {
80c2a69a 826 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
827 ret = -EINVAL;
828 goto end;
829 }
1242217a
FD
830 if (vstack_ax(stack)->type != REG_S64 &&
831 vstack_ax(stack)->type != REG_U64) {
80c2a69a 832 printk(KERN_WARNING "LTTng: bytecode: Invalid register type\n");
07dfc1d0
MD
833 ret = -EINVAL;
834 goto end;
835 }
836 break;
837 }
838
839 /* logical */
80c2a69a
FD
840 case BYTECODE_OP_AND:
841 case BYTECODE_OP_OR:
07dfc1d0
MD
842 {
843 struct logical_op *insn = (struct logical_op *) pc;
844
845 if (!vstack_ax(stack)) {
80c2a69a 846 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
847 ret = -EINVAL;
848 goto end;
849 }
1242217a
FD
850 if (vstack_ax(stack)->type != REG_S64 &&
851 vstack_ax(stack)->type != REG_U64) {
80c2a69a 852 printk(KERN_WARNING "LTTng: bytecode: Logical comparator expects S64 register\n");
07dfc1d0
MD
853 ret = -EINVAL;
854 goto end;
855 }
856
857 dbg_printk("Validate jumping to bytecode offset %u\n",
858 (unsigned int) insn->skip_offset);
859 if (unlikely(start_pc + insn->skip_offset <= pc)) {
80c2a69a 860 printk(KERN_WARNING "LTTng: bytecode: Loops are not allowed in bytecode\n");
07dfc1d0
MD
861 ret = -EINVAL;
862 goto end;
863 }
864 break;
865 }
866
867 /* load field ref */
80c2a69a 868 case BYTECODE_OP_LOAD_FIELD_REF:
07dfc1d0 869 {
80c2a69a 870 printk(KERN_WARNING "LTTng: bytecode: Unknown field ref type\n");
07dfc1d0
MD
871 ret = -EINVAL;
872 goto end;
873 }
80c2a69a
FD
874 case BYTECODE_OP_LOAD_FIELD_REF_STRING:
875 case BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE:
876 case BYTECODE_OP_LOAD_FIELD_REF_USER_STRING:
877 case BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE:
07dfc1d0
MD
878 {
879 struct load_op *insn = (struct load_op *) pc;
880 struct field_ref *ref = (struct field_ref *) insn->data;
881
882 dbg_printk("Validate load field ref offset %u type string\n",
883 ref->offset);
884 break;
885 }
80c2a69a 886 case BYTECODE_OP_LOAD_FIELD_REF_S64:
07dfc1d0
MD
887 {
888 struct load_op *insn = (struct load_op *) pc;
889 struct field_ref *ref = (struct field_ref *) insn->data;
890
891 dbg_printk("Validate load field ref offset %u type s64\n",
892 ref->offset);
893 break;
894 }
895
896 /* load from immediate operand */
80c2a69a
FD
897 case BYTECODE_OP_LOAD_STRING:
898 case BYTECODE_OP_LOAD_STAR_GLOB_STRING:
07dfc1d0
MD
899 {
900 break;
901 }
902
80c2a69a 903 case BYTECODE_OP_LOAD_S64:
07dfc1d0
MD
904 {
905 break;
906 }
907
80c2a69a 908 case BYTECODE_OP_CAST_TO_S64:
07dfc1d0
MD
909 {
910 struct cast_op *insn = (struct cast_op *) pc;
911
912 if (!vstack_ax(stack)) {
80c2a69a 913 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
914 ret = -EINVAL;
915 goto end;
916 }
917 switch (vstack_ax(stack)->type) {
918 default:
919 case REG_DOUBLE:
80c2a69a 920 printk(KERN_WARNING "LTTng: bytecode: unknown register type\n");
07dfc1d0
MD
921 ret = -EINVAL;
922 goto end;
923
924 case REG_STRING:
02aca193 925 case REG_STAR_GLOB_STRING:
80c2a69a 926 printk(KERN_WARNING "LTTng: bytecode: Cast op can only be applied to numeric or floating point registers\n");
07dfc1d0
MD
927 ret = -EINVAL;
928 goto end;
929 case REG_S64:
930 break;
931 }
80c2a69a 932 if (insn->op == BYTECODE_OP_CAST_DOUBLE_TO_S64) {
07dfc1d0 933 if (vstack_ax(stack)->type != REG_DOUBLE) {
80c2a69a 934 printk(KERN_WARNING "LTTng: bytecode: Cast expects double\n");
07dfc1d0
MD
935 ret = -EINVAL;
936 goto end;
937 }
938 }
939 break;
940 }
80c2a69a 941 case BYTECODE_OP_CAST_NOP:
07dfc1d0
MD
942 {
943 break;
944 }
945
946 /* get context ref */
80c2a69a 947 case BYTECODE_OP_GET_CONTEXT_REF:
07dfc1d0 948 {
80c2a69a 949 printk(KERN_WARNING "LTTng: bytecode: Unknown get context ref type\n");
07dfc1d0
MD
950 ret = -EINVAL;
951 goto end;
952 }
80c2a69a 953 case BYTECODE_OP_GET_CONTEXT_REF_STRING:
07dfc1d0
MD
954 {
955 struct load_op *insn = (struct load_op *) pc;
956 struct field_ref *ref = (struct field_ref *) insn->data;
957
958 dbg_printk("Validate get context ref offset %u type string\n",
959 ref->offset);
960 break;
961 }
80c2a69a 962 case BYTECODE_OP_GET_CONTEXT_REF_S64:
07dfc1d0
MD
963 {
964 struct load_op *insn = (struct load_op *) pc;
965 struct field_ref *ref = (struct field_ref *) insn->data;
966
967 dbg_printk("Validate get context ref offset %u type s64\n",
968 ref->offset);
969 break;
970 }
971
3834b99f
MD
972 /*
973 * Instructions for recursive traversal through composed types.
974 */
80c2a69a 975 case BYTECODE_OP_GET_CONTEXT_ROOT:
3834b99f
MD
976 {
977 dbg_printk("Validate get context root\n");
978 break;
979 }
80c2a69a 980 case BYTECODE_OP_GET_APP_CONTEXT_ROOT:
3834b99f
MD
981 {
982 dbg_printk("Validate get app context root\n");
983 break;
984 }
80c2a69a 985 case BYTECODE_OP_GET_PAYLOAD_ROOT:
3834b99f
MD
986 {
987 dbg_printk("Validate get payload root\n");
988 break;
989 }
80c2a69a 990 case BYTECODE_OP_LOAD_FIELD:
3834b99f
MD
991 {
992 /*
993 * We tolerate that field type is unknown at validation,
994 * because we are performing the load specialization in
995 * a phase after validation.
996 */
997 dbg_printk("Validate load field\n");
998 break;
999 }
80c2a69a 1000 case BYTECODE_OP_LOAD_FIELD_S8:
3834b99f
MD
1001 {
1002 dbg_printk("Validate load field s8\n");
1003 break;
1004 }
80c2a69a 1005 case BYTECODE_OP_LOAD_FIELD_S16:
3834b99f
MD
1006 {
1007 dbg_printk("Validate load field s16\n");
1008 break;
1009 }
80c2a69a 1010 case BYTECODE_OP_LOAD_FIELD_S32:
3834b99f
MD
1011 {
1012 dbg_printk("Validate load field s32\n");
1013 break;
1014 }
80c2a69a 1015 case BYTECODE_OP_LOAD_FIELD_S64:
3834b99f
MD
1016 {
1017 dbg_printk("Validate load field s64\n");
1018 break;
1019 }
80c2a69a 1020 case BYTECODE_OP_LOAD_FIELD_U8:
3834b99f
MD
1021 {
1022 dbg_printk("Validate load field u8\n");
1023 break;
1024 }
80c2a69a 1025 case BYTECODE_OP_LOAD_FIELD_U16:
3834b99f
MD
1026 {
1027 dbg_printk("Validate load field u16\n");
1028 break;
1029 }
80c2a69a 1030 case BYTECODE_OP_LOAD_FIELD_U32:
3834b99f
MD
1031 {
1032 dbg_printk("Validate load field u32\n");
1033 break;
1034 }
80c2a69a 1035 case BYTECODE_OP_LOAD_FIELD_U64:
3834b99f
MD
1036 {
1037 dbg_printk("Validate load field u64\n");
1038 break;
1039 }
80c2a69a 1040 case BYTECODE_OP_LOAD_FIELD_STRING:
3834b99f
MD
1041 {
1042 dbg_printk("Validate load field string\n");
1043 break;
1044 }
80c2a69a 1045 case BYTECODE_OP_LOAD_FIELD_SEQUENCE:
3834b99f
MD
1046 {
1047 dbg_printk("Validate load field sequence\n");
1048 break;
1049 }
80c2a69a 1050 case BYTECODE_OP_LOAD_FIELD_DOUBLE:
3834b99f
MD
1051 {
1052 dbg_printk("Validate load field double\n");
1053 break;
1054 }
1055
80c2a69a 1056 case BYTECODE_OP_GET_SYMBOL:
3834b99f
MD
1057 {
1058 struct load_op *insn = (struct load_op *) pc;
1059 struct get_symbol *sym = (struct get_symbol *) insn->data;
1060
1061 dbg_printk("Validate get symbol offset %u\n", sym->offset);
1062 break;
1063 }
1064
80c2a69a 1065 case BYTECODE_OP_GET_SYMBOL_FIELD:
3834b99f
MD
1066 {
1067 struct load_op *insn = (struct load_op *) pc;
1068 struct get_symbol *sym = (struct get_symbol *) insn->data;
1069
1070 dbg_printk("Validate get symbol field offset %u\n", sym->offset);
1071 break;
1072 }
1073
80c2a69a 1074 case BYTECODE_OP_GET_INDEX_U16:
3834b99f
MD
1075 {
1076 struct load_op *insn = (struct load_op *) pc;
1077 struct get_index_u16 *get_index = (struct get_index_u16 *) insn->data;
1078
1079 dbg_printk("Validate get index u16 index %u\n", get_index->index);
1080 break;
1081 }
1082
80c2a69a 1083 case BYTECODE_OP_GET_INDEX_U64:
3834b99f
MD
1084 {
1085 struct load_op *insn = (struct load_op *) pc;
1086 struct get_index_u64 *get_index = (struct get_index_u64 *) insn->data;
1087
1088 dbg_printk("Validate get index u64 index %llu\n",
1089 (unsigned long long) get_index->index);
1090 break;
1091 }
07dfc1d0
MD
1092 }
1093end:
1094 return ret;
1095}
1096
1097/*
1098 * Return value:
1099 * 0: success
1100 * <0: error
1101 */
1102static
1103int validate_instruction_all_contexts(struct bytecode_runtime *bytecode,
1104 struct mp_table *mp_table,
1105 struct vstack *stack,
7962cb86
MD
1106 char *start_pc,
1107 char *pc)
07dfc1d0
MD
1108{
1109 int ret, found = 0;
1110 unsigned long target_pc = pc - start_pc;
1111 unsigned long hash;
1112 struct hlist_head *head;
1113 struct mp_node *mp_node;
1114
1115 /* Validate the context resulting from the previous instruction */
1116 ret = validate_instruction_context(bytecode, stack, start_pc, pc);
3834b99f 1117 if (ret < 0)
07dfc1d0
MD
1118 return ret;
1119
1120 /* Validate merge points */
1121 hash = jhash_1word(target_pc, 0);
1122 head = &mp_table->mp_head[hash & (MERGE_POINT_TABLE_SIZE - 1)];
d216ecae 1123 lttng_hlist_for_each_entry(mp_node, head, node) {
07dfc1d0
MD
1124 if (lttng_hash_match(mp_node, target_pc)) {
1125 found = 1;
1126 break;
1127 }
1128 }
1129 if (found) {
80c2a69a 1130 dbg_printk("Bytecode: validate merge point at offset %lu\n",
07dfc1d0
MD
1131 target_pc);
1132 if (merge_points_compare(stack, &mp_node->stack)) {
80c2a69a 1133 printk(KERN_WARNING "LTTng: bytecode: Merge points differ for offset %lu\n",
07dfc1d0
MD
1134 target_pc);
1135 return -EINVAL;
1136 }
1137 /* Once validated, we can remove the merge point */
80c2a69a 1138 dbg_printk("Bytecode: remove merge point at offset %lu\n",
07dfc1d0
MD
1139 target_pc);
1140 hlist_del(&mp_node->node);
1141 }
1142 return 0;
1143}
1144
1145/*
1146 * Return value:
1147 * >0: going to next insn.
1148 * 0: success, stop iteration.
1149 * <0: error
1150 */
1151static
1152int exec_insn(struct bytecode_runtime *bytecode,
1153 struct mp_table *mp_table,
1154 struct vstack *stack,
7962cb86
MD
1155 char **_next_pc,
1156 char *pc)
07dfc1d0
MD
1157{
1158 int ret = 1;
7962cb86 1159 char *next_pc = *_next_pc;
07dfc1d0 1160
80c2a69a
FD
1161 switch (*(bytecode_opcode_t *) pc) {
1162 case BYTECODE_OP_UNKNOWN:
07dfc1d0
MD
1163 default:
1164 {
80c2a69a
FD
1165 printk(KERN_WARNING "LTTng: bytecode: unknown bytecode op %u\n",
1166 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
1167 ret = -EINVAL;
1168 goto end;
1169 }
1170
80c2a69a 1171 case BYTECODE_OP_RETURN:
07dfc1d0
MD
1172 {
1173 if (!vstack_ax(stack)) {
80c2a69a 1174 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
1175 ret = -EINVAL;
1176 goto end;
1177 }
3834b99f
MD
1178 switch (vstack_ax(stack)->type) {
1179 case REG_S64:
1242217a 1180 case REG_U64:
fd41f360
FD
1181 case REG_DOUBLE:
1182 case REG_STRING:
1183 case REG_PTR:
3834b99f
MD
1184 case REG_TYPE_UNKNOWN:
1185 break;
1186 default:
80c2a69a 1187 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d at end of bytecode\n",
3834b99f
MD
1188 (int) vstack_ax(stack)->type);
1189 ret = -EINVAL;
1190 goto end;
1191 }
1192
07dfc1d0
MD
1193 ret = 0;
1194 goto end;
1195 }
1196
80c2a69a 1197 case BYTECODE_OP_RETURN_S64:
57ba4b41
MD
1198 {
1199 if (!vstack_ax(stack)) {
80c2a69a 1200 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
57ba4b41
MD
1201 ret = -EINVAL;
1202 goto end;
1203 }
1204 switch (vstack_ax(stack)->type) {
1205 case REG_S64:
1242217a 1206 case REG_U64:
57ba4b41
MD
1207 break;
1208 default:
1209 case REG_TYPE_UNKNOWN:
80c2a69a 1210 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d at end of bytecode\n",
57ba4b41
MD
1211 (int) vstack_ax(stack)->type);
1212 ret = -EINVAL;
1213 goto end;
1214 }
1215
1216 ret = 0;
1217 goto end;
1218 }
1219
07dfc1d0 1220 /* binary */
80c2a69a
FD
1221 case BYTECODE_OP_MUL:
1222 case BYTECODE_OP_DIV:
1223 case BYTECODE_OP_MOD:
1224 case BYTECODE_OP_PLUS:
1225 case BYTECODE_OP_MINUS:
07dfc1d0 1226 /* Floating point */
80c2a69a
FD
1227 case BYTECODE_OP_EQ_DOUBLE:
1228 case BYTECODE_OP_NE_DOUBLE:
1229 case BYTECODE_OP_GT_DOUBLE:
1230 case BYTECODE_OP_LT_DOUBLE:
1231 case BYTECODE_OP_GE_DOUBLE:
1232 case BYTECODE_OP_LE_DOUBLE:
1233 case BYTECODE_OP_EQ_DOUBLE_S64:
1234 case BYTECODE_OP_NE_DOUBLE_S64:
1235 case BYTECODE_OP_GT_DOUBLE_S64:
1236 case BYTECODE_OP_LT_DOUBLE_S64:
1237 case BYTECODE_OP_GE_DOUBLE_S64:
1238 case BYTECODE_OP_LE_DOUBLE_S64:
1239 case BYTECODE_OP_EQ_S64_DOUBLE:
1240 case BYTECODE_OP_NE_S64_DOUBLE:
1241 case BYTECODE_OP_GT_S64_DOUBLE:
1242 case BYTECODE_OP_LT_S64_DOUBLE:
1243 case BYTECODE_OP_GE_S64_DOUBLE:
1244 case BYTECODE_OP_LE_S64_DOUBLE:
1245 case BYTECODE_OP_UNARY_PLUS_DOUBLE:
1246 case BYTECODE_OP_UNARY_MINUS_DOUBLE:
1247 case BYTECODE_OP_UNARY_NOT_DOUBLE:
1248 case BYTECODE_OP_LOAD_FIELD_REF_DOUBLE:
1249 case BYTECODE_OP_GET_CONTEXT_REF_DOUBLE:
1250 case BYTECODE_OP_LOAD_DOUBLE:
1251 case BYTECODE_OP_CAST_DOUBLE_TO_S64:
1252 {
1253 printk(KERN_WARNING "LTTng: bytecode: unsupported bytecode op %u\n",
1254 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
1255 ret = -EINVAL;
1256 goto end;
1257 }
1258
80c2a69a
FD
1259 case BYTECODE_OP_EQ:
1260 case BYTECODE_OP_NE:
1261 case BYTECODE_OP_GT:
1262 case BYTECODE_OP_LT:
1263 case BYTECODE_OP_GE:
1264 case BYTECODE_OP_LE:
1265 case BYTECODE_OP_EQ_STRING:
1266 case BYTECODE_OP_NE_STRING:
1267 case BYTECODE_OP_GT_STRING:
1268 case BYTECODE_OP_LT_STRING:
1269 case BYTECODE_OP_GE_STRING:
1270 case BYTECODE_OP_LE_STRING:
1271 case BYTECODE_OP_EQ_STAR_GLOB_STRING:
1272 case BYTECODE_OP_NE_STAR_GLOB_STRING:
1273 case BYTECODE_OP_EQ_S64:
1274 case BYTECODE_OP_NE_S64:
1275 case BYTECODE_OP_GT_S64:
1276 case BYTECODE_OP_LT_S64:
1277 case BYTECODE_OP_GE_S64:
1278 case BYTECODE_OP_LE_S64:
1242217a
FD
1279 {
1280 /* Pop 2, push 1 */
1281 if (vstack_pop(stack)) {
1282 ret = -EINVAL;
1283 goto end;
1284 }
1285 if (!vstack_ax(stack)) {
1286 printk(KERN_WARNING "Empty stack\n");
1287 ret = -EINVAL;
1288 goto end;
1289 }
1290 switch (vstack_ax(stack)->type) {
1291 case REG_S64:
1292 case REG_U64:
1293 case REG_DOUBLE:
1294 case REG_STRING:
1295 case REG_STAR_GLOB_STRING:
1296 case REG_TYPE_UNKNOWN:
1297 break;
1298 default:
1299 printk(KERN_WARNING "Unexpected register type %d for operation\n",
1300 (int) vstack_ax(stack)->type);
1301 ret = -EINVAL;
1302 goto end;
1303 }
1304
1305 vstack_ax(stack)->type = REG_S64;
1306 next_pc += sizeof(struct binary_op);
1307 break;
1308 }
80c2a69a
FD
1309 case BYTECODE_OP_BIT_RSHIFT:
1310 case BYTECODE_OP_BIT_LSHIFT:
1311 case BYTECODE_OP_BIT_AND:
1312 case BYTECODE_OP_BIT_OR:
1313 case BYTECODE_OP_BIT_XOR:
07dfc1d0
MD
1314 {
1315 /* Pop 2, push 1 */
1316 if (vstack_pop(stack)) {
1317 ret = -EINVAL;
1318 goto end;
1319 }
1320 if (!vstack_ax(stack)) {
80c2a69a 1321 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
1322 ret = -EINVAL;
1323 goto end;
1324 }
3834b99f
MD
1325 switch (vstack_ax(stack)->type) {
1326 case REG_S64:
1242217a 1327 case REG_U64:
3834b99f
MD
1328 case REG_DOUBLE:
1329 case REG_STRING:
1330 case REG_STAR_GLOB_STRING:
1331 case REG_TYPE_UNKNOWN:
1332 break;
1333 default:
80c2a69a 1334 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d for operation\n",
3834b99f
MD
1335 (int) vstack_ax(stack)->type);
1336 ret = -EINVAL;
1337 goto end;
1338 }
1339
1242217a 1340 vstack_ax(stack)->type = REG_U64;
07dfc1d0
MD
1341 next_pc += sizeof(struct binary_op);
1342 break;
1343 }
1344
1345 /* unary */
80c2a69a
FD
1346 case BYTECODE_OP_UNARY_PLUS:
1347 case BYTECODE_OP_UNARY_MINUS:
3834b99f
MD
1348 {
1349 /* Pop 1, push 1 */
1350 if (!vstack_ax(stack)) {
80c2a69a 1351 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1352 ret = -EINVAL;
1353 goto end;
1354 }
1355 switch (vstack_ax(stack)->type) {
1356 case REG_S64:
1242217a 1357 case REG_U64:
3834b99f
MD
1358 case REG_TYPE_UNKNOWN:
1359 break;
1360 default:
80c2a69a 1361 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d for operation\n",
3834b99f
MD
1362 (int) vstack_ax(stack)->type);
1363 ret = -EINVAL;
1364 goto end;
1365 }
1366
1367 vstack_ax(stack)->type = REG_TYPE_UNKNOWN;
1368 next_pc += sizeof(struct unary_op);
1369 break;
1370 }
1371
80c2a69a
FD
1372 case BYTECODE_OP_UNARY_PLUS_S64:
1373 case BYTECODE_OP_UNARY_MINUS_S64:
1374 case BYTECODE_OP_UNARY_NOT_S64:
07dfc1d0
MD
1375 {
1376 /* Pop 1, push 1 */
1377 if (!vstack_ax(stack)) {
80c2a69a 1378 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1379 ret = -EINVAL;
1380 goto end;
1381 }
1382 switch (vstack_ax(stack)->type) {
1383 case REG_S64:
1242217a 1384 case REG_U64:
3834b99f
MD
1385 break;
1386 default:
80c2a69a 1387 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d for operation\n",
3834b99f
MD
1388 (int) vstack_ax(stack)->type);
1389 ret = -EINVAL;
1390 goto end;
1391 }
1392
3834b99f
MD
1393 next_pc += sizeof(struct unary_op);
1394 break;
1395 }
1396
80c2a69a 1397 case BYTECODE_OP_UNARY_NOT:
3834b99f
MD
1398 {
1399 /* Pop 1, push 1 */
1400 if (!vstack_ax(stack)) {
80c2a69a 1401 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1402 ret = -EINVAL;
1403 goto end;
1404 }
1405 switch (vstack_ax(stack)->type) {
1406 case REG_S64:
1242217a 1407 case REG_U64:
3834b99f
MD
1408 case REG_TYPE_UNKNOWN:
1409 break;
1410 default:
80c2a69a 1411 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d for operation\n",
e16c054b
MD
1412 (int) vstack_ax(stack)->type);
1413 ret = -EINVAL;
1414 goto end;
1415 }
1416
e16c054b
MD
1417 next_pc += sizeof(struct unary_op);
1418 break;
1419 }
1420
80c2a69a 1421 case BYTECODE_OP_UNARY_BIT_NOT:
e16c054b
MD
1422 {
1423 /* Pop 1, push 1 */
1424 if (!vstack_ax(stack)) {
80c2a69a 1425 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
e16c054b
MD
1426 ret = -EINVAL;
1427 goto end;
1428 }
1429 switch (vstack_ax(stack)->type) {
1430 case REG_S64:
1242217a 1431 case REG_U64:
e16c054b
MD
1432 case REG_TYPE_UNKNOWN:
1433 break;
1434 case REG_DOUBLE:
1435 default:
80c2a69a 1436 printk(KERN_WARNING "LTTng: bytecode: Unexpected register type %d for operation\n",
3834b99f 1437 (int) vstack_ax(stack)->type);
07dfc1d0
MD
1438 ret = -EINVAL;
1439 goto end;
1440 }
3834b99f 1441
1242217a 1442 vstack_ax(stack)->type = REG_U64;
07dfc1d0
MD
1443 next_pc += sizeof(struct unary_op);
1444 break;
1445 }
1446
1447 /* logical */
80c2a69a
FD
1448 case BYTECODE_OP_AND:
1449 case BYTECODE_OP_OR:
07dfc1d0
MD
1450 {
1451 struct logical_op *insn = (struct logical_op *) pc;
1452 int merge_ret;
1453
1454 /* Add merge point to table */
1455 merge_ret = merge_point_add_check(mp_table,
1456 insn->skip_offset, stack);
1457 if (merge_ret) {
1458 ret = merge_ret;
1459 goto end;
1460 }
3834b99f
MD
1461
1462 if (!vstack_ax(stack)) {
80c2a69a 1463 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1464 ret = -EINVAL;
1465 goto end;
1466 }
1467 /* There is always a cast-to-s64 operation before a or/and op. */
1468 switch (vstack_ax(stack)->type) {
1469 case REG_S64:
1242217a 1470 case REG_U64:
3834b99f
MD
1471 break;
1472 default:
80c2a69a 1473 printk(KERN_WARNING "LTTng: bytecode: Incorrect register type %d for operation\n",
3834b99f
MD
1474 (int) vstack_ax(stack)->type);
1475 ret = -EINVAL;
1476 goto end;
1477 }
1478
07dfc1d0
MD
1479 /* Continue to next instruction */
1480 /* Pop 1 when jump not taken */
1481 if (vstack_pop(stack)) {
1482 ret = -EINVAL;
1483 goto end;
1484 }
1485 next_pc += sizeof(struct logical_op);
1486 break;
1487 }
1488
1489 /* load field ref */
80c2a69a 1490 case BYTECODE_OP_LOAD_FIELD_REF:
07dfc1d0 1491 {
80c2a69a 1492 printk(KERN_WARNING "LTTng: bytecode: Unknown field ref type\n");
07dfc1d0
MD
1493 ret = -EINVAL;
1494 goto end;
1495 }
1496 /* get context ref */
80c2a69a 1497 case BYTECODE_OP_GET_CONTEXT_REF:
07dfc1d0 1498 {
80c2a69a 1499 printk(KERN_WARNING "LTTng: bytecode: Unknown get context ref type\n");
07dfc1d0
MD
1500 ret = -EINVAL;
1501 goto end;
1502 }
80c2a69a
FD
1503 case BYTECODE_OP_LOAD_FIELD_REF_STRING:
1504 case BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE:
1505 case BYTECODE_OP_GET_CONTEXT_REF_STRING:
1506 case BYTECODE_OP_LOAD_FIELD_REF_USER_STRING:
1507 case BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE:
07dfc1d0
MD
1508 {
1509 if (vstack_push(stack)) {
1510 ret = -EINVAL;
1511 goto end;
1512 }
1513 vstack_ax(stack)->type = REG_STRING;
1514 next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
1515 break;
1516 }
80c2a69a
FD
1517 case BYTECODE_OP_LOAD_FIELD_REF_S64:
1518 case BYTECODE_OP_GET_CONTEXT_REF_S64:
07dfc1d0
MD
1519 {
1520 if (vstack_push(stack)) {
1521 ret = -EINVAL;
1522 goto end;
1523 }
1524 vstack_ax(stack)->type = REG_S64;
1525 next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
1526 break;
1527 }
1528
1529 /* load from immediate operand */
80c2a69a 1530 case BYTECODE_OP_LOAD_STRING:
07dfc1d0
MD
1531 {
1532 struct load_op *insn = (struct load_op *) pc;
1533
1534 if (vstack_push(stack)) {
1535 ret = -EINVAL;
1536 goto end;
1537 }
1538 vstack_ax(stack)->type = REG_STRING;
1539 next_pc += sizeof(struct load_op) + strlen(insn->data) + 1;
02aca193
PP
1540 break;
1541 }
1542
80c2a69a 1543 case BYTECODE_OP_LOAD_STAR_GLOB_STRING:
02aca193
PP
1544 {
1545 struct load_op *insn = (struct load_op *) pc;
1546
1547 if (vstack_push(stack)) {
1548 ret = -EINVAL;
1549 goto end;
1550 }
1551 vstack_ax(stack)->type = REG_STAR_GLOB_STRING;
1552 next_pc += sizeof(struct load_op) + strlen(insn->data) + 1;
07dfc1d0
MD
1553 break;
1554 }
1555
80c2a69a 1556 case BYTECODE_OP_LOAD_S64:
07dfc1d0
MD
1557 {
1558 if (vstack_push(stack)) {
1559 ret = -EINVAL;
1560 goto end;
1561 }
1562 vstack_ax(stack)->type = REG_S64;
1563 next_pc += sizeof(struct load_op)
1564 + sizeof(struct literal_numeric);
1565 break;
1566 }
1567
80c2a69a 1568 case BYTECODE_OP_CAST_TO_S64:
07dfc1d0
MD
1569 {
1570 /* Pop 1, push 1 */
1571 if (!vstack_ax(stack)) {
80c2a69a 1572 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n");
07dfc1d0
MD
1573 ret = -EINVAL;
1574 goto end;
1575 }
3834b99f
MD
1576 switch (vstack_ax(stack)->type) {
1577 case REG_S64:
1242217a 1578 case REG_U64:
3834b99f
MD
1579 case REG_DOUBLE:
1580 case REG_TYPE_UNKNOWN:
1581 break;
1582 default:
80c2a69a 1583 printk(KERN_WARNING "LTTng: bytecode: Incorrect register type %d for cast\n",
3834b99f
MD
1584 (int) vstack_ax(stack)->type);
1585 ret = -EINVAL;
1586 goto end;
1587 }
07dfc1d0
MD
1588 vstack_ax(stack)->type = REG_S64;
1589 next_pc += sizeof(struct cast_op);
1590 break;
1591 }
80c2a69a 1592 case BYTECODE_OP_CAST_NOP:
07dfc1d0
MD
1593 {
1594 next_pc += sizeof(struct cast_op);
1595 break;
1596 }
1597
3834b99f
MD
1598 /*
1599 * Instructions for recursive traversal through composed types.
1600 */
80c2a69a
FD
1601 case BYTECODE_OP_GET_CONTEXT_ROOT:
1602 case BYTECODE_OP_GET_APP_CONTEXT_ROOT:
1603 case BYTECODE_OP_GET_PAYLOAD_ROOT:
3834b99f
MD
1604 {
1605 if (vstack_push(stack)) {
1606 ret = -EINVAL;
1607 goto end;
1608 }
1609 vstack_ax(stack)->type = REG_PTR;
1610 next_pc += sizeof(struct load_op);
1611 break;
1612 }
1613
80c2a69a 1614 case BYTECODE_OP_LOAD_FIELD:
3834b99f
MD
1615 {
1616 /* Pop 1, push 1 */
1617 if (!vstack_ax(stack)) {
80c2a69a 1618 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1619 ret = -EINVAL;
1620 goto end;
1621 }
1622 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1623 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1624 ret = -EINVAL;
1625 goto end;
1626 }
1627 vstack_ax(stack)->type = REG_TYPE_UNKNOWN;
1628 next_pc += sizeof(struct load_op);
1629 break;
1630 }
1631
80c2a69a
FD
1632 case BYTECODE_OP_LOAD_FIELD_S8:
1633 case BYTECODE_OP_LOAD_FIELD_S16:
1634 case BYTECODE_OP_LOAD_FIELD_S32:
1635 case BYTECODE_OP_LOAD_FIELD_S64:
1242217a
FD
1636 {
1637 /* Pop 1, push 1 */
1638 if (!vstack_ax(stack)) {
1639 printk(KERN_WARNING "Empty stack\n\n");
1640 ret = -EINVAL;
1641 goto end;
1642 }
1643 if (vstack_ax(stack)->type != REG_PTR) {
1644 printk(KERN_WARNING "Expecting pointer on top of stack\n\n");
1645 ret = -EINVAL;
1646 goto end;
1647 }
1648 vstack_ax(stack)->type = REG_S64;
1649 next_pc += sizeof(struct load_op);
1650 break;
1651 }
80c2a69a
FD
1652 case BYTECODE_OP_LOAD_FIELD_U8:
1653 case BYTECODE_OP_LOAD_FIELD_U16:
1654 case BYTECODE_OP_LOAD_FIELD_U32:
1655 case BYTECODE_OP_LOAD_FIELD_U64:
3834b99f
MD
1656 {
1657 /* Pop 1, push 1 */
1658 if (!vstack_ax(stack)) {
80c2a69a 1659 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1660 ret = -EINVAL;
1661 goto end;
1662 }
1663 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1664 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1665 ret = -EINVAL;
1666 goto end;
1667 }
1242217a 1668 vstack_ax(stack)->type = REG_U64;
3834b99f
MD
1669 next_pc += sizeof(struct load_op);
1670 break;
1671 }
80c2a69a
FD
1672 case BYTECODE_OP_LOAD_FIELD_STRING:
1673 case BYTECODE_OP_LOAD_FIELD_SEQUENCE:
3834b99f
MD
1674 {
1675 /* Pop 1, push 1 */
1676 if (!vstack_ax(stack)) {
80c2a69a 1677 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1678 ret = -EINVAL;
1679 goto end;
1680 }
1681 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1682 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1683 ret = -EINVAL;
1684 goto end;
1685 }
1686 vstack_ax(stack)->type = REG_STRING;
1687 next_pc += sizeof(struct load_op);
1688 break;
1689 }
1690
80c2a69a 1691 case BYTECODE_OP_LOAD_FIELD_DOUBLE:
3834b99f
MD
1692 {
1693 /* Pop 1, push 1 */
1694 if (!vstack_ax(stack)) {
80c2a69a 1695 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1696 ret = -EINVAL;
1697 goto end;
1698 }
1699 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1700 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1701 ret = -EINVAL;
1702 goto end;
1703 }
1704 vstack_ax(stack)->type = REG_DOUBLE;
1705 next_pc += sizeof(struct load_op);
1706 break;
1707 }
1708
80c2a69a
FD
1709 case BYTECODE_OP_GET_SYMBOL:
1710 case BYTECODE_OP_GET_SYMBOL_FIELD:
3834b99f
MD
1711 {
1712 /* Pop 1, push 1 */
1713 if (!vstack_ax(stack)) {
80c2a69a 1714 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1715 ret = -EINVAL;
1716 goto end;
1717 }
1718 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1719 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1720 ret = -EINVAL;
1721 goto end;
1722 }
1723 next_pc += sizeof(struct load_op) + sizeof(struct get_symbol);
1724 break;
1725 }
1726
80c2a69a 1727 case BYTECODE_OP_GET_INDEX_U16:
3834b99f
MD
1728 {
1729 /* Pop 1, push 1 */
1730 if (!vstack_ax(stack)) {
80c2a69a 1731 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1732 ret = -EINVAL;
1733 goto end;
1734 }
1735 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1736 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1737 ret = -EINVAL;
1738 goto end;
1739 }
1740 next_pc += sizeof(struct load_op) + sizeof(struct get_index_u16);
1741 break;
1742 }
1743
80c2a69a 1744 case BYTECODE_OP_GET_INDEX_U64:
3834b99f
MD
1745 {
1746 /* Pop 1, push 1 */
1747 if (!vstack_ax(stack)) {
80c2a69a 1748 printk(KERN_WARNING "LTTng: bytecode: Empty stack\n\n");
3834b99f
MD
1749 ret = -EINVAL;
1750 goto end;
1751 }
1752 if (vstack_ax(stack)->type != REG_PTR) {
80c2a69a 1753 printk(KERN_WARNING "LTTng: bytecode: Expecting pointer on top of stack\n\n");
3834b99f
MD
1754 ret = -EINVAL;
1755 goto end;
1756 }
1757 next_pc += sizeof(struct load_op) + sizeof(struct get_index_u64);
1758 break;
1759 }
1760
07dfc1d0
MD
1761 }
1762end:
1763 *_next_pc = next_pc;
1764 return ret;
1765}
1766
1767/*
1768 * Never called concurrently (hash seed is shared).
1769 */
80c2a69a 1770int lttng_bytecode_validate(struct bytecode_runtime *bytecode)
07dfc1d0
MD
1771{
1772 struct mp_table *mp_table;
7962cb86 1773 char *pc, *next_pc, *start_pc;
07dfc1d0
MD
1774 int ret = -EINVAL;
1775 struct vstack stack;
1776
1777 vstack_init(&stack);
1778
1779 mp_table = kzalloc(sizeof(*mp_table), GFP_KERNEL);
1780 if (!mp_table) {
80c2a69a 1781 printk(KERN_WARNING "LTTng: bytecode: Error allocating hash table for bytecode validation\n");
07dfc1d0
MD
1782 return -ENOMEM;
1783 }
3834b99f 1784 start_pc = &bytecode->code[0];
07dfc1d0
MD
1785 for (pc = next_pc = start_pc; pc - start_pc < bytecode->len;
1786 pc = next_pc) {
1787 ret = bytecode_validate_overflow(bytecode, start_pc, pc);
1788 if (ret != 0) {
1789 if (ret == -ERANGE)
80c2a69a 1790 printk(KERN_WARNING "LTTng: bytecode: bytecode overflow\n");
07dfc1d0
MD
1791 goto end;
1792 }
1793 dbg_printk("Validating op %s (%u)\n",
80c2a69a
FD
1794 lttng_bytecode_print_op((unsigned int) *(bytecode_opcode_t *) pc),
1795 (unsigned int) *(bytecode_opcode_t *) pc);
07dfc1d0
MD
1796
1797 /*
1798 * For each instruction, validate the current context
1799 * (traversal of entire execution flow), and validate
3834b99f 1800 * all merge points targeting this instruction.
07dfc1d0
MD
1801 */
1802 ret = validate_instruction_all_contexts(bytecode, mp_table,
1803 &stack, start_pc, pc);
1804 if (ret)
1805 goto end;
1806 ret = exec_insn(bytecode, mp_table, &stack, &next_pc, pc);
1807 if (ret <= 0)
1808 goto end;
1809 }
1810end:
1811 if (delete_all_nodes(mp_table)) {
1812 if (!ret) {
80c2a69a 1813 printk(KERN_WARNING "LTTng: bytecode: Unexpected merge points\n");
07dfc1d0
MD
1814 ret = -EINVAL;
1815 }
1816 }
1817 kfree(mp_table);
1818 return ret;
1819}
This page took 0.163018 seconds and 4 git commands to generate.