1/*- 2 * Copyright (c) 2011 NetApp, Inc. 3 * Copyright (c) 2013 Neel Natu <neel@freebsd.org> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 10 unchanged lines hidden (view full) --- 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * |
27 * $FreeBSD: stable/10/sys/amd64/vmm/intel/vmx_support.S 266339 2014-05-17 19:11:08Z jhb $ |
28 */ 29 30#include <machine/asmacros.h> 31 32#include "vmx_assym.s" 33 34#ifdef SMP 35#define LK lock ; --- 56 unchanged lines hidden (view full) --- 92 movq VMXCTX_HOST_RSP(%rdi), %rsp; \ 93 movq VMXCTX_HOST_RBX(%rdi), %rbx; \ 94 movq VMXCTX_HOST_RIP(%rdi), tmpreg; \ 95 movq tmpreg, (%rsp) /* return address */ 96 97/* 98 * vmx_enter_guest(struct vmxctx *vmxctx, int launched) 99 * %rdi: pointer to the 'vmxctx' |
100 * %rsi: pointer to the 'vmx' 101 * %edx: launch state of the VMCS |
102 * Interrupts must be disabled on entry. 103 */ 104ENTRY(vmx_enter_guest) 105 /* 106 * Save host state before doing anything else. 107 */ 108 VMX_HOST_SAVE(%r10) 109 110 /* 111 * Activate guest pmap on this cpu. 112 */ 113 movq VMXCTX_PMAP(%rdi), %r11 114 movl PCPU(CPUID), %eax 115 LK btsl %eax, PM_ACTIVE(%r11) 116 117 /* |
118 * If 'vmx->eptgen[curcpu]' is not identical to 'pmap->pm_eptgen' |
119 * then we must invalidate all mappings associated with this EPTP. 120 */ 121 movq PM_EPTGEN(%r11), %r10 |
122 cmpq %r10, VMX_EPTGEN(%rsi, %rax, 8) |
123 je guest_restore 124 |
125 /* Refresh 'vmx->eptgen[curcpu]' */ 126 movq %r10, VMX_EPTGEN(%rsi, %rax, 8) |
127 128 /* Setup the invept descriptor on the host stack */ 129 mov %rsp, %r11 |
130 movq VMX_EPTP(%rsi), %rax |
131 movq %rax, -16(%r11) 132 movq $0x0, -8(%r11) 133 mov $0x1, %eax /* Single context invalidate */ 134 invept -16(%r11), %rax 135 jbe invept_error /* Check invept instruction error */ 136 137guest_restore: |
138 cmpl $0, %edx |
139 je do_launch 140 141 VMX_GUEST_RESTORE 142 vmresume 143 /* 144 * In the common case 'vmresume' returns back to the host through 145 * 'vmx_exit_guest' with %rsp pointing to 'vmxctx'. 146 * --- 83 unchanged lines hidden (view full) --- 230 231 /* 232 * This will return to the caller of 'vmx_enter_guest()' with a return 233 * value of VMX_GUEST_VMEXIT. 234 */ 235 movl $VMX_GUEST_VMEXIT, %eax 236 ret 237END(vmx_exit_guest) |
238 239/* 240 * %rdi = interrupt handler entry point 241 * 242 * Calling sequence described in the "Instruction Set Reference" for the "INT" 243 * instruction in Intel SDM, Vol 2. 244 */ 245ENTRY(vmx_call_isr) 246 mov %rsp, %r11 /* save %rsp */ 247 and $~0xf, %rsp /* align on 16-byte boundary */ 248 pushq $KERNEL_SS /* %ss */ 249 pushq %r11 /* %rsp */ 250 pushfq /* %rflags */ 251 pushq $KERNEL_CS /* %cs */ 252 cli /* disable interrupts */ 253 callq *%rdi /* push %rip and call isr */ 254 ret 255END(vmx_call_isr) |