/* * Cisco router simulation platform. * Copyright (c) 2007 Christophe Fillot (cf@utc.fr) * * JIT operations. */ #include #include #include #include #include #include #include #include #include #include #include "cpu.h" #include "jit_op.h" u_int jit_op_blk_sizes[JIT_OP_POOL_NR] = { 0, 32, 64, 128, 256, 384, 512, 1024, }; /* Get a JIT op (allocate one if necessary) */ jit_op_t *jit_op_get(cpu_gen_t *cpu,int size_index,u_int opcode) { jit_op_t *op; size_t len; assert(size_index < JIT_OP_POOL_NR); op = cpu->jit_op_pool[size_index]; if (op != NULL) { assert(op->ob_size_index == size_index); cpu->jit_op_pool[size_index] = op->next; } else { /* no block found, allocate one */ len = sizeof(*op) + jit_op_blk_sizes[size_index]; op = malloc(len); assert(op != NULL); op->ob_size_index = size_index; } op->opcode = opcode; op->param[0] = op->param[1] = op->param[2] = -1; op->next = NULL; op->ob_ptr = op->ob_data; op->arg_ptr = NULL; op->insn_name = NULL; return op; } /* Release a JIT op */ void jit_op_free(cpu_gen_t *cpu,jit_op_t *op) { assert(op->ob_size_index < JIT_OP_POOL_NR); op->next = cpu->jit_op_pool[op->ob_size_index]; cpu->jit_op_pool[op->ob_size_index] = op; } /* Free a list of JIT ops */ void jit_op_free_list(cpu_gen_t *cpu,jit_op_t *op_list) { jit_op_t *op,*opn; for(op=op_list;op;op=opn) { opn = op->next; jit_op_free(cpu,op); } } /* Initialize JIT op pools for the specified CPU */ int jit_op_init_cpu(cpu_gen_t *cpu) { cpu->jit_op_array = calloc(cpu->jit_op_array_size,sizeof(jit_op_t *)); if (!cpu->jit_op_array) return(-1); memset(cpu->jit_op_pool,0,sizeof(cpu->jit_op_pool)); return(0); } /* Free memory used by pools */ void jit_op_free_pools(cpu_gen_t *cpu) { jit_op_t *op,*opn; int i; for(i=0;ijit_op_pool[i];op;op=opn) { opn = op->next; free(op); } cpu->jit_op_pool[i] = NULL; } }