Annotation of cf/ppc32_amd64_trans.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Cisco router simulation platform.
                      3:  * Copyright (c) 2005,2006 Christophe Fillot ([email protected])
                      4:  */
                      5: 
                      6: #ifndef __PPC32_AMD64_TRANS_H__
                      7: #define __PPC32_AMD64_TRANS_H__
                      8: 
                      9: #include "utils.h"
                     10: #include "amd64-codegen.h"
                     11: #include "cpu.h"
                     12: #include "dynamips.h"
                     13: #include "ppc32_exec.h"
                     14: 
                     15: #define JIT_SUPPORT 1
                     16: 
                     17: /* Manipulate bitmasks atomically */
                     18: static forced_inline void atomic_or(m_uint32_t *v,m_uint32_t m)
                     19: {
                     20:    __asm__ __volatile__("lock; orl %1,%0":"=m"(*v):"ir"(m),"m"(*v));
                     21: }
                     22: 
                     23: static forced_inline void atomic_and(m_uint32_t *v,m_uint32_t m)
                     24: {
                     25:    __asm__ __volatile__("lock; andl %1,%0":"=m"(*v):"ir"(m),"m"(*v));
                     26: }
                     27: 
                     28: /* Wrappers to amd64-codegen functions */
                     29: #define ppc32_jit_tcb_set_patch amd64_patch
                     30: #define ppc32_jit_tcb_set_jump  amd64_jump_code
                     31: 
                     32: /* PPC instruction array */
                     33: extern struct ppc32_insn_tag ppc32_insn_tags[];
                     34: 
                     35: /* Push epilog for an x86 instruction block */
                     36: static forced_inline void ppc32_jit_tcb_push_epilog(ppc32_jit_tcb_t *block)
                     37: {
                     38:    amd64_ret(block->jit_ptr);
                     39: }
                     40: 
                     41: /* Execute JIT code */
                     42: static forced_inline
                     43: void ppc32_jit_tcb_exec(cpu_ppc_t *cpu,ppc32_jit_tcb_t *block)
                     44: {
                     45:    insn_tblock_fptr jit_code;
                     46:    m_uint32_t offset;
                     47: 
                     48:    offset = (cpu->ia & PPC32_MIN_PAGE_IMASK) >> 2;
                     49:    jit_code = (insn_tblock_fptr)block->jit_insn_ptr[offset];
                     50: 
                     51: #if 0
                     52:    if (unlikely(!jit_code)) {
                     53:       ppc32_exec_single_step(cpu,vmtoh32(block->ppc_code[offset]));
                     54:       return;
                     55:    }
                     56: #endif
                     57: 
                     58:    asm volatile ("movq %0,%%r15"::"r"(cpu):
                     59:                  "r14","r15","rax","rbx","rcx","rdx","rdi","rsi");
                     60:    jit_code();
                     61: }
                     62: 
                     63: static inline void amd64_patch(u_char *code,u_char *target)
                     64: {
                     65:    /* Skip REX */
                     66:    if ((code[0] >= 0x40) && (code[0] <= 0x4f))
                     67:       code += 1;
                     68: 
                     69:    if ((code [0] & 0xf8) == 0xb8) {
                     70:       /* amd64_set_reg_template */
                     71:       *(m_uint64_t *)(code + 1) = (m_uint64_t)target;
                     72:    }
                     73:    else if (code [0] == 0x8b) {
                     74:       /* mov 0(%rip), %dreg */
                     75:       *(m_uint32_t *)(code + 2) = (m_uint32_t)(m_uint64_t)target - 7;
                     76:    }
                     77:    else if ((code [0] == 0xff) && (code [1] == 0x15)) {
                     78:       /* call *<OFFSET>(%rip) */
                     79:       *(m_uint32_t *)(code + 2) = ((m_uint32_t)(m_uint64_t)target) - 7;
                     80:    }
                     81:    else
                     82:       x86_patch(code,target);
                     83: }
                     84: 
                     85: /* Set the Instruction Address (IA) register */
                     86: void ppc32_set_ia(ppc32_jit_tcb_t *b,m_uint32_t new_ia);
                     87: 
                     88: /* Set the Link Register (LR) */
                     89: void ppc32_set_lr(ppc32_jit_tcb_t *b,m_uint32_t new_lr);
                     90: 
                     91: /* Increment the number of executed instructions (performance debugging) */
                     92: void ppc32_inc_perf_counter(ppc32_jit_tcb_t *b);
                     93: 
                     94: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.