在hvm中如何使用Xen中已注册的超级调用呢?
1、当guest VM为Windows 32位时:
编写一个驱动模块,然后里面调用如下汇编代码:
_asm{
push eax
push ebx
mov eax,number //超级调用号,如39
mov ebx,para1 //参数依次为ebx,ecx,edx....
_emit 0x0f //VMCALL
_emit 0x01
_emit 0xc1
pop ebx
pop eax
}
2、当guest VM为Linux 时:
编写一个驱动模块,然后里面调用如下宏,根据参数的个数分别使用不同的宏。
#define __hypercall1(a1)\
({ \
int ret; \
asm volatile( \
"vmcall\n\t" \
:"=a"(ret) \
:"a"(a1) \
:); \
(int)ret; \
})
#define __hypercall2(a1,a2)\
({ \
int ret; \
asm volatile( \
"vmcall\n\t" \
:"=a"(ret) \
:"a"(a1),"D"(a2) \
:); \
(int)ret; \
})
#define __hypercall3(a1,a2,a3)\
({ \
int ret; \
asm volatile( \
"vmcall\n\t" \
:"=a"(ret) \
:"a"(a1),"D"(a2),"S"(a3) \
:); \
(int)ret; \
})