Annotation of cf/x86_asm.S, revision 1.1

1.1     ! root        1: /* 
        !             2:  * Cisco 7200 Simulator.
        !             3:  * X86 Assembly-optimized routines.
        !             4:  *
        !             5:  * Copyright (c) 2006 Christophe Fillot ([email protected])
        !             6:  */
        !             7: 
        !             8: #define DYNAMIPS_ASM
        !             9:        
        !            10: #include "asmdefs.h"
        !            11: #include "memory.h"
        !            12: 
        !            13: #if defined(CYGWIN) || defined(__APPLE__)
        !            14: #define _P(f) _##f
        !            15: #else
        !            16: #define _P(f) f
        !            17: #endif
        !            18:        
        !            19: /*
        !            20:  * Increment the count register. When value in compare register is hit,
        !            21:  * trigger the timer interrupt.
        !            22:  */
        !            23: .globl _P(mips64_inc_cp0_cnt_asm)
        !            24: _P(mips64_inc_cp0_cnt_asm):
        !            25:        movl    CP0_VCNT_OFS(%edi), %ecx
        !            26:        incl    %ecx
        !            27:        movl    %ecx, CP0_VCNT_OFS(%edi)
        !            28:        cmpl    %ecx, CP0_VCMP_OFS(%edi)
        !            29:        jne     1f
        !            30:        movl    %edi, %eax
        !            31:        call    _P(mips64_trigger_timer_irq)
        !            32: 1:
        !            33:        ret
        !            34: 
        !            35: /* 
        !            36:  * MTS32 Load Word (LW) fast version.
        !            37:  *
        !            38:  * Inputs:
        !            39:  *   %edi      : cpu instance
        !            40:  *   %ebx      : target register
        !            41:  *   %edx      : virtual address (%ecx is high 32-bit word)
        !            42:  */
        !            43: .globl _P(mts32_lw_asm)
        !            44: _P(mts32_lw_asm):
        !            45:        pushl   %esi
        !            46:        movl    $((1 << (MTS32_LEVEL2_BITS + MTS32_OFFSET_BITS)) - 1), %ecx
        !            47:        
        !            48:        /* compute L1 pos */
        !            49:        movl    %edx, %eax
        !            50:        shr     $(MTS32_LEVEL2_BITS + MTS32_OFFSET_BITS), %eax
        !            51:        movl    MTS_L1_OFS(%edi), %esi
        !            52:        movl    (%esi,%eax,4), %esi
        !            53:        
        !            54:        /* %esi = L1 entry */
        !            55:        movl    %esi, %eax
        !            56:        andl    $MTS_ACC_MASK, %eax
        !            57:        jnz     mts32_lw_asm_spec_acc
        !            58: 
        !            59:        /* L2 entry chained ? */
        !            60:        movl    %esi, %eax
        !            61:        andl    $MTS_CHAIN_MASK, %eax
        !            62:        jz      1f
        !            63: 
        !            64:        /* load L2 entry */
        !            65:        andl    $0xfffffff0, %esi
        !            66:        movl    %edx, %eax
        !            67:        shr     $MTS32_OFFSET_BITS, %eax
        !            68:        andl    $((1 << MTS32_LEVEL2_BITS) - 1), %eax
        !            69:        movl    $((1 << MTS32_OFFSET_BITS) - 1), %ecx
        !            70:        movl    (%esi,%eax,4), %esi
        !            71: 
        !            72:        /* %esi = L2 entry */
        !            73:        movl    %esi, %eax
        !            74:        andl    $MTS_ACC_MASK, %eax
        !            75:        jnz     mts32_lw_asm_spec_acc
        !            76:        
        !            77: 1:
        !            78:        /* device access ? */
        !            79:        movl    %esi, %eax
        !            80:        andl    $MTS_DEV_MASK, %eax
        !            81:        jnz     mts32_lw_asm_dev_acc
        !            82: 
        !            83:        /* raw memory access */
        !            84:        andl    $0xfffffff0, %esi
        !            85:        andl    %edx, %ecx
        !            86:        addl    %ecx, %esi
        !            87: 
        !            88: mts32_lw_asm_load_val:
        !            89:        /* %esi = host address */
        !            90:        movl    (%esi), %eax
        !            91:        bswap   %eax
        !            92:        cdq
        !            93: 
        !            94:        /* %edx:%eax = sign-extended value */
        !            95:        lea     CPU_GPR_OFS(%edi,%ebx,8), %esi
        !            96:        movl    %eax, (%esi)
        !            97:        movl    %edx, 4(%esi)
        !            98:                
        !            99:        popl    %esi
        !           100:        xorl    %eax, %eax
        !           101:        ret
        !           102: 
        !           103: mts32_lw_asm_dev_acc:
        !           104:        subl    $8, %esp
        !           105:        movl    %esp, %eax
        !           106: 
        !           107:        pushl   %eax       /* data */
        !           108:        pushl   $MTS_READ  /* op_type = read */
        !           109:        pushl   $4         /* op_size = 4 bytes */
        !           110:        
        !           111:        /* %esi = entry, %ecx = shift, %edx = vaddr */
        !           112:        movl    %esi, %eax
        !           113:        andl    $MTS_DEVID_MASK, %eax
        !           114:        shr     $MTS_DEVID_SHIFT, %eax
        !           115:        andl    %ecx, %edx
        !           116:        andl    $MTS_DEVOFF_MASK, %esi
        !           117:        addl    %edx, %esi
        !           118:        
        !           119:        pushl   %esi       /* haddr */
        !           120:        pushl   %eax       /* dev_id */
        !           121:        pushl   %edi       /* cpu */
        !           122: 
        !           123:        /* call device access routine */        
        !           124:        call    _P(dev_access)
        !           125:        addl    $32, %esp
        !           126: 
        !           127:        /* %eax = haddr if raw access */
        !           128:        movl    %eax, %esi
        !           129:        testl   %esi ,%esi
        !           130:        jnz     mts32_lw_asm_load_val
        !           131: 
        !           132:        movl    -8(%esp), %eax
        !           133:        cdq
        !           134:        lea     CPU_GPR_OFS(%edi,%ebx,8), %esi
        !           135:        movl    %eax, (%esi)
        !           136:        movl    %edx, 4(%esi)
        !           137:        
        !           138:        popl    %esi
        !           139:        xorl    %eax, %eax
        !           140:        ret
        !           141:        
        !           142: mts32_lw_asm_spec_acc:
        !           143:        /* %eax = mask */
        !           144:        subl    $12, %esp
        !           145:        movl    %esp, %ecx
        !           146: 
        !           147:        movl    $0, (%esp)      /* clear exception */
        !           148:        
        !           149:        pushl   %ecx            /* exception */
        !           150:        addl    $4, %ecx
        !           151:        pushl   %ecx            /* data */
        !           152: 
        !           153:        pushl   $4              /* op_size = 4 */
        !           154:        pushl   $MTS_READ       /* op_type = read */
        !           155:        pushl   $MIPS_MEMOP_LW  /* op_code = LW */
        !           156:        pushl   %eax            /* mask */
        !           157:        
        !           158:        pushl   %edx            /* vaddr(lo) */
        !           159:        movl    %edx, %eax
        !           160:        cdq
        !           161:        pushl   %edx            /* vaddr(hi) */
        !           162:        pushl   %edi            /* cpu */
        !           163:        call    _P(mts_access_special)
        !           164:        addl    $((9*4)+12), %esp
        !           165: 
        !           166:        /* exception ? */
        !           167:        movl    -12(%esp), %eax
        !           168:        testl   %eax, %eax
        !           169:        jnz     mts32_lw_asm_end
        !           170:        
        !           171:        /* save data */
        !           172:        movl    -8(%esp), %eax
        !           173:        cdq
        !           174:        lea     CPU_GPR_OFS(%edi,%ebx,8), %esi
        !           175:        movl    %eax, (%esi)
        !           176:        movl    %edx, 4(%esi)
        !           177:        xorl    %eax, %eax
        !           178: mts32_lw_asm_end:      
        !           179:        popl    %esi
        !           180:        ret
        !           181: 
        !           182: /* 
        !           183:  * MTS64 Load Word (LW) fast version.
        !           184:  *
        !           185:  * Inputs:
        !           186:  *   %edi      : cpu instance
        !           187:  *   %ebx      : target register
        !           188:  *   %ecx:edx  : virtual address
        !           189:  */
        !           190: .globl _P(mts64_lw_asm)
        !           191: _P(mts64_lw_asm):
        !           192:        /* Load entry from MTS64 cache */
        !           193:        movl    %edx, %eax
        !           194:        shr     $MTS64_HASH_SHIFT, %edx
        !           195:        andl    $MTS64_HASH_MASK, %edx
        !           196:        lea     CPU_MTS64_CACHE_OFS(%edi,%edx,4), %esi
        !           197: 
        !           198:        /* %esi = entry pointer */
        !           199:        test    %esi, %esi
        !           200:        jz      mts64_lw_slow_lookup
        !           201: 
        !           202:        /* Load entry start address in %eax */
        !           203:        lea     (MTS64_ENTRY_START_OFS+4)(%esi), %eax
        !           204:        
        !           205:        ret
        !           206:        
        !           207: mts64_lw_device_access:                
        !           208:        ret
        !           209:        
        !           210: mts64_lw_slow_lookup:
        !           211:        
        !           212:        ret

unix.superglobalmegacorp.com

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