⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wakeup_prot.s

📁 xen虚拟机源代码安装包
💻 S
字号:
        .text#include <xen/config.h>#include <xen/multiboot.h>#include <public/xen.h>#include <asm/asm_defns.h>#include <asm/desc.h>#include <asm/page.h>#include <asm/msr.h>#if defined(__x86_64__)        .code64#define GREG(x)         %r##x#define SAVED_GREG(x)   saved_r##x(%rip)#define DECLARE_GREG(x) saved_r##x:     .quad   0#define SAVE_GREG(x)    movq GREG(x), SAVED_GREG(x)#define LOAD_GREG(x)    movq SAVED_GREG(x), GREG(x)#define REF(x)          x(%rip)#define RDMSR(ind, m)                   \        xorq    %rdx, %rdx;             \        mov     $ind, %ecx;             \        rdmsr;                          \        shlq    $0x20, %rdx;              \        orq     %rax, %rdx;             \        movq    %rdx, m(%rip);#define WRMSR(ind, m)                   \        mov     $ind, %ecx;             \        movq    m(%rip), %rdx;          \        mov     %edx, %eax;             \        shrq    $0x20, %rdx;              \        wrmsr;#else /* !defined(__x86_64__) */        .code32#define GREG(x)         %e##x#define SAVED_GREG(x)   saved_e##x#define DECLARE_GREG(x) saved_e##x:     .long   0#define SAVE_GREG(x)    movl GREG(x), SAVED_GREG(x)#define LOAD_GREG(x)    movl SAVED_GREG(x), GREG(x)#define REF(x)          x#endifENTRY(do_suspend_lowlevel)        SAVE_GREG(sp)        SAVE_GREG(ax)        SAVE_GREG(bx)        SAVE_GREG(cx)        SAVE_GREG(dx)        SAVE_GREG(bp)        SAVE_GREG(si)        SAVE_GREG(di)#if defined(__x86_64__)        SAVE_GREG(8)     # save r8...r15        SAVE_GREG(9)        SAVE_GREG(10)        SAVE_GREG(11)        SAVE_GREG(12)        SAVE_GREG(13)        SAVE_GREG(14)        SAVE_GREG(15)        pushfq;        popq    SAVED_GREG(flags)        mov     %cr8, GREG(ax)        mov     GREG(ax), REF(saved_cr8)        RDMSR(MSR_FS_BASE, saved_fs_base)        RDMSR(MSR_GS_BASE, saved_gs_base)        RDMSR(MSR_SHADOW_GS_BASE, saved_kernel_gs_base)#else /* !defined(__x86_64__) */        pushfl;        popl    SAVED_GREG(flags)#endif        mov     %ds, REF(saved_ds)        mov     %es, REF(saved_es)        mov     %fs, REF(saved_fs)        mov     %gs, REF(saved_gs)        mov     %ss, REF(saved_ss)        sgdt    REF(saved_gdt)        sidt    REF(saved_idt)        sldt    REF(saved_ldt)        mov     %cr0, GREG(ax)        mov     GREG(ax), REF(saved_cr0)        mov     %cr3, GREG(ax)        mov     GREG(ax), REF(saved_cr3)        call    save_rest_processor_state#if defined(__x86_64__)        mov     $3, %rdi        xor     %eax, %eax#else /* !defined(__x86_64__) */        push    $3#endif        /* enter sleep state physically */        call    acpi_enter_sleep_state        jmp     __ret_point        .align  16        .globl  __ret_point__ret_point:        /* mmu_cr4_features contains latest cr4 setting */        mov     REF(mmu_cr4_features), GREG(ax)        mov     GREG(ax), %cr4        mov     REF(saved_cr3), GREG(ax)        mov     GREG(ax), %cr3        mov     REF(saved_cr0), GREG(ax)        mov     GREG(ax), %cr0        lgdt    REF(saved_gdt)        lidt    REF(saved_idt)        lldt    REF(saved_ldt)        mov     REF(saved_ss), %ss        LOAD_GREG(sp)#if defined(__x86_64__)        mov     REF(saved_cr8), %rax        mov     %rax, %cr8        pushq   SAVED_GREG(flags)        popfq        /* Idle vcpu doesn't need segment selectors reload, since         * those may contain stale value from other domains and          * reload may result page fault due to no matched gdt entry         */        mov     $(STACK_SIZE - 8), %rax        or      %rsp, %rax        and     $~7, %rax        mov     (%rax), %rax        mov     0x10(%rax), %rax        cmpw    $0x7fff, (%rax)        je      1f        /* These selectors are from guest, and thus need reload */        mov     REF(saved_ds), %ds        mov     REF(saved_es), %es        mov     REF(saved_fs), %fs        /* gs load is special */        mov     REF(saved_gs), %rsi        mov     $3, %rdi        # SEGBASE_GS_USER_SEL        call    do_set_segment_base1:        # MSR restore        WRMSR(MSR_FS_BASE, saved_fs_base)        WRMSR(MSR_GS_BASE, saved_gs_base)        WRMSR(MSR_SHADOW_GS_BASE, saved_kernel_gs_base)#else /* !defined(__x86_64__) */        pushl   SAVED_GREG(flags)        popfl        /* No reload to fs/gs, which is saved in bottom stack already */        mov     REF(saved_ds), %ds        mov     REF(saved_es), %es#endif        call restore_rest_processor_state        LOAD_GREG(bp)        LOAD_GREG(ax)        LOAD_GREG(bx)        LOAD_GREG(cx)        LOAD_GREG(dx)        LOAD_GREG(si)        LOAD_GREG(di)#if defined(__x86_64__)        LOAD_GREG(8)     # save r8...r15        LOAD_GREG(9)        LOAD_GREG(10)        LOAD_GREG(11)        LOAD_GREG(12)        LOAD_GREG(13)        LOAD_GREG(14)        LOAD_GREG(15)#endif        ret .data        .align 16saved_ds:        .word   0saved_es:        .word   0saved_ss:        .word   0saved_gs:        .word   0saved_fs:        .word   0        .align 4        .globl   saved_magicsaved_magic:     .long   0x9abcdef0        .align 8DECLARE_GREG(sp)DECLARE_GREG(bp)DECLARE_GREG(ax)DECLARE_GREG(bx)DECLARE_GREG(cx)DECLARE_GREG(dx)DECLARE_GREG(si)DECLARE_GREG(di)DECLARE_GREG(flags)#if defined(__x86_64__)DECLARE_GREG(8)DECLARE_GREG(9)DECLARE_GREG(10)DECLARE_GREG(11)DECLARE_GREG(12)DECLARE_GREG(13)DECLARE_GREG(14)DECLARE_GREG(15)saved_gdt:      .quad   0,0saved_idt:      .quad   0,0saved_ldt:      .quad   0,0saved_cr0:      .quad   0saved_cr3:      .quad   0saved_cr8:      .quad   0saved_gs_base:  .quad   0saved_fs_base:  .quad   0saved_kernel_gs_base:   .quad   0#else /* !defined(__x86_64__) */saved_gdt:      .long   0,0saved_idt:      .long   0,0saved_ldt:      .long   0saved_cr0:      .long   0saved_cr3:      .long   0#endif 

⌨️ 快捷键说明

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