All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@us.ibm.com>
To: Avi Kivity <avi@qumranet.com>
Cc: linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 1/7] KVM: userspace interface
Date: Thu, 19 Oct 2006 13:46:31 -0500	[thread overview]
Message-ID: <4537C807.4@us.ibm.com> (raw)
In-Reply-To: <453781F9.3050703@qumranet.com>

Sorry if I missed this, but can you provide a link to the QEMU changes?

It's hard to tell what's going on without seeing the userspace portions 
of this.

My initial impression is that you've taken the Xen approach of trying to 
use QEMU only for IO emulation.  If this is the case, it won't work long 
term.  While you can use vm86 mode for 16 bit virtualization for most 
cases, it cannot handle big real mode.  You need the ability to transfer 
down to QEMU and allow it to do emulation.

Ideally, instead of having as large of an x86 emulator in kernel space, 
you would just drop down to QEMU to do emulation as needed (doing only a 
single basic block and returning).  This would let you have a much 
reduced partial emulator in kernel space that only did the most common 
(and performance critical) instructions.

Regards,

Anthony Liguori

Avi Kivity wrote:
> This patch defines a bunch of ioctl()s on /dev/kvm.  The ioctl()s allow
> adding
> memory to a virtual machine, adding a virtual cpu to a virtual machine (at
> most one at this time), transferring control to the virtual cpu, and
> querying
> about guest pages changed by the virtual machine.
>
> Signed-off-by: Yaniv Kamay <yaniv@qumranet.com>
> Signed-off-by: Avi Kivity <avi@qumranet.com>
>
> Index: linux-2.6/include/linux/kvm.h
> ===================================================================
> --- /dev/null
> +++ linux-2.6/include/linux/kvm.h
> @@ -0,0 +1,202 @@
> +#ifndef __LINUX_KVM_H
> +#define __LINUX_KVM_H
> +
> +/*
> + * Userspace interface for /dev/kvm - kernel based virtual machine
> + *
> + * Note: this interface is considered experimental and may change without
> + *       notice.
> + */
> +
> +#include <asm/types.h>
> +#include <linux/ioctl.h>
> +
> +#ifndef __user
> +#define __user
> +#endif
> +
> +/* for KVM_CREATE_MEMORY_REGION */
> +struct kvm_memory_region {
> +    __u32 slot;
> +    __u32 flags;
> +    __u64 guest_phys_addr;
> +    __u64 memory_size; /* bytes */
> +};
> +
> +/* for kvm_memory_region::flags */
> +#define KVM_MEM_LOG_DIRTY_PAGES  1UL
> +
> +
> +#define KVM_EXIT_TYPE_FAIL_ENTRY 1
> +#define KVM_EXIT_TYPE_VM_EXIT    2
> +
> +enum kvm_exit_reason {
> +    KVM_EXIT_UNKNOWN,
> +    KVM_EXIT_EXCEPTION,
> +    KVM_EXIT_IO,
> +    KVM_EXIT_CPUID,
> +    KVM_EXIT_DEBUG,
> +    KVM_EXIT_HLT,
> +    KVM_EXIT_MMIO,
> +};
> +
> +/* for KVM_RUN */
> +struct kvm_run {
> +    /* in */
> +    __u32 vcpu;
> +    __u32 emulated;  /* skip current instruction */
> +    __u32 mmio_completed; /* mmio request completed */
> +
> +    /* out */
> +    __u32 exit_type;
> +    __u32 exit_reason;
> +    __u32 instruction_length;
> +    union {
> +        /* KVM_EXIT_UNKNOWN */
> +        struct {
> +            __u32 hardware_exit_reason;
> +        } hw;
> +        /* KVM_EXIT_EXCEPTION */
> +        struct {
> +            __u32 exception;
> +            __u32 error_code;
> +        } ex;
> +        /* KVM_EXIT_IO */
> +        struct {
> +#define KVM_EXIT_IO_IN  0
> +#define KVM_EXIT_IO_OUT 1
> +            __u8 direction;
> +            __u8 size; /* bytes */
> +            __u8 string;
> +            __u8 string_down;
> +            __u8 rep;
> +            __u8 pad;
> +            __u16 port;
> +            __u64 count;
> +            union {
> +                __u64 address;
> +                __u32 value;
> +            };
> +        } io;
> +        struct {
> +        } debug;
> +        /* KVM_EXIT_MMIO */
> +        struct {
> +            __u64 phys_addr;
> +            __u8  data[8];
> +            __u32 len;
> +            __u8  is_write;
> +        } mmio;
> +    };
> +};
> +
> +/* for KVM_GET_REGS and KVM_SET_REGS */
> +struct kvm_regs {
> +    /* in */
> +    __u32 vcpu;
> +    __u32 padding;
> +
> +    /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
> +    __u64 rax, rbx, rcx, rdx;
> +    __u64 rsi, rdi, rsp, rbp;
> +    __u64 r8,  r9,  r10, r11;
> +    __u64 r12, r13, r14, r15;
> +    __u64 rip, rflags;
> +};
> +
> +struct kvm_segment {
> +    __u64 base;
> +    __u32 limit;
> +    __u16 selector;
> +    __u8  type;
> +    __u8  present, dpl, db, s, l, g, avl;
> +    __u8  unusable;
> +    __u8  padding;
> +};
> +
> +struct kvm_dtable {
> +    __u64 base;
> +    __u16 limit;
> +    __u16 padding[3];
> +};
> +
> +/* for KVM_GET_SREGS and KVM_SET_SREGS */
> +struct kvm_sregs {
> +    /* in */
> +    __u32 vcpu;
> +    __u32 padding;
> +
> +    /* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */
> +    struct kvm_segment cs, ds, es, fs, gs, ss;
> +    struct kvm_segment tr, ldt;
> +    struct kvm_dtable gdt, idt;
> +    __u64 cr0, cr2, cr3, cr4, cr8;
> +    __u64 efer;
> +    __u64 apic_base;
> +
> +    /* out (KVM_GET_SREGS) */
> +    __u32 pending_int;
> +    __u32 padding2;
> +};
> +
> +/* for KVM_TRANSLATE */
> +struct kvm_translation {
> +    /* in */
> +    __u64 linear_address;
> +    __u32 vcpu;
> +    __u32 padding;
> +
> +    /* out */
> +    __u64 physical_address;
> +    __u8  valid;
> +    __u8  writeable;
> +    __u8  usermode;
> +};
> +
> +/* for KVM_INTERRUPT */
> +struct kvm_interrupt {
> +    /* in */
> +    __u32 vcpu;
> +    __u32 irq;
> +};
> +
> +struct kvm_breakpoint {
> +    __u32 enabled;
> +    __u32 padding;
> +    __u64 address;
> +};
> +
> +/* for KVM_DEBUG_GUEST */
> +struct kvm_debug_guest {
> +    /* int */
> +    __u32 vcpu;
> +    __u32 enabled;
> +    struct kvm_breakpoint breakpoints[4];
> +    __u32 singlestep;
> +};
> +
> +/* for KVM_GET_DIRTY_LOG */
> +struct kvm_dirty_log {
> +    __u32 slot;
> +    __u32 padding;
> +    union {
> +        void __user *dirty_bitmap; /* one bit per page */
> +        __u64 padding;
> +    };
> +};
> +
> +#define KVMIO 0xAE
> +
> +#define KVM_RUN                   _IOWR(KVMIO, 2, struct kvm_run)
> +#define KVM_GET_REGS              _IOWR(KVMIO, 3, struct kvm_regs)
> +#define KVM_SET_REGS              _IOW(KVMIO, 4, struct kvm_regs)
> +#define KVM_GET_SREGS             _IOWR(KVMIO, 5, struct kvm_sregs)
> +#define KVM_SET_SREGS             _IOW(KVMIO, 6, struct kvm_sregs)
> +#define KVM_TRANSLATE             _IOWR(KVMIO, 7, struct kvm_translation)
> +#define KVM_INTERRUPT             _IOW(KVMIO, 8, struct kvm_interrupt)
> +#define KVM_DEBUG_GUEST           _IOW(KVMIO, 9, struct kvm_debug_guest)
> +#define KVM_SET_MEMORY_REGION     _IOW(KVMIO, 10, struct kvm_memory_region)
> +#define KVM_CREATE_VCPU           _IOW(KVMIO, 11, int /* vcpu_slot */)
> +#define KVM_GET_DIRTY_LOG         _IOW(KVMIO, 12, struct kvm_dirty_log)
> +
> +#endif
>
>   


  parent reply	other threads:[~2006-10-19 18:46 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-19 13:45 [PATCH 0/7] KVM: Kernel-based Virtual Machine Avi Kivity
2006-10-19 13:47 ` [PATCH 1/7] KVM: userspace interface Avi Kivity
2006-10-19 14:30   ` John Stoffel
2006-10-19 14:43     ` Avi Kivity
2006-10-19 23:26       ` Greg KH
2006-10-19 14:50     ` Alan Cox
2006-10-19 14:51       ` Avi Kivity
2006-10-19 15:25         ` John Stoffel
2006-10-19 18:49       ` Anthony Liguori
2006-10-19 19:10         ` Avi Kivity
2006-10-19 19:17           ` Anthony Liguori
2006-10-20  7:36             ` Avi Kivity
2006-10-20 15:33               ` Anthony Liguori
2006-10-22  8:10                 ` Avi Kivity
2006-10-19 20:36         ` Alan Cox
2006-10-19 18:46   ` Anthony Liguori [this message]
2006-10-19 19:04     ` Avi Kivity
2006-10-19 19:09       ` Anthony Liguori
2006-10-19 19:26         ` Avi Kivity
2006-10-19 19:31           ` Anthony Liguori
2006-10-19 22:15             ` Alan Cox
2006-10-20  7:42             ` Avi Kivity
2006-10-20 15:35               ` Anthony Liguori
2006-10-19 20:10       ` Andi Kleen
2006-10-19 20:14   ` Jan Engelhardt
2006-10-20  7:16     ` Avi Kivity
2006-10-21 15:50       ` Arnd Bergmann
2006-10-22  8:19         ` Avi Kivity
2006-10-21 13:37   ` Steven Rostedt
2006-10-22  8:14     ` Avi Kivity
2006-10-19 13:48 ` [PATCH 2/7] KVM: Intel virtual mode extensions definitions Avi Kivity
2006-10-19 20:19   ` Jan Engelhardt
2006-10-19 21:54     ` Alan Cox
2006-10-20  7:17     ` Avi Kivity
2006-10-21 13:48   ` Steven Rostedt
2006-10-22  8:17     ` Avi Kivity
2006-10-19 13:49 ` [PATCH 3/7] KVM: kvm data structures Avi Kivity
2006-10-19 13:53 ` [PATCH 5/7] KVM: mmu virtualization Avi Kivity
2006-10-19 20:26   ` Jan Engelhardt
2006-10-20  7:24     ` Avi Kivity
2006-10-19 13:54 ` [PATCH 6/7] KVM: x86 emulator Avi Kivity
2006-10-19 13:56 ` [PATCH 7/7] KVM: plumbing Avi Kivity
2006-10-19 13:58 ` [PATCH 0/7] KVM: Kernel-based Virtual Machine Avi Kivity
2006-10-19 16:05 ` Andi Kleen
2006-10-19 16:09   ` Avi Kivity
2006-10-19 19:02     ` Anthony Liguori
2006-10-19 19:14       ` Avi Kivity
2006-10-19 19:28         ` Anthony Liguori
2006-10-20  7:37           ` Avi Kivity
2006-10-19 17:31 ` Muli Ben-Yehuda
2006-10-19 18:00   ` Avi Kivity
2006-10-19 18:12     ` Randy Dunlap
2006-10-19 18:14       ` Avi Kivity
2006-10-19 18:30         ` Randy.Dunlap
2006-10-21 16:16     ` Arnd Bergmann
2006-10-22  8:37       ` Avi Kivity
2006-10-22 15:23         ` Arnd Bergmann
2006-10-22 16:18           ` Avi Kivity
2006-10-22 16:51             ` Arnd Bergmann
2006-10-22 17:01               ` Avi Kivity
2006-10-22 17:06                 ` Arnd Bergmann
2006-10-22 17:41                   ` Avi Kivity
2006-10-22 17:47                     ` Arnd Bergmann
2006-10-22 17:56                 ` Christoph Hellwig
2006-10-22 18:00                   ` Avi Kivity
2006-10-22 18:36                     ` Arnd Bergmann
2006-10-22 18:41                       ` Avi Kivity
2006-10-22 18:49                         ` Arnd Bergmann
2006-10-22 18:55                           ` Avi Kivity
2006-10-22 22:26                     ` Andi Kleen
2006-10-23 22:29                       ` Jeremy Fitzhardinge
2006-10-22 20:01                   ` Alan Cox
2006-10-22 20:45                   ` Roland Dreier
2006-10-23  0:29                   ` Anthony Liguori
2006-10-25 16:42                   ` Pavel Machek
2006-10-22 19:59               ` Alan Cox
2006-10-22 22:28                 ` Andi Kleen
2006-10-23  0:27                   ` Roland Dreier
2006-10-23  0:39                     ` Andi Kleen
2006-10-23  0:51                       ` Roland Dreier
2006-10-22 17:39         ` Anthony Liguori
2006-10-22 17:53           ` Arnd Bergmann
2006-10-22 19:56         ` Alan Cox
2006-10-23  7:42           ` Avi Kivity
2006-10-24 21:38       ` kvm_create() (was Re: [PATCH 0/7] KVM: Kernel-based Virtual Machine) Andy Isaacson
2006-10-19 18:55   ` [PATCH 0/7] KVM: Kernel-based Virtual Machine Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4537C807.4@us.ibm.com \
    --to=aliguori@us.ibm.com \
    --cc=avi@qumranet.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.