Lines Matching refs:block
368 def visited(self, block): argument
369 if id(block) in self._visited:
371 self._visited.add(id(block))
374 def process(self, block): argument
375 block.accept(self)
376 return block
378 def visit(self, block): argument
379 if isinstance(block, KillProcess):
380 self.visitKillProcess(block)
381 elif isinstance(block, KillThread):
382 self.visitKillThread(block)
383 elif isinstance(block, Trap):
384 self.visitTrap(block)
385 elif isinstance(block, ReturnErrno):
386 self.visitReturnErrno(block)
387 elif isinstance(block, Trace):
388 self.visitTrace(block)
389 elif isinstance(block, Log):
390 self.visitLog(block)
391 elif isinstance(block, Allow):
392 self.visitAllow(block)
393 elif isinstance(block, BasicBlock):
394 self.visitBasicBlock(block)
395 elif isinstance(block, ValidateArch):
396 self.visitValidateArch(block)
397 elif isinstance(block, SyscallEntry):
398 self.visitSyscallEntry(block)
399 elif isinstance(block, WideAtom):
400 self.visitWideAtom(block)
401 elif isinstance(block, Atom):
402 self.visitAtom(block)
404 raise Exception('Unknown block type: %r' % block)
407 def visitKillProcess(self, block): argument
411 def visitKillThread(self, block): argument
415 def visitTrap(self, block): argument
419 def visitReturnErrno(self, block): argument
423 def visitTrace(self, block): argument
427 def visitLog(self, block): argument
431 def visitAllow(self, block): argument
435 def visitBasicBlock(self, block): argument
439 def visitValidateArch(self, block): argument
443 def visitSyscallEntry(self, block): argument
447 def visitWideAtom(self, block): argument
451 def visitAtom(self, block): argument
462 def process(self, block): argument
464 block.accept(self)
465 return self._mapping[id(block)]
467 def visitKillProcess(self, block): argument
468 assert id(block) not in self._mapping
469 self._mapping[id(block)] = KillProcess()
471 def visitKillThread(self, block): argument
472 assert id(block) not in self._mapping
473 self._mapping[id(block)] = KillThread()
475 def visitTrap(self, block): argument
476 assert id(block) not in self._mapping
477 self._mapping[id(block)] = Trap()
479 def visitReturnErrno(self, block): argument
480 assert id(block) not in self._mapping
481 self._mapping[id(block)] = ReturnErrno(block.errno)
483 def visitTrace(self, block): argument
484 assert id(block) not in self._mapping
485 self._mapping[id(block)] = Trace()
487 def visitLog(self, block): argument
488 assert id(block) not in self._mapping
489 self._mapping[id(block)] = Log()
491 def visitAllow(self, block): argument
492 assert id(block) not in self._mapping
493 self._mapping[id(block)] = Allow()
495 def visitBasicBlock(self, block): argument
496 assert id(block) not in self._mapping
497 self._mapping[id(block)] = BasicBlock(block.instructions)
499 def visitValidateArch(self, block): argument
500 assert id(block) not in self._mapping
501 self._mapping[id(block)] = ValidateArch(
502 block.arch, self._mapping[id(block.next_block)])
504 def visitSyscallEntry(self, block): argument
505 assert id(block) not in self._mapping
506 self._mapping[id(block)] = SyscallEntry(
507 block.syscall_number,
508 self._mapping[id(block.jt)],
509 self._mapping[id(block.jf)],
510 op=block.op)
512 def visitWideAtom(self, block): argument
513 assert id(block) not in self._mapping
514 self._mapping[id(block)] = WideAtom(
515 block.arg_offset, block.op, block.value, self._mapping[id(
516 block.jt)], self._mapping[id(block.jf)])
518 def visitAtom(self, block): argument
519 assert id(block) not in self._mapping
520 self._mapping[id(block)] = Atom(block.arg_index, block.op, block.value,
521 self._mapping[id(block.jt)],
522 self._mapping[id(block.jf)])
532 def visitAtom(self, block): argument
533 assert id(block) not in self._mapping
535 lo = block.value & 0xFFFFFFFF
536 hi = (block.value >> 32) & 0xFFFFFFFF
539 arg_offset(block.arg_index, False), block.op, lo,
540 self._mapping[id(block.jt)], self._mapping[id(block.jf)])
543 self._mapping[id(block)] = lo_block
546 if block.op in (BPF_JGE, BPF_JGT):
553 self._mapping[id(block)] = WideAtom(
554 arg_offset(block.arg_index, True), BPF_JGT, hi,
555 self._mapping[id(block.jt)], lo_block)
558 arg_offset(block.arg_index, True), BPF_JEQ, hi, lo_block,
559 self._mapping[id(block.jf)])
560 self._mapping[id(block)] = WideAtom(
561 arg_offset(block.arg_index, True), BPF_JGT, hi,
562 self._mapping[id(block.jt)], hi_eq_block)
564 if block.op == BPF_JSET:
571 self._mapping[id(block)] = lo_block
573 self._mapping[id(block)] = WideAtom(
574 arg_offset(block.arg_index, True), block.op, hi,
575 self._mapping[id(block.jt)], lo_block)
578 assert block.op == BPF_JEQ, block.op
583 self._mapping[id(block)] = WideAtom(
584 arg_offset(block.arg_index, True), block.op, hi, lo_block,
585 self._mapping[id(block.jf)])
602 def _distance(self, block): argument
603 distance = self._offsets[id(block)] + len(self._instructions)
632 def visited(self, block): argument
633 if id(block) in self._visited:
635 self._visited.add(id(block))
638 def visit(self, block): argument
639 assert id(block) not in self._offsets
641 if isinstance(block, BasicBlock):
642 instructions = block.instructions
643 elif isinstance(block, ValidateArch):
647 self._distance(block.next_block) + 1, 0,
652 elif isinstance(block, SyscallEntry):
653 instructions = self._emit_jmp(block.op, block.syscall_number,
654 self._distance(block.jt),
655 self._distance(block.jf))
656 elif isinstance(block, WideAtom):
658 self._emit_load_arg(block.arg_offset) + self._emit_jmp(
659 block.op, block.value, self._distance(block.jt),
660 self._distance(block.jf)))
662 raise Exception('Unknown block type: %r' % block)
665 self._offsets[id(block)] = -len(self._instructions)
676 def visited(self, block): argument
677 if id(block) in self._visited:
679 self._visited.add(id(block))
682 def visit(self, block): argument
684 if not isinstance(block, BasicBlock):
688 if (isinstance(block, KillProcess) or isinstance(block, KillThread)
689 or isinstance(block, Trap) or isinstance(block, ReturnErrno)
690 or isinstance(block, Trace) or isinstance(block, Log)
691 or isinstance(block, Allow)):
693 block.accept(self.visitor)