/[dynamips]/trunk/mips64_jit.h
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/mips64_jit.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

upstream/dynamips-0.2.7-RC1/mips64_jit.h revision 7 by dpavlin, Sat Oct 6 16:23:47 2007 UTC upstream/dynamips-0.2.7-RC2/mips64_jit.h revision 8 by dpavlin, Sat Oct 6 16:24:54 2007 UTC
# Line 9  Line 9 
9  #define __MIPS64_JIT_H__  #define __MIPS64_JIT_H__
10    
11  #include "utils.h"  #include "utils.h"
12    #include "sbox.h"
13    
14  /* Size of executable page area (in Mb) */  /* Size of executable page area (in Mb) */
15  #ifndef __CYGWIN__  #ifndef __CYGWIN__
# Line 23  Line 24 
24  /* Maximum number of X86 chunks */  /* Maximum number of X86 chunks */
25  #define MIPS_JIT_MAX_CHUNKS  32  #define MIPS_JIT_MAX_CHUNKS  32
26    
27    /* Size of hash for PC lookup */
28    #define MIPS_JIT_PC_HASH_BITS   16
29    #define MIPS_JIT_PC_HASH_MASK   ((1 << MIPS_JIT_PC_HASH_BITS) - 1)
30    #define MIPS_JIT_PC_HASH_SIZE   (1 << MIPS_JIT_PC_HASH_BITS)
31    
32  /* Instruction jump patch */  /* Instruction jump patch */
33  struct mips64_insn_patch {  struct mips64_insn_patch {
34     u_char *jit_insn;     u_char *jit_insn;
# Line 43  struct mips64_jit_tcb { Line 49  struct mips64_jit_tcb {
49     m_uint64_t start_pc;     m_uint64_t start_pc;
50     u_char **jit_insn_ptr;     u_char **jit_insn_ptr;
51     m_uint64_t acc_count;     m_uint64_t acc_count;
    m_uint32_t phys_page;  
52     mips_insn_t *mips_code;     mips_insn_t *mips_code;
53     u_int mips_trans_pos;     u_int mips_trans_pos;
54     u_int jit_chunk_pos;     u_int jit_chunk_pos;
# Line 76  struct mips64_insn_jump { Line 81  struct mips64_insn_jump {
81  static forced_inline  static forced_inline
82  u_char *mips64_jit_tcb_get_host_ptr(mips64_jit_tcb_t *b,m_uint64_t vaddr)  u_char *mips64_jit_tcb_get_host_ptr(mips64_jit_tcb_t *b,m_uint64_t vaddr)
83  {  {
84     m_uint64_t offset;     m_uint32_t offset;
85    
86     offset = (vaddr - b->start_pc) >> 2;     offset = ((m_uint32_t)vaddr & MIPS_MIN_PAGE_IMASK) >> 2;
87     return(b->jit_insn_ptr[offset]);     return(b->jit_insn_ptr[offset]);
88  }  }
89    
90    /* Check if the specified address belongs to the specified block */
91    static forced_inline
92    int mips64_jit_tcb_local_addr(mips64_jit_tcb_t *block,m_uint64_t vaddr,
93                                  u_char **jit_addr)
94    {
95       if ((vaddr & MIPS_MIN_PAGE_MASK) == block->start_pc) {
96          *jit_addr = mips64_jit_tcb_get_host_ptr(block,vaddr);
97          return(1);
98       }
99    
100       return(0);
101    }
102    
103    /* Check if PC register matches the compiled block virtual address */
104    static forced_inline
105    int mips64_jit_tcb_match(cpu_mips_t *cpu,mips64_jit_tcb_t *block)
106    {
107       m_uint64_t vpage;
108    
109       vpage = cpu->pc & ~(m_uint64_t)MIPS_MIN_PAGE_IMASK;
110       return(block->start_pc == vpage);
111    }
112    
113    /* Compute the hash index for the specified PC value */
114    static forced_inline m_uint32_t mips64_jit_get_pc_hash(m_uint64_t pc)
115    {
116       m_uint32_t page_hash;
117    
118       page_hash = sbox_u32(pc >> MIPS_MIN_PAGE_SHIFT);
119       return((page_hash ^ (page_hash >> 12)) & MIPS_JIT_PC_HASH_MASK);
120    }
121    
122  /* Check if there are pending IRQ */  /* Check if there are pending IRQ */
123  extern void mips64_check_pending_irq(mips64_jit_tcb_t *b);  extern void mips64_check_pending_irq(mips64_jit_tcb_t *b);
124    
# Line 97  u_int mips64_jit_flush(cpu_mips_t *cpu,u Line 134  u_int mips64_jit_flush(cpu_mips_t *cpu,u
134  /* Shutdown the JIT */  /* Shutdown the JIT */
135  void mips64_jit_shutdown(cpu_mips_t *cpu);  void mips64_jit_shutdown(cpu_mips_t *cpu);
136    
137    /* Check if an instruction is in a delay slot or not */
138    int mips64_jit_is_delay_slot(mips64_jit_tcb_t *b,m_uint64_t pc);
139    
140  /* Fetch a MIPS instruction and emit corresponding x86 translated code */  /* Fetch a MIPS instruction and emit corresponding x86 translated code */
141  struct mips64_insn_tag *mips64_jit_fetch_and_emit(cpu_mips_t *cpu,  struct mips64_insn_tag *mips64_jit_fetch_and_emit(cpu_mips_t *cpu,
142                                                    mips64_jit_tcb_t *block,                                                    mips64_jit_tcb_t *block,
# Line 110  int mips64_jit_tcb_record_patch(mips64_j Line 150  int mips64_jit_tcb_record_patch(mips64_j
150  void mips64_jit_tcb_free(cpu_mips_t *cpu,mips64_jit_tcb_t *block,  void mips64_jit_tcb_free(cpu_mips_t *cpu,mips64_jit_tcb_t *block,
151                           int list_removal);                           int list_removal);
152    
 /* Check if the specified address belongs to the specified block */  
 int mips64_jit_tcb_local_addr(mips64_jit_tcb_t *block,m_uint64_t vaddr,  
                               u_char **haddr);  
   
153  /* Execute compiled MIPS code */  /* Execute compiled MIPS code */
154  void *mips64_jit_run_cpu(cpu_gen_t *cpu);  void *mips64_jit_run_cpu(cpu_gen_t *cpu);
155    

Legend:
Removed from v.7  
changed lines
  Added in v.8

  ViewVC Help
Powered by ViewVC 1.1.26