10 #define SVM_ERROR .dword 0xffffffff
11 #define SVM_SUCCESS .dword 0x00000000
13 #define vmrun .byte 0x0f,0x01,0xd8
14 #define vmload .byte 0x0F,0x01,0xDA
15 #define vmsave .byte 0x0F,0x01,0xDB
16 #define stgi .byte 0x0F,0x01,0xDC
17 #define clgi .byte 0x0F,0x01,0xDD
20 #define SVM_VM_HSAVE_PA_MSR .dword 0xc0010117
25 // Note that RAX is saved in the VMCB, so we don't touch it here
27 #define Save_SVM_Registers(location) \
29 movl location, %eax; \
32 movl %ebp, 16(%eax); \
34 movl %ebx, 32(%eax); \
35 movl %edx, 40(%eax); \
36 movl %ecx, 48(%eax); \
40 #define Restore_SVM_Registers(location) \
42 movl location, %eax; \
45 movl 16(%eax), %ebp; \
46 movl 32(%eax), %ebx; \
47 movl 40(%eax), %edx; \
48 movl 48(%eax), %ecx; \
52 // 32 bit GCC passes arguments via stack
66 Restore_SVM_Registers(8(%esp));
73 Save_SVM_Registers(4(%esp));
90 // Note that RAX is saved in the VMCB, so we don't touch it here
92 #define Save_SVM_Registers(location) \
94 movq location, %rax; \
97 movq %rbp, 16(%rax); \
99 movq %rbx, 32(%rax); \
100 movq %rdx, 40(%rax); \
101 movq %rcx, 48(%rax); \
103 movq %r8, 64(%rax); \
104 movq %r9, 72(%rax); \
105 movq %r10, 80(%rax); \
106 movq %r11, 88(%rax); \
107 movq %r12, 96(%rax); \
108 movq %r13, 104(%rax); \
109 movq %r14, 112(%rax); \
110 movq %r15, 120(%rax); \
114 #define Restore_SVM_Registers(location) \
116 mov location, %rax; \
119 mov 16(%rax), %rbp; \
120 mov 32(%rax), %rbx; \
121 mov 40(%rax), %rdx; \
122 mov 48(%rax), %rcx; \
126 mov 80(%rax), %r10; \
127 mov 88(%rax), %r11; \
128 mov 96(%rax), %r12; \
129 mov 104(%rax), %r13; \
130 mov 112(%rax), %r14; \
131 mov 120(%rax), %r15; \
163 // Note that this is only for 64 bit GCC, 32 bit GCC passes via stack
179 Restore_SVM_Registers(%rsi);
187 Save_SVM_Registers(8(%rsp));