⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mips64_jit.h

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 H
字号:
/* * Cisco router simulation platform. * Copyright (c) 2005,2006 Christophe Fillot (cf@utc.fr) * * MIPS64 JIT compiler. */#ifndef __MIPS64_JIT_H__#define __MIPS64_JIT_H__#include "utils.h"#include "sbox.h"/* Size of executable page area (in Mb) */#ifndef __CYGWIN__#define MIPS_EXEC_AREA_SIZE  64#else#define MIPS_EXEC_AREA_SIZE  16#endif/* Buffer size for JIT code generation */#define MIPS_JIT_BUFSIZE     32768/* Maximum number of X86 chunks */#define MIPS_JIT_MAX_CHUNKS  32/* Size of hash for PC lookup */#define MIPS_JIT_PC_HASH_BITS   16#define MIPS_JIT_PC_HASH_MASK   ((1 << MIPS_JIT_PC_HASH_BITS) - 1)#define MIPS_JIT_PC_HASH_SIZE   (1 << MIPS_JIT_PC_HASH_BITS)/* Instruction jump patch */struct mips64_insn_patch {   u_char *jit_insn;   m_uint64_t mips_pc;};/* Instruction patch table */#define MIPS64_INSN_PATCH_TABLE_SIZE  32struct mips64_jit_patch_table {   struct mips64_insn_patch patches[MIPS64_INSN_PATCH_TABLE_SIZE];   u_int cur_patch;   struct mips64_jit_patch_table *next;};/* MIPS64 translated code block */struct mips64_jit_tcb {   m_uint64_t start_pc;   u_char **jit_insn_ptr;   m_uint64_t acc_count;   mips_insn_t *mips_code;   u_int mips_trans_pos;   u_int jit_chunk_pos;   u_char *jit_ptr;   insn_exec_page_t *jit_buffer;   insn_exec_page_t *jit_chunks[MIPS_JIT_MAX_CHUNKS];   struct mips64_jit_patch_table *patch_table;   mips64_jit_tcb_t *prev,*next;#if DEBUG_BLOCK_TIMESTAMP   m_uint64_t tm_first_use,tm_last_use;#endif};/* MIPS instruction recognition */struct mips64_insn_tag {   int (*emit)(cpu_mips_t *cpu,mips64_jit_tcb_t *,mips_insn_t);   m_uint32_t mask,value;   int delay_slot;};/* MIPS jump instruction (for block scan) */struct mips64_insn_jump {   char *name;   m_uint32_t mask,value;   int offset_bits;   int relative;};/* Get the JIT instruction pointer in a translated block */static forced_inline u_char *mips64_jit_tcb_get_host_ptr(mips64_jit_tcb_t *b,m_uint64_t vaddr){   m_uint32_t offset;   offset = ((m_uint32_t)vaddr & MIPS_MIN_PAGE_IMASK) >> 2;   return(b->jit_insn_ptr[offset]);}/* Check if the specified address belongs to the specified block */static forced_inline int mips64_jit_tcb_local_addr(mips64_jit_tcb_t *block,m_uint64_t vaddr,                              u_char **jit_addr){   if ((vaddr & MIPS_MIN_PAGE_MASK) == block->start_pc) {      *jit_addr = mips64_jit_tcb_get_host_ptr(block,vaddr);      return(1);   }   return(0);}/* Check if PC register matches the compiled block virtual address */static forced_inline int mips64_jit_tcb_match(cpu_mips_t *cpu,mips64_jit_tcb_t *block){   m_uint64_t vpage;   vpage = cpu->pc & ~(m_uint64_t)MIPS_MIN_PAGE_IMASK;   return(block->start_pc == vpage);}/* Compute the hash index for the specified PC value */static forced_inline m_uint32_t mips64_jit_get_pc_hash(m_uint64_t pc){   m_uint32_t page_hash;   page_hash = sbox_u32(pc >> MIPS_MIN_PAGE_SHIFT);   return((page_hash ^ (page_hash >> 12)) & MIPS_JIT_PC_HASH_MASK);}/* Check if there are pending IRQ */extern void mips64_check_pending_irq(mips64_jit_tcb_t *b);/* Initialize instruction lookup table */void mips64_jit_create_ilt(void);/* Initialize the JIT structure */int mips64_jit_init(cpu_mips_t *cpu);/* Flush the JIT */u_int mips64_jit_flush(cpu_mips_t *cpu,u_int threshold);/* Shutdown the JIT */void mips64_jit_shutdown(cpu_mips_t *cpu);/* Check if an instruction is in a delay slot or not */int mips64_jit_is_delay_slot(mips64_jit_tcb_t *b,m_uint64_t pc);/* Fetch a MIPS instruction and emit corresponding x86 translated code */struct mips64_insn_tag *mips64_jit_fetch_and_emit(cpu_mips_t *cpu,                                                  mips64_jit_tcb_t *block,                                                  int delay_slot);/* Record a patch to apply in a compiled block */int mips64_jit_tcb_record_patch(mips64_jit_tcb_t *block,u_char *x86_ptr,                                m_uint64_t vaddr);/* Free an instruction block */void mips64_jit_tcb_free(cpu_mips_t *cpu,mips64_jit_tcb_t *block,                         int list_removal);/* Execute compiled MIPS code */void *mips64_jit_run_cpu(cpu_gen_t *cpu);/* Set the Pointer Counter (PC) register */void mips64_set_pc(mips64_jit_tcb_t *b,m_uint64_t new_pc);/* Set the Return Address (RA) register */void mips64_set_ra(mips64_jit_tcb_t *b,m_uint64_t ret_pc);/* Single-step operation */void mips64_emit_single_step(mips64_jit_tcb_t *b,mips_insn_t insn);/* Virtual Breakpoint */void mips64_emit_breakpoint(mips64_jit_tcb_t *b);/* Emit unhandled instruction code */int mips64_emit_invalid_delay_slot(mips64_jit_tcb_t *b);/*  * Increment count register and trigger the timer IRQ if value in compare  * register is the same. */void mips64_inc_cp0_count_reg(mips64_jit_tcb_t *b);/* Increment the number of executed instructions (performance debugging) */void mips64_inc_perf_counter(mips64_jit_tcb_t *b);#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -