Tôi hiện đang cố gắng xây dựng một trình ảo hóa nhỏ và kernel bằng kvm và tôi đấu tranh để có được các siêu văn bản với nhiều đối số hoạt động chính xác.
Đây là những gì tôi đã thử:
// guest.c
#define KVM_HYPERCALL vmcall
// #define KVM_HYPERCALL vmmcall
// #define KVM_HYPERCALL ".byte 0x0f,0x01,0xd9"
// #define KVM_HYPERCALL .byte 0x0f,0x01,0xc1"
static inline long kvm_hypercall4(int nr, unsigned long p1,
unsigned long p2, unsigned long p3,
unsigned long p4) {
long ret;
asm volatile(KVM_HYPERCALL
: "=a"(ret)
: "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4)
: "memory");
return ret;
}
Bất kỳ Hypercalls nào cũng dẫn đến vcpu->kvm_run->exit_reason
bằng 6, điều này làm tôi ngạc nhiên KVM_EXIT_MMIO
thay vìKVM_EXIT_HYPERCALL
switch (vcpu->kvm_run->exit_reason) {
case KVM_EXIT_MMIO:
printf("syscall: %lld\n", vcpu->kvm_run->hypercall.nr); // prints 0
printf("arg 1: %lld\n", vcpu->kvm_run->hypercall.args[1]); // prints 0
printf("arg 2: %lld\n", vcpu->kvm_run->hypercall.args[2]); // prints 0
printf("arg 3: %lld\n", vcpu->kvm_run->hypercall.args[3]); // prints 0
if(ioctl(vcpu->fd, KVM_GET_REGS, ®s)<0) exit 1;
printf("rax: %lld\n", regs.rax); // prints 0
printf("rbx: %lld\n", regs.rbx); // prints 0
printf("rcx: %lld\n", regs.rcx); // prints 0
Ngoài lý do thoát là KVM_EXIT_MMIO
tại sao các reg không được đặt? Cách đúng để kích hoạt KVM_EXIT_HYPERCALL với nhiều đối số là gì?
Cảm ơn trước
EDIT: Trong trường hợp có vấn đề: Tôi đang sử dụng intel i7 cpu thế hệ thứ 9 đang chạy debian với kernel linux 5.4