VirtualBox

Changeset 15420 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Dec 13, 2008 7:21:55 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
40869
Message:

EMAll: ADD, ADC and SUB - the first is used a bit by windows.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/EMAll.cpp

    r15419 r15420  
    29392939        &&  CPUMIsGuestIn64BitCode(pVM, pRegFrame))
    29402940    {
    2941         if (    pCpu->pCurInstr->opcode != OP_STOSWD
    2942             &&  pCpu->pCurInstr->opcode != OP_MOV
    2943             &&  pCpu->pCurInstr->opcode != OP_CMPXCHG8B
    2944             &&  pCpu->pCurInstr->opcode != OP_XCHG
     2941        uint32_t uOpCode = pCpu->pCurInstr->opcode;
     2942        if (    uOpCode != OP_STOSWD
     2943            &&  uOpCode != OP_MOV
     2944            &&  uOpCode != OP_CMPXCHG8B
     2945            &&  uOpCode != OP_XCHG
    29452946# ifdef VBOX_WITH_HYBRID_32BIT_KERNEL_IN_R0
    2946             &&  pCpu->pCurInstr->opcode != OP_CMPXCHG /* solaris */
    2947             &&  pCpu->pCurInstr->opcode != OP_AND     /* windows */
    2948             &&  pCpu->pCurInstr->opcode != OP_OR      /* windows */
    2949             &&  pCpu->pCurInstr->opcode != OP_XOR
     2947            &&  uOpCode != OP_CMPXCHG /* solaris */
     2948            &&  uOpCode != OP_AND     /* windows */
     2949            &&  uOpCode != OP_OR      /* windows */
     2950            &&  uOpCode != OP_XOR     /* because we can */
     2951            &&  uOpCode != OP_ADD     /* windows (dripple) */
     2952            &&  uOpCode != OP_ADC     /* because we can */
     2953            &&  uOpCode != OP_SUB     /* because we can */
     2954            /** @todo OP_BTS or is that a different kind of failure? */
    29502955# endif
    29512956            )
  • trunk/src/VBox/VMM/VMMAll/EMAllA.asm

    r15418 r15420  
    627627
    628628    ; switch on size
    629 %ifdef RT_ARCH_AMD64
     629%ifdef CAN_DO_8_BYTE_OP
    630630    cmp     al, 8
    631631    je short .do_qword                  ; 8 bytes variant
     
    662662    pop     MY_RET_REG
    663663    retn
     664
     665%ifdef VBOX_WITH_HYBRID_32BIT_KERNEL_IN_R0
     666.do_qword:
     667    db      0xea                        ; jmp far .sixtyfourbit_mode
     668    dd      .sixtyfourbit_mode, NAME(SUPR0Abs64bitKernelCS)
     669BITS 64
     670.sixtyfourbit_mode:
     671    and     esp, 0ffffffffh
     672    and     MY_PTR_REG, 0ffffffffh
     673    mov     rdx, qword [rsp + 08h]      ; rdx = second parameter
     674    add     [MY_PTR_REG64], rdx         ; do 8 bytes ADD
     675    jmp far [.fpret wrt rip]
     676.fpret:                                 ; 16:32 Pointer to .done.
     677    dd      .done, NAME(SUPR0AbsKernelCS)
     678BITS 32
     679%endif ; VBOX_WITH_HYBRID_32BIT_KERNEL_IN_R0
    664680ENDPROC     EMEmulateAdd
    665681
     
    692708
    693709    ; switch on size
    694 %ifdef RT_ARCH_AMD64
     710%ifdef CAN_DO_8_BYTE_OP
    695711    cmp     al, 8
    696712    je short .do_qword                  ; 8 bytes variant
     
    731747    pop     MY_RET_REG
    732748    retn
     749
     750%ifdef VBOX_WITH_HYBRID_32BIT_KERNEL_IN_R0
     751.do_qword:
     752    db      0xea                        ; jmp far .sixtyfourbit_mode
     753    dd      .sixtyfourbit_mode, NAME(SUPR0Abs64bitKernelCS)
     754BITS 64
     755.sixtyfourbit_mode:
     756    and     esp, 0ffffffffh
     757    and     MY_PTR_REG, 0ffffffffh
     758    mov     rdx, qword [rsp + 08h]      ; rdx = second parameter
     759    stc     ; set carry flag
     760    adc     [MY_PTR_REG64], rdx         ; do 8 bytes ADC
     761    jmp far [.fpret wrt rip]
     762.fpret:                                 ; 16:32 Pointer to .done.
     763    dd      .done, NAME(SUPR0AbsKernelCS)
     764BITS 32
     765%endif ; VBOX_WITH_HYBRID_32BIT_KERNEL_IN_R0
    733766ENDPROC     EMEmulateAdcWithCarrySet
    734767
     
    761794
    762795    ; switch on size
    763 %ifdef RT_ARCH_AMD64
     796%ifdef CAN_DO_8_BYTE_OP
    764797    cmp     al, 8
    765798    je short .do_qword                  ; 8 bytes variant
     
    796829    pop     MY_RET_REG
    797830    retn
     831
     832%ifdef VBOX_WITH_HYBRID_32BIT_KERNEL_IN_R0
     833.do_qword:
     834    db      0xea                        ; jmp far .sixtyfourbit_mode
     835    dd      .sixtyfourbit_mode, NAME(SUPR0Abs64bitKernelCS)
     836BITS 64
     837.sixtyfourbit_mode:
     838    and     esp, 0ffffffffh
     839    and     MY_PTR_REG, 0ffffffffh
     840    mov     rdx, qword [rsp + 08h]      ; rdx = second parameter
     841    sub     [MY_PTR_REG64], rdx         ; do 8 bytes SUB
     842    jmp far [.fpret wrt rip]
     843.fpret:                                 ; 16:32 Pointer to .done.
     844    dd      .done, NAME(SUPR0AbsKernelCS)
     845BITS 32
     846%endif ; VBOX_WITH_HYBRID_32BIT_KERNEL_IN_R0
    798847ENDPROC     EMEmulateSub
    799848
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette