/*
* entry.S: VMX architecture-specific entry/exit handling.
* Copyright (c) 2004, Intel Corporation.
* Copyright (c) 2008, Citrix Systems, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; If not, see .
*/
.file "vmx/entry.S"
#include
#include
#include
#include
#include
#include
#include
#define VMRESUME .byte 0x0f,0x01,0xc3
#define VMLAUNCH .byte 0x0f,0x01,0xc2
ENTRY(vmx_asm_vmexit_handler)
push %rdi
push %rsi
push %rdx
push %rcx
push %rax
mov %cr2,%rax
push %r8
push %r9
push %r10
push %r11
push %rbx
GET_CURRENT(bx)
push %rbp
push %r12
push %r13
push %r14
push %r15
movb $1,VCPU_vmx_launched(%rbx)
mov %rax,VCPU_hvm_guest_cr2(%rbx)
mov %rsp,%rdi
call vmx_vmexit_handler
.Lvmx_do_vmentry:
call vmx_intr_assist
call nvmx_switch_guest
ASSERT_NOT_IN_ATOMIC
mov VCPU_processor(%rbx),%eax
lea irq_stat+IRQSTAT_softirq_pending(%rip),%rdx
xor %ecx,%ecx
shl $IRQSTAT_shift,%eax
cli
cmp %ecx,(%rdx,%rax,1)
jnz .Lvmx_process_softirqs
cmp %cl,VCPU_vmx_emulate(%rbx)
jne .Lvmx_goto_emulator
cmp %cl,VCPU_vmx_realmode(%rbx)
UNLIKELY_START(ne, realmode)
cmp %cx,VCPU_vm86_seg_mask(%rbx)
jnz .Lvmx_goto_emulator
mov %rsp,%rdi
call vmx_enter_realmode
UNLIKELY_END(realmode)
mov %rsp,%rdi
call vmx_vmenter_helper
test %al, %al
jz .Lvmx_vmentry_restart
mov VCPU_hvm_guest_cr2(%rbx),%rax
pop %r15
pop %r14
pop %r13
pop %r12
pop %rbp
mov %rax,%cr2
cmpb $0,VCPU_vmx_launched(%rbx)
pop %rbx
pop %r11
pop %r10
pop %r9
pop %r8
pop %rax
pop %rcx
pop %rdx
pop %rsi
pop %rdi
je .Lvmx_launch
/*.Lvmx_resume:*/
VMRESUME
jmp .Lvmx_vmentry_fail
.Lvmx_launch:
VMLAUNCH
.Lvmx_vmentry_fail:
sti
SAVE_ALL
call vmx_vmentry_failure
BUG /* vmx_vmentry_failure() shouldn't return. */
ENTRY(vmx_asm_do_vmentry)
GET_CURRENT(bx)
jmp .Lvmx_do_vmentry
.Lvmx_vmentry_restart:
sti
jmp .Lvmx_do_vmentry
.Lvmx_goto_emulator:
sti
mov %rsp,%rdi
call vmx_realmode
jmp .Lvmx_do_vmentry
.Lvmx_process_softirqs:
sti
call do_softirq
jmp .Lvmx_do_vmentry