libclamav/bytecode_priv.h
e0c4fd85
 /*
  *  Load, verify and execute ClamAV bytecode.
  *
  *  Copyright (C) 2009 Sourcefire, Inc.
  *
  *  Authors: Török Edvin
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
  *  published by the Free Software Foundation.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  *  MA 02110-1301, USA.
  */
 
 #ifndef BYTECODE_PRIV_H
 #define BYTECODE_PRIV_H
8cc286f5
 
 #include "type_desc.h"
e0c4fd85
 typedef uint32_t operand_t;
 typedef uint16_t bbid_t;
 typedef uint16_t funcid_t;
 
 struct cli_bc_callop {
     operand_t* ops;
6922903a
     uint16_t* opsizes;
e0c4fd85
     uint8_t numOps;
     funcid_t funcid;
 };
 
 struct branch {
     operand_t condition;
     bbid_t br_true;
     bbid_t br_false;
 };
 
 struct cli_bc_cast {
     uint64_t mask;
82ca2ab4
     operand_t source;
     uint8_t size;/* 0: 1-bit, 1: 8b, 2: 16b, 3: 32b, 4: 64b */
e0c4fd85
 };
82ca2ab4
 
 typedef uint8_t interp_op_t;
e0c4fd85
 struct cli_bc_inst {
     enum bc_opcode opcode;
     uint16_t type;
82ca2ab4
     interp_op_t interp_op;/* opcode for interpreter */
f3b2dc9e
     operand_t dest;
e0c4fd85
     union {
 	operand_t unaryop;
 	struct cli_bc_cast cast;
 	operand_t binop[2];
 	operand_t three[3];
 	struct cli_bc_callop ops;
 	struct branch branch;
 	bbid_t jump;
     } u;
 };
 
 struct cli_bc_bb {
     unsigned numInsts;
     struct cli_bc_inst *insts;
 };
 
 struct cli_bc_func {
     uint8_t numArgs;
     uint16_t numLocals;
     uint32_t numInsts;
6922903a
     uint32_t numValues;/* without constants */
e0c4fd85
     uint32_t numConstants;
6922903a
     uint32_t numBytes;/* stack size */
e0c4fd85
     uint16_t numBB;
3b33bd68
     uint16_t returnType;
e0c4fd85
     uint16_t *types;
     uint32_t insn_idx;
     struct cli_bc_bb *BB;
     struct cli_bc_inst *allinsts;
6922903a
     uint64_t *constants;
e0c4fd85
 };
6922903a
 #define MAX_OP ~0u
e0c4fd85
 struct cli_bc_ctx {
     /* id and params of toplevel function called */
30188fcc
     const struct cli_bc *bc;
     const struct cli_bc_func *func;
6922903a
     unsigned bytes;
     uint16_t *opsizes;
     char *values;
e0c4fd85
     operand_t *operands;
     uint16_t funcid;
     unsigned numParams;
 };
d1487222
 struct cli_all_bc;
ec5cccc7
 int cli_vm_execute(const struct cli_bc *bc, struct cli_bc_ctx *ctx, const struct cli_bc_func *func, const struct cli_bc_inst *inst);
d1487222
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
85a25497
 int cli_vm_execute_jit(const struct cli_all_bc *bcs, struct cli_bc_ctx *ctx, const struct cli_bc_func *func);
d1487222
 int cli_bytecode_prepare_jit(struct cli_all_bc *bc);
 int cli_bytecode_init_jit(struct cli_all_bc *bc);
 int cli_bytecode_done_jit(struct cli_all_bc *bc);
 int bytecode_init(void);
3b33bd68
 void cli_bytecode_debug(int argc, char **argv);
d1487222
 
 #ifdef __cplusplus
 }
 #endif
e0c4fd85
 #endif