3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; $Id$
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;; @file
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; CPU Instruction Decoding & Execution Tests - Ring-3 Driver Application, Assembly Code.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; Copyright (C) 2009-2014 Oracle Corporation
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; available from http://www.virtualbox.org. This file is free software;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; you can redistribute it and/or modify it under the terms of the GNU
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; General Public License (GPL) as published by the Free Software
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; The contents of this file may alternatively be used under the terms
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; of the Common Development and Distribution License Version 1.0
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; VirtualBox OSE distribution, in which case the provisions of the
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; CDDL are applicable instead of those of the GPL.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; You may elect to license modified versions of this file under the
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; terms and conditions of either the GPL or the CDDL or both.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;*******************************************************************************
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;* Header Files *
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;*******************************************************************************
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%include "iprt/asmdefs.mac"
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%include "iprt/x86.mac"
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%include "cidet.mac"
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;*******************************************************************************
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;* Global Variables *
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;*******************************************************************************
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%ifdef RT_ARCH_X86
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;; Used by CidetAppSaveAndRestoreCtx when we have a tricky target stack.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncg_uTargetEip dd 0
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncg_uTargetCs dw 0
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%endif
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync;;
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync; Leave GS alone on 64-bit darwin (gs is 0, no ldt or gdt entry to load that'll
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync; restore the lower 32-bits of the base when saving and restoring the register).
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync%ifdef RT_OS_DARWIN
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync %ifdef RT_ARCH_AMD64
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync %define CIDET_LEAVE_GS_ALONE
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync %endif
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync%endif
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsyncBEGINCODE
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; ASSUMES that it's called and the EIP/RIP is found on the stack.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; @param pSaveCtx ds:xCX The context to save; DS, xDX and xCX have
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; already been saved by the caller.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; @param pRestoreCtx ds:xDX The context to restore.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncBEGINPROC CidetAppSaveAndRestoreCtx
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; Save the stack pointer and program counter first so we can later
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; bypass this step if we need to.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xAX * 8], xAX ; need scratch register.
694eb5fb2b25736d37902333e059a149f78c563cvboxsync lea xAX, [xSP + xCB]
694eb5fb2b25736d37902333e059a149f78c563cvboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xSP * 8], xAX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov word [xCX + CIDETCPUCTX.aSRegs + X86_SREG_SS * 2], ss
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov word [xCX + CIDETCPUCTX.aSRegs + X86_SREG_CS * 2], cs
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xAX, [xSP]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.rip], xAX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync jmp CidetAppSaveAndRestoreCtx_1
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncGLOBALNAME CidetAppSaveAndRestoreCtx_NoSsSpCsIp
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xAX * 8], xAX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncCidetAppSaveAndRestoreCtx_1:
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; Flags.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%ifdef RT_ARCH_AMD64
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync pushfq
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%else
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync pushfd
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%endif
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync pop xAX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.rfl], xAX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; Segment registers.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov word [xCX + CIDETCPUCTX.aSRegs + X86_SREG_ES * 2], es
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov word [xCX + CIDETCPUCTX.aSRegs + X86_SREG_FS * 2], fs
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov word [xCX + CIDETCPUCTX.aSRegs + X86_SREG_GS * 2], gs
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; Remaining GPRs.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xBX * 8], xBX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xBP * 8], xBP
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xSI * 8], xSI
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xDI * 8], xDI
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%ifdef RT_ARCH_AMD64
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x8 * 8], r8
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x9 * 8], r9
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x10 * 8], r10
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x11 * 8], r11
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x12 * 8], r12
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x13 * 8], r13
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x14 * 8], r14
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x15 * 8], r15
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync xor eax, eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr2], rax
fdf66bdf7b03d58ec33dbc065f2d28e1f7d4986avboxsync %ifndef CIDET_REDUCED_CTX
fdf66bdf7b03d58ec33dbc065f2d28e1f7d4986avboxsync mov [xCX + CIDETCPUCTX.cr0], rax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr3], rax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr4], rax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr8], rax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr0], rax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr1], rax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr2], rax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr3], rax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr6], rax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr7], rax
fdf66bdf7b03d58ec33dbc065f2d28e1f7d4986avboxsync mov [xCX + CIDETCPUCTX.tr], ax
fdf66bdf7b03d58ec33dbc065f2d28e1f7d4986avboxsync mov [xCX + CIDETCPUCTX.ldtr], ax
fdf66bdf7b03d58ec33dbc065f2d28e1f7d4986avboxsync %endif
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%else
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync xor eax, eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.rfl + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.rip + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xAX * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xCX * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xDX * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xBX * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xSP * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xBP * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xSI * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xDI * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x8 * 8 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x8 * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x9 * 8 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x9 * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x10 * 8 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x10 * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x11 * 8 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x11 * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x12 * 8 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x12 * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x13 * 8 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x13 * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x14 * 8 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x14 * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x15 * 8 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_x15 * 8 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr2 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr2 + 4], eax
fdf66bdf7b03d58ec33dbc065f2d28e1f7d4986avboxsync %ifndef CIDET_REDUCED_CTX
fdf66bdf7b03d58ec33dbc065f2d28e1f7d4986avboxsync mov [xCX + CIDETCPUCTX.cr0 ], eax
fdf66bdf7b03d58ec33dbc065f2d28e1f7d4986avboxsync mov [xCX + CIDETCPUCTX.cr0 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr3 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr3 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr4 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr4 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr8 ], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.cr8 + 4], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr0 ], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr0 + 4], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr1 ], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr1 + 4], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr2 ], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr2 + 4], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr3 ], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr3 + 4], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr6 ], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr6 + 4], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr7 ], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.dr7 + 4], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.tr], ax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.ldtr], ax
fdf66bdf7b03d58ec33dbc065f2d28e1f7d4986avboxsync %endif
fdf66bdf7b03d58ec33dbc065f2d28e1f7d4986avboxsync%endif
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync dec xAX
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.uErr], xAX
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync%ifdef RT_ARCH_X86
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.uErr + 4], eax
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync%endif
305cd720ec3a20d3d646c145cb301cb6c1a385e8vboxsync mov [xCX + CIDETCPUCTX.uXcpt], eax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ;
694eb5fb2b25736d37902333e059a149f78c563cvboxsync ; Restore the other state (pointer in xDX).
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncNAME(CidetAppSaveAndRestoreCtx_Restore):
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; Restore ES, FS, and GS.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov es, [xDX + CIDETCPUCTX.aSRegs + X86_SREG_ES * 2]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov fs, [xDX + CIDETCPUCTX.aSRegs + X86_SREG_FS * 2]
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync%ifndef CIDET_LEAVE_GS_ALONE
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov gs, [xDX + CIDETCPUCTX.aSRegs + X86_SREG_GS * 2]
7d10e144d68530a79fffc0d1a44ff4e9b7b181c5vboxsync%endif
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; Restore most GPRs (except xCX, xAX and xSP).
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xCX, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xCX * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xBX, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xBX * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xBP, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xBP * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xSI, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xSI * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xDI, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xDI * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%ifdef RT_ARCH_AMD64
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov r8, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_x8 * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov r9, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_x9 * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov r10, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_x10 * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov r11, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_x11 * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov r12, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_x12 * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov r13, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_x13 * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov r14, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_x14 * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov r15, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_x15 * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%endif
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%ifdef RT_ARCH_AMD64
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; Create an iret frame which restores SS:RSP, RFLAGS, and CS:RIP.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync movzx eax, word [xDX + CIDETCPUCTX.aSRegs + X86_SREG_SS * 2]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync push xAX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync push qword [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xSP * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync push qword [xDX + CIDETCPUCTX.rfl]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync movzx eax, word [xDX + CIDETCPUCTX.aSRegs + X86_SREG_CS * 2]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync push xAX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync push qword [xDX + CIDETCPUCTX.rip]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; Restore DS, xAX and xDX then do the iret.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov ds, [xDX + CIDETCPUCTX.aSRegs + X86_SREG_DS * 2]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xAX, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xAX * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xDX, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xDX * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync iretq
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%else
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; In 32-bit mode iret doesn't restore CS:ESP for us, so we have to
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync ; make a choice whether the SS:ESP is more important than EFLAGS.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync cmp byte [xDX + CIDETCPUCTX.fTrickyStack], 0
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync jne .tricky_stack
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov ss, [xDX + CIDETCPUCTX.aSRegs + X86_SREG_SS * 2]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xSP, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xSP * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync push dword [xDX + CIDETCPUCTX.rfl] ; iret frame
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync movzx eax, word [xDX + CIDETCPUCTX.aSRegs + X86_SREG_CS * 2] ; iret frame
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync push xAX ; iret frame
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync push dword [xDX + CIDETCPUCTX.rip] ; iret frame
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xAX, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xAX * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov ds, [xDX + CIDETCPUCTX.aSRegs + X86_SREG_DS * 2]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xDX, [cs:xDX + CIDETCPUCTX.aGRegs + X86_GREG_xDX * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync iretd
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync.tricky_stack:
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xAX, [xDX + CIDETCPUCTX.rip]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [g_uTargetEip], xAX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov ax, [xDX + CIDETCPUCTX.aSRegs + X86_SREG_CS * 2]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [g_uTargetCs], ax
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync push dword [xDX + CIDETCPUCTX.rfl]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync popfd
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov ss, [xDX + CIDETCPUCTX.aSRegs + X86_SREG_SS * 2]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xSP, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xSP * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xAX, [xDX + CIDETCPUCTX.aGRegs + X86_GREG_xAX * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov ds, [xDX + CIDETCPUCTX.aSRegs + X86_SREG_DS * 2]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov xDX, [cs:xDX + CIDETCPUCTX.aGRegs + X86_GREG_xDX * 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync jmp far [cs:g_uTargetEip]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%endif
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncENDPROC CidetAppSaveAndRestoreCtx
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; C callable version of CidetAppSaveAndRestoreCtx more or less.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; @param pSaveCtx x86:esp+4 gcc:rdi msc:rcx
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; @param pRestoreCtx x86:esp+8 gcc:rsi msc:rdx
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncBEGINPROC CidetAppExecute
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%ifdef RT_ARCH_X86
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov ecx, [esp + 4]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov edx, [esp + 8]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%elifdef ASM_CALL64_GCC
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov rcx, rdi
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov rdx, rsi
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%elifndef ASM_CALL64_MSC
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync %error "unsupport arch."
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%endif
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov word [xCX + CIDETCPUCTX.aSRegs + X86_SREG_DS * 2], ds
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xDX * 8], xDX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov [xCX + CIDETCPUCTX.aGRegs + X86_GREG_xCX * 8], xCX
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync jmp NAME(CidetAppSaveAndRestoreCtx)
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncENDPROC CidetAppExecute
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; C callable restore function.
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync;
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync; @param pRestoreCtx x86:esp+4 gcc:rdi msc:rcx
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncBEGINPROC CidetAppRestoreCtx
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%ifdef RT_ARCH_X86
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov edx, [esp + 4]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%elifdef ASM_CALL64_GCC
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov rdx, rdi
694eb5fb2b25736d37902333e059a149f78c563cvboxsync%elifdef ASM_CALL64_MSC
694eb5fb2b25736d37902333e059a149f78c563cvboxsync mov rdx, rcx
694eb5fb2b25736d37902333e059a149f78c563cvboxsync%else
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync %error "unsupport arch."
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync%endif
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync mov ds, [cs:xDX + CIDETCPUCTX.aSRegs + X86_SREG_DS * 2]
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync jmp NAME(CidetAppSaveAndRestoreCtx_Restore)
3bc264992af3416ecba168e6ffae1a334fe79088vboxsyncENDPROC CidetAppRestoreCtx
3bc264992af3416ecba168e6ffae1a334fe79088vboxsync