entry.s

来自「xen虚拟机源代码安装包」· S 代码 · 共 179 行

S
179
字号
/* * entry.S: SVM architecture-specific entry/exit handling. * Copyright (c) 2005-2007, Advanced Micro Devices, Inc. * 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, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307 USA. */#include <xen/config.h>#include <xen/errno.h>#include <xen/softirq.h>#include <asm/types.h>#include <asm/asm_defns.h>#include <asm/apicdef.h>#include <asm/page.h>#include <public/xen.h>#define VMRUN  .byte 0x0F,0x01,0xD8#define STGI   .byte 0x0F,0x01,0xDC#define CLGI   .byte 0x0F,0x01,0xDD#define get_current(reg)                        \        mov $STACK_SIZE-BYTES_PER_LONG, r(reg); \        or  r(sp), r(reg);                      \        and $~(BYTES_PER_LONG-1),r(reg);        \        mov (r(reg)),r(reg);#if defined(__x86_64__)#define r(reg) %r##reg#define addr_of(lbl) lbl(%rip)#define call_with_regs(fn)                      \        mov  %rsp,%rdi;                         \        call fn;#else /* defined(__i386__) */#define r(reg) %e##reg#define addr_of(lbl) lbl#define UREGS_rax UREGS_eax#define UREGS_rip UREGS_eip#define UREGS_rsp UREGS_esp#define call_with_regs(fn)                      \        mov  %esp,%eax;                         \        push %eax;                              \        call fn;                                \        add  $4,%esp;#endifENTRY(svm_asm_do_resume)        get_current(bx)        CLGI        mov  VCPU_processor(r(bx)),%eax        shl  $IRQSTAT_shift,r(ax)        lea  addr_of(irq_stat),r(dx)        testl $~0,(r(dx),r(ax),1)        jnz  .Lsvm_process_softirqs        call svm_asid_handle_vmrun        call svm_intr_assist        cmpb $0,addr_of(tb_init_done)        jnz  .Lsvm_trace.Lsvm_trace_done:        mov  VCPU_svm_vmcb(r(bx)),r(cx)        mov  UREGS_rax(r(sp)),r(ax)        mov  r(ax),VMCB_rax(r(cx))        mov  UREGS_rip(r(sp)),r(ax)        mov  r(ax),VMCB_rip(r(cx))        mov  UREGS_rsp(r(sp)),r(ax)        mov  r(ax),VMCB_rsp(r(cx))        mov  UREGS_eflags(r(sp)),r(ax)        mov  r(ax),VMCB_rflags(r(cx))        mov  VCPU_svm_vmcb_pa(r(bx)),r(ax)#if defined(__x86_64__)        pop  %r15        pop  %r14        pop  %r13        pop  %r12        pop  %rbp        pop  %rbx        pop  %r11        pop  %r10        pop  %r9        pop  %r8        add  $8,%rsp /* Skip %rax: restored by VMRUN. */        pop  %rcx        pop  %rdx        pop  %rsi        pop  %rdi#else /* defined(__i386__) */        pop  %ebx        pop  %ecx        pop  %edx        pop  %esi        pop  %edi        pop  %ebp#endif        VMRUN#if defined(__x86_64__)        push %rdi        push %rsi        push %rdx        push %rcx        push %rax        push %r8        push %r9        push %r10        push %r11        push %rbx        push %rbp        push %r12        push %r13        push %r14        push %r15#else /* defined(__i386__) */        push %ebp        push %edi        push %esi        push %edx        push %ecx        push %ebx#endif        get_current(bx)        movb $0,VCPU_svm_vmcb_in_sync(r(bx))        mov  VCPU_svm_vmcb(r(bx)),r(cx)        mov  VMCB_rax(r(cx)),r(ax)        mov  r(ax),UREGS_rax(r(sp))        mov  VMCB_rip(r(cx)),r(ax)        mov  r(ax),UREGS_rip(r(sp))        mov  VMCB_rsp(r(cx)),r(ax)        mov  r(ax),UREGS_rsp(r(sp))        mov  VMCB_rflags(r(cx)),r(ax)        mov  r(ax),UREGS_eflags(r(sp))#ifndef NDEBUG        mov  $0xbeef,%ax        mov  %ax,UREGS_error_code(r(sp))        mov  %ax,UREGS_entry_vector(r(sp))        mov  %ax,UREGS_saved_upcall_mask(r(sp))        mov  %ax,UREGS_cs(r(sp))        mov  %ax,UREGS_ds(r(sp))        mov  %ax,UREGS_es(r(sp))        mov  %ax,UREGS_fs(r(sp))        mov  %ax,UREGS_gs(r(sp))        mov  %ax,UREGS_ss(r(sp))#endif        STGI.globl svm_stgi_labelsvm_stgi_label:        call_with_regs(svm_vmexit_handler)        jmp  svm_asm_do_resume.Lsvm_process_softirqs:        STGI        call do_softirq        jmp  svm_asm_do_resume.Lsvm_trace:        call svm_trace_vmentry        jmp  .Lsvm_trace_done

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?