[PATCH 2/4] KVM: Add kvm_io_ext_data to IO handler

2011-03-01 Thread Sheng Yang
Add a new parameter to IO writing handler, so that we can transfer information
from IO handler to caller.

Signed-off-by: Sheng Yang 
---
 arch/x86/kvm/i8254.c  |6 --
 arch/x86/kvm/i8259.c  |3 ++-
 arch/x86/kvm/lapic.c  |3 ++-
 arch/x86/kvm/x86.c|   13 -
 include/linux/kvm_host.h  |9 +++--
 virt/kvm/coalesced_mmio.c |3 ++-
 virt/kvm/eventfd.c|2 +-
 virt/kvm/ioapic.c |2 +-
 virt/kvm/iodev.h  |6 --
 virt/kvm/kvm_main.c   |4 ++--
 10 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
index efad723..bd8f0c5 100644
--- a/arch/x86/kvm/i8254.c
+++ b/arch/x86/kvm/i8254.c
@@ -439,7 +439,8 @@ static inline int pit_in_range(gpa_t addr)
 }
 
 static int pit_ioport_write(struct kvm_io_device *this,
-   gpa_t addr, int len, const void *data)
+   gpa_t addr, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_pit *pit = dev_to_pit(this);
struct kvm_kpit_state *pit_state = &pit->pit_state;
@@ -585,7 +586,8 @@ static int pit_ioport_read(struct kvm_io_device *this,
 }
 
 static int speaker_ioport_write(struct kvm_io_device *this,
-   gpa_t addr, int len, const void *data)
+   gpa_t addr, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_pit *pit = speaker_to_pit(this);
struct kvm_kpit_state *pit_state = &pit->pit_state;
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
index 3cece05..96b1070 100644
--- a/arch/x86/kvm/i8259.c
+++ b/arch/x86/kvm/i8259.c
@@ -480,7 +480,8 @@ static inline struct kvm_pic *to_pic(struct kvm_io_device 
*dev)
 }
 
 static int picdev_write(struct kvm_io_device *this,
-gpa_t addr, int len, const void *val)
+gpa_t addr, int len, const void *val,
+struct kvm_io_ext_data *ext_data)
 {
struct kvm_pic *s = to_pic(this);
unsigned char data = *(unsigned char *)val;
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 93cf9d0..f413e9c 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -836,7 +836,8 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, 
u32 val)
 }
 
 static int apic_mmio_write(struct kvm_io_device *this,
-   gpa_t address, int len, const void *data)
+   gpa_t address, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_lapic *apic = to_lapic(this);
unsigned int offset = address - apic->base_address;
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index fa708c9..21b84e2 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3571,13 +3571,14 @@ static void kvm_init_msr_list(void)
 }
 
 static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len,
-  const void *v)
+  const void *v, struct kvm_io_ext_data *ext_data)
 {
if (vcpu->arch.apic &&
-   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v))
+   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v, ext_data))
return 0;
 
-   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, addr, len, v);
+   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS,
+   addr, len, v, ext_data);
 }
 
 static int vcpu_mmio_read(struct kvm_vcpu *vcpu, gpa_t addr, int len, void *v)
@@ -3807,6 +3808,7 @@ static int emulator_write_emulated_onepage(unsigned long 
addr,
   struct kvm_vcpu *vcpu)
 {
gpa_t gpa;
+   struct kvm_io_ext_data ext_data;
 
gpa = kvm_mmu_gva_to_gpa_write(vcpu, addr, exception);
 
@@ -3825,7 +3827,7 @@ mmio:
/*
 * Is this MMIO handled locally?
 */
-   if (!vcpu_mmio_write(vcpu, gpa, bytes, val))
+   if (!vcpu_mmio_write(vcpu, gpa, bytes, val, &ext_data))
return X86EMUL_CONTINUE;
 
vcpu->mmio_needed = 1;
@@ -3940,6 +3942,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
 {
/* TODO: String I/O for in kernel device */
int r;
+   struct kvm_io_ext_data ext_data;
 
if (vcpu->arch.pio.in)
r = kvm_io_bus_read(vcpu->kvm, KVM_PIO_BUS, vcpu->arch.pio.port,
@@ -3947,7 +3950,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
else
r = kvm_io_bus_write(vcpu->kvm, KVM_PIO_BUS,
 vcpu->arch.pio.port, vcpu->arch.pio.size,
-pd);
+pd, &ext_data);
return r;
 }
 
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 7d313e0..a32c53e 100644
-

[PATCH 2/4] KVM: Add kvm_io_ext_data to IO handler

2011-02-27 Thread Sheng Yang
Add a new parameter to IO writing handler, so that we can transfer information
from IO handler to caller.

Signed-off-by: Sheng Yang 
---
 arch/x86/kvm/i8254.c  |6 --
 arch/x86/kvm/i8259.c  |3 ++-
 arch/x86/kvm/lapic.c  |3 ++-
 arch/x86/kvm/x86.c|   13 -
 include/linux/kvm_host.h  |9 +++--
 virt/kvm/coalesced_mmio.c |3 ++-
 virt/kvm/eventfd.c|2 +-
 virt/kvm/ioapic.c |2 +-
 virt/kvm/iodev.h  |6 --
 virt/kvm/kvm_main.c   |4 ++--
 10 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
index efad723..bd8f0c5 100644
--- a/arch/x86/kvm/i8254.c
+++ b/arch/x86/kvm/i8254.c
@@ -439,7 +439,8 @@ static inline int pit_in_range(gpa_t addr)
 }
 
 static int pit_ioport_write(struct kvm_io_device *this,
-   gpa_t addr, int len, const void *data)
+   gpa_t addr, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_pit *pit = dev_to_pit(this);
struct kvm_kpit_state *pit_state = &pit->pit_state;
@@ -585,7 +586,8 @@ static int pit_ioport_read(struct kvm_io_device *this,
 }
 
 static int speaker_ioport_write(struct kvm_io_device *this,
-   gpa_t addr, int len, const void *data)
+   gpa_t addr, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_pit *pit = speaker_to_pit(this);
struct kvm_kpit_state *pit_state = &pit->pit_state;
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
index 3cece05..96b1070 100644
--- a/arch/x86/kvm/i8259.c
+++ b/arch/x86/kvm/i8259.c
@@ -480,7 +480,8 @@ static inline struct kvm_pic *to_pic(struct kvm_io_device 
*dev)
 }
 
 static int picdev_write(struct kvm_io_device *this,
-gpa_t addr, int len, const void *val)
+gpa_t addr, int len, const void *val,
+struct kvm_io_ext_data *ext_data)
 {
struct kvm_pic *s = to_pic(this);
unsigned char data = *(unsigned char *)val;
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 93cf9d0..f413e9c 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -836,7 +836,8 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, 
u32 val)
 }
 
 static int apic_mmio_write(struct kvm_io_device *this,
-   gpa_t address, int len, const void *data)
+   gpa_t address, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_lapic *apic = to_lapic(this);
unsigned int offset = address - apic->base_address;
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index fa708c9..21b84e2 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3571,13 +3571,14 @@ static void kvm_init_msr_list(void)
 }
 
 static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len,
-  const void *v)
+  const void *v, struct kvm_io_ext_data *ext_data)
 {
if (vcpu->arch.apic &&
-   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v))
+   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v, ext_data))
return 0;
 
-   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, addr, len, v);
+   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS,
+   addr, len, v, ext_data);
 }
 
 static int vcpu_mmio_read(struct kvm_vcpu *vcpu, gpa_t addr, int len, void *v)
@@ -3807,6 +3808,7 @@ static int emulator_write_emulated_onepage(unsigned long 
addr,
   struct kvm_vcpu *vcpu)
 {
gpa_t gpa;
+   struct kvm_io_ext_data ext_data;
 
gpa = kvm_mmu_gva_to_gpa_write(vcpu, addr, exception);
 
@@ -3825,7 +3827,7 @@ mmio:
/*
 * Is this MMIO handled locally?
 */
-   if (!vcpu_mmio_write(vcpu, gpa, bytes, val))
+   if (!vcpu_mmio_write(vcpu, gpa, bytes, val, &ext_data))
return X86EMUL_CONTINUE;
 
vcpu->mmio_needed = 1;
@@ -3940,6 +3942,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
 {
/* TODO: String I/O for in kernel device */
int r;
+   struct kvm_io_ext_data ext_data;
 
if (vcpu->arch.pio.in)
r = kvm_io_bus_read(vcpu->kvm, KVM_PIO_BUS, vcpu->arch.pio.port,
@@ -3947,7 +3950,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
else
r = kvm_io_bus_write(vcpu->kvm, KVM_PIO_BUS,
 vcpu->arch.pio.port, vcpu->arch.pio.size,
-pd);
+pd, &ext_data);
return r;
 }
 
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 7d313e0..a32c53e 100644
-

Re: [PATCH 2/4] KVM: Add kvm_io_ext_data to IO handler

2011-02-27 Thread Sheng Yang
On Friday 25 February 2011 16:12:30 Michael S. Tsirkin wrote:
> On Fri, Feb 25, 2011 at 11:23:30AM +0800, Sheng Yang wrote:
> > On Thursday 24 February 2011 18:22:19 Michael S. Tsirkin wrote:
> > > On Thu, Feb 24, 2011 at 05:51:03PM +0800, Sheng Yang wrote:
> > > > Add a new parameter to IO writing handler, so that we can transfer
> > > > information from IO handler to caller.
> > > > 
> > > > Signed-off-by: Sheng Yang 
> > > > ---
> > > > 
> > > >  arch/x86/kvm/i8254.c  |6 --
> > > >  arch/x86/kvm/i8259.c  |3 ++-
> > > >  arch/x86/kvm/lapic.c  |3 ++-
> > > >  arch/x86/kvm/x86.c|   13 -
> > > >  include/linux/kvm_host.h  |   12 ++--
> > > >  virt/kvm/coalesced_mmio.c |3 ++-
> > > >  virt/kvm/eventfd.c|2 +-
> > > >  virt/kvm/ioapic.c |2 +-
> > > >  virt/kvm/iodev.h  |6 --
> > > >  virt/kvm/kvm_main.c   |4 ++--
> > > >  10 files changed, 36 insertions(+), 18 deletions(-)
> > > > 
> > > > diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
> > > > index efad723..bd8f0c5 100644
> > > > --- a/arch/x86/kvm/i8254.c
> > > > +++ b/arch/x86/kvm/i8254.c
> > > > @@ -439,7 +439,8 @@ static inline int pit_in_range(gpa_t addr)
> > > > 
> > > >  }
> > > >  
> > > >  static int pit_ioport_write(struct kvm_io_device *this,
> > > > 
> > > > -   gpa_t addr, int len, const void *data)
> > > > +   gpa_t addr, int len, const void *data,
> > > > +   struct kvm_io_ext_data *ext_data)
> > > > 
> > > >  {
> > > >  
> > > > struct kvm_pit *pit = dev_to_pit(this);
> > > > struct kvm_kpit_state *pit_state = &pit->pit_state;
> > > > 
> > > > @@ -585,7 +586,8 @@ static int pit_ioport_read(struct kvm_io_device
> > > > *this,
> > > > 
> > > >  }
> > > >  
> > > >  static int speaker_ioport_write(struct kvm_io_device *this,
> > > > 
> > > > -   gpa_t addr, int len, const void *data)
> > > > +   gpa_t addr, int len, const void *data,
> > > > +   struct kvm_io_ext_data *ext_data)
> > > > 
> > > >  {
> > > >  
> > > > struct kvm_pit *pit = speaker_to_pit(this);
> > > > struct kvm_kpit_state *pit_state = &pit->pit_state;
> > > > 
> > > > diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
> > > > index 3cece05..96b1070 100644
> > > > --- a/arch/x86/kvm/i8259.c
> > > > +++ b/arch/x86/kvm/i8259.c
> > > > @@ -480,7 +480,8 @@ static inline struct kvm_pic *to_pic(struct
> > > > kvm_io_device *dev)
> > > > 
> > > >  }
> > > >  
> > > >  static int picdev_write(struct kvm_io_device *this,
> > > > 
> > > > -gpa_t addr, int len, const void *val)
> > > > +gpa_t addr, int len, const void *val,
> > > > +struct kvm_io_ext_data *ext_data)
> > > > 
> > > >  {
> > > >  
> > > > struct kvm_pic *s = to_pic(this);
> > > > unsigned char data = *(unsigned char *)val;
> > > > 
> > > > diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> > > > index 93cf9d0..f413e9c 100644
> > > > --- a/arch/x86/kvm/lapic.c
> > > > +++ b/arch/x86/kvm/lapic.c
> > > > @@ -836,7 +836,8 @@ static int apic_reg_write(struct kvm_lapic *apic,
> > > > u32 reg, u32 val)
> > > > 
> > > >  }
> > > >  
> > > >  static int apic_mmio_write(struct kvm_io_device *this,
> > > > 
> > > > -   gpa_t address, int len, const void *data)
> > > > +   gpa_t address, int len, const void *data,
> > > > +   struct kvm_io_ext_data *ext_data)
> > > > 
> > > >  {
> > > >  
> > > > struct kvm_lapic *apic = to_lapic(this);
> > > > unsigned int offset = address - apic->base_address;
> > > > 
> > > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > > > index fa708c9..21b84e2 100644
> > > > --- a/arch/x86/kvm/x86.c
> > > > +++ b/arch/x86/kvm/x86.c
> > > > @@ -3571,13 +3571,14 @@ static void kvm_init_msr_list(void)
> > > > 
> > > >  }
> > > >  
> > > >  static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int
> > > >  len,
> > > > 
> > > > -  const void *v)
> > > > +  const void *v, struct kvm_io_ext_data 
> > > > *ext_data)
> > > > 
> > > >  {
> > > >  
> > > > if (vcpu->arch.apic &&
> > > > 
> > > > -   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v))
> > > > +   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v,
> > > > ext_data))
> > > > 
> > > > return 0;
> > > > 
> > > > -   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, addr, len, v);
> > > > +   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS,
> > > > +   addr, len, v, ext_data);
> > > > 
> > > >  }
> > > >  
> > > >  static int vcpu_mmio_read(struct kvm_vcpu *vcpu, gpa_t addr, int
> > > >  len, void *v)
> > > > 
> > > > @@ -3807

Re: [PATCH 2/4] KVM: Add kvm_io_ext_data to IO handler

2011-02-25 Thread Michael S. Tsirkin
On Fri, Feb 25, 2011 at 11:23:30AM +0800, Sheng Yang wrote:
> On Thursday 24 February 2011 18:22:19 Michael S. Tsirkin wrote:
> > On Thu, Feb 24, 2011 at 05:51:03PM +0800, Sheng Yang wrote:
> > > Add a new parameter to IO writing handler, so that we can transfer
> > > information from IO handler to caller.
> > > 
> > > Signed-off-by: Sheng Yang 
> > > ---
> > > 
> > >  arch/x86/kvm/i8254.c  |6 --
> > >  arch/x86/kvm/i8259.c  |3 ++-
> > >  arch/x86/kvm/lapic.c  |3 ++-
> > >  arch/x86/kvm/x86.c|   13 -
> > >  include/linux/kvm_host.h  |   12 ++--
> > >  virt/kvm/coalesced_mmio.c |3 ++-
> > >  virt/kvm/eventfd.c|2 +-
> > >  virt/kvm/ioapic.c |2 +-
> > >  virt/kvm/iodev.h  |6 --
> > >  virt/kvm/kvm_main.c   |4 ++--
> > >  10 files changed, 36 insertions(+), 18 deletions(-)
> > > 
> > > diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
> > > index efad723..bd8f0c5 100644
> > > --- a/arch/x86/kvm/i8254.c
> > > +++ b/arch/x86/kvm/i8254.c
> > > @@ -439,7 +439,8 @@ static inline int pit_in_range(gpa_t addr)
> > > 
> > >  }
> > >  
> > >  static int pit_ioport_write(struct kvm_io_device *this,
> > > 
> > > - gpa_t addr, int len, const void *data)
> > > + gpa_t addr, int len, const void *data,
> > > + struct kvm_io_ext_data *ext_data)
> > > 
> > >  {
> > >  
> > >   struct kvm_pit *pit = dev_to_pit(this);
> > >   struct kvm_kpit_state *pit_state = &pit->pit_state;
> > > 
> > > @@ -585,7 +586,8 @@ static int pit_ioport_read(struct kvm_io_device
> > > *this,
> > > 
> > >  }
> > >  
> > >  static int speaker_ioport_write(struct kvm_io_device *this,
> > > 
> > > - gpa_t addr, int len, const void *data)
> > > + gpa_t addr, int len, const void *data,
> > > + struct kvm_io_ext_data *ext_data)
> > > 
> > >  {
> > >  
> > >   struct kvm_pit *pit = speaker_to_pit(this);
> > >   struct kvm_kpit_state *pit_state = &pit->pit_state;
> > > 
> > > diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
> > > index 3cece05..96b1070 100644
> > > --- a/arch/x86/kvm/i8259.c
> > > +++ b/arch/x86/kvm/i8259.c
> > > @@ -480,7 +480,8 @@ static inline struct kvm_pic *to_pic(struct
> > > kvm_io_device *dev)
> > > 
> > >  }
> > >  
> > >  static int picdev_write(struct kvm_io_device *this,
> > > 
> > > -  gpa_t addr, int len, const void *val)
> > > +  gpa_t addr, int len, const void *val,
> > > +  struct kvm_io_ext_data *ext_data)
> > > 
> > >  {
> > >  
> > >   struct kvm_pic *s = to_pic(this);
> > >   unsigned char data = *(unsigned char *)val;
> > > 
> > > diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> > > index 93cf9d0..f413e9c 100644
> > > --- a/arch/x86/kvm/lapic.c
> > > +++ b/arch/x86/kvm/lapic.c
> > > @@ -836,7 +836,8 @@ static int apic_reg_write(struct kvm_lapic *apic, u32
> > > reg, u32 val)
> > > 
> > >  }
> > >  
> > >  static int apic_mmio_write(struct kvm_io_device *this,
> > > 
> > > - gpa_t address, int len, const void *data)
> > > + gpa_t address, int len, const void *data,
> > > + struct kvm_io_ext_data *ext_data)
> > > 
> > >  {
> > >  
> > >   struct kvm_lapic *apic = to_lapic(this);
> > >   unsigned int offset = address - apic->base_address;
> > > 
> > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > > index fa708c9..21b84e2 100644
> > > --- a/arch/x86/kvm/x86.c
> > > +++ b/arch/x86/kvm/x86.c
> > > @@ -3571,13 +3571,14 @@ static void kvm_init_msr_list(void)
> > > 
> > >  }
> > >  
> > >  static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len,
> > > 
> > > -const void *v)
> > > +const void *v, struct kvm_io_ext_data *ext_data)
> > > 
> > >  {
> > >  
> > >   if (vcpu->arch.apic &&
> > > 
> > > - !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v))
> > > + !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v, ext_data))
> > > 
> > >   return 0;
> > > 
> > > - return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, addr, len, v);
> > > + return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS,
> > > + addr, len, v, ext_data);
> > > 
> > >  }
> > >  
> > >  static int vcpu_mmio_read(struct kvm_vcpu *vcpu, gpa_t addr, int len,
> > >  void *v)
> > > 
> > > @@ -3807,6 +3808,7 @@ static int emulator_write_emulated_onepage(unsigned
> > > long addr,
> > > 
> > >  struct kvm_vcpu *vcpu)
> > >  
> > >  {
> > >  
> > >   gpa_t gpa;
> > > 
> > > + struct kvm_io_ext_data ext_data;
> > > 
> > >   gpa = kvm_mmu_gva_to_gpa_write(vcpu, addr, exception);
> > > 
> > > @@ -3825,7 +3827,7 @@ mmio:
> > >   /*
> > >   
> > >* Is this MMIO handled locally?
> > >*/
> > > 
> > > - if (!vcpu_mmio_write(vcpu, gpa, bytes, val))
> > > + if

Re: [PATCH 2/4] KVM: Add kvm_io_ext_data to IO handler

2011-02-24 Thread Sheng Yang
On Thursday 24 February 2011 18:22:19 Michael S. Tsirkin wrote:
> On Thu, Feb 24, 2011 at 05:51:03PM +0800, Sheng Yang wrote:
> > Add a new parameter to IO writing handler, so that we can transfer
> > information from IO handler to caller.
> > 
> > Signed-off-by: Sheng Yang 
> > ---
> > 
> >  arch/x86/kvm/i8254.c  |6 --
> >  arch/x86/kvm/i8259.c  |3 ++-
> >  arch/x86/kvm/lapic.c  |3 ++-
> >  arch/x86/kvm/x86.c|   13 -
> >  include/linux/kvm_host.h  |   12 ++--
> >  virt/kvm/coalesced_mmio.c |3 ++-
> >  virt/kvm/eventfd.c|2 +-
> >  virt/kvm/ioapic.c |2 +-
> >  virt/kvm/iodev.h  |6 --
> >  virt/kvm/kvm_main.c   |4 ++--
> >  10 files changed, 36 insertions(+), 18 deletions(-)
> > 
> > diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
> > index efad723..bd8f0c5 100644
> > --- a/arch/x86/kvm/i8254.c
> > +++ b/arch/x86/kvm/i8254.c
> > @@ -439,7 +439,8 @@ static inline int pit_in_range(gpa_t addr)
> > 
> >  }
> >  
> >  static int pit_ioport_write(struct kvm_io_device *this,
> > 
> > -   gpa_t addr, int len, const void *data)
> > +   gpa_t addr, int len, const void *data,
> > +   struct kvm_io_ext_data *ext_data)
> > 
> >  {
> >  
> > struct kvm_pit *pit = dev_to_pit(this);
> > struct kvm_kpit_state *pit_state = &pit->pit_state;
> > 
> > @@ -585,7 +586,8 @@ static int pit_ioport_read(struct kvm_io_device
> > *this,
> > 
> >  }
> >  
> >  static int speaker_ioport_write(struct kvm_io_device *this,
> > 
> > -   gpa_t addr, int len, const void *data)
> > +   gpa_t addr, int len, const void *data,
> > +   struct kvm_io_ext_data *ext_data)
> > 
> >  {
> >  
> > struct kvm_pit *pit = speaker_to_pit(this);
> > struct kvm_kpit_state *pit_state = &pit->pit_state;
> > 
> > diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
> > index 3cece05..96b1070 100644
> > --- a/arch/x86/kvm/i8259.c
> > +++ b/arch/x86/kvm/i8259.c
> > @@ -480,7 +480,8 @@ static inline struct kvm_pic *to_pic(struct
> > kvm_io_device *dev)
> > 
> >  }
> >  
> >  static int picdev_write(struct kvm_io_device *this,
> > 
> > -gpa_t addr, int len, const void *val)
> > +gpa_t addr, int len, const void *val,
> > +struct kvm_io_ext_data *ext_data)
> > 
> >  {
> >  
> > struct kvm_pic *s = to_pic(this);
> > unsigned char data = *(unsigned char *)val;
> > 
> > diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> > index 93cf9d0..f413e9c 100644
> > --- a/arch/x86/kvm/lapic.c
> > +++ b/arch/x86/kvm/lapic.c
> > @@ -836,7 +836,8 @@ static int apic_reg_write(struct kvm_lapic *apic, u32
> > reg, u32 val)
> > 
> >  }
> >  
> >  static int apic_mmio_write(struct kvm_io_device *this,
> > 
> > -   gpa_t address, int len, const void *data)
> > +   gpa_t address, int len, const void *data,
> > +   struct kvm_io_ext_data *ext_data)
> > 
> >  {
> >  
> > struct kvm_lapic *apic = to_lapic(this);
> > unsigned int offset = address - apic->base_address;
> > 
> > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > index fa708c9..21b84e2 100644
> > --- a/arch/x86/kvm/x86.c
> > +++ b/arch/x86/kvm/x86.c
> > @@ -3571,13 +3571,14 @@ static void kvm_init_msr_list(void)
> > 
> >  }
> >  
> >  static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len,
> > 
> > -  const void *v)
> > +  const void *v, struct kvm_io_ext_data *ext_data)
> > 
> >  {
> >  
> > if (vcpu->arch.apic &&
> > 
> > -   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v))
> > +   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v, ext_data))
> > 
> > return 0;
> > 
> > -   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, addr, len, v);
> > +   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS,
> > +   addr, len, v, ext_data);
> > 
> >  }
> >  
> >  static int vcpu_mmio_read(struct kvm_vcpu *vcpu, gpa_t addr, int len,
> >  void *v)
> > 
> > @@ -3807,6 +3808,7 @@ static int emulator_write_emulated_onepage(unsigned
> > long addr,
> > 
> >struct kvm_vcpu *vcpu)
> >  
> >  {
> >  
> > gpa_t gpa;
> > 
> > +   struct kvm_io_ext_data ext_data;
> > 
> > gpa = kvm_mmu_gva_to_gpa_write(vcpu, addr, exception);
> > 
> > @@ -3825,7 +3827,7 @@ mmio:
> > /*
> > 
> >  * Is this MMIO handled locally?
> >  */
> > 
> > -   if (!vcpu_mmio_write(vcpu, gpa, bytes, val))
> > +   if (!vcpu_mmio_write(vcpu, gpa, bytes, val, &ext_data))
> > 
> > return X86EMUL_CONTINUE;
> > 
> > vcpu->mmio_needed = 1;
> > 
> > @@ -3940,6 +3942,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void
> > *pd)
> > 
> >  {
> >  
> > /* TODO: String I/O 

Re: [PATCH 2/4] KVM: Add kvm_io_ext_data to IO handler

2011-02-24 Thread Michael S. Tsirkin
On Thu, Feb 24, 2011 at 05:51:03PM +0800, Sheng Yang wrote:
> Add a new parameter to IO writing handler, so that we can transfer information
> from IO handler to caller.
> 
> Signed-off-by: Sheng Yang 
> ---
>  arch/x86/kvm/i8254.c  |6 --
>  arch/x86/kvm/i8259.c  |3 ++-
>  arch/x86/kvm/lapic.c  |3 ++-
>  arch/x86/kvm/x86.c|   13 -
>  include/linux/kvm_host.h  |   12 ++--
>  virt/kvm/coalesced_mmio.c |3 ++-
>  virt/kvm/eventfd.c|2 +-
>  virt/kvm/ioapic.c |2 +-
>  virt/kvm/iodev.h  |6 --
>  virt/kvm/kvm_main.c   |4 ++--
>  10 files changed, 36 insertions(+), 18 deletions(-)
> 
> diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
> index efad723..bd8f0c5 100644
> --- a/arch/x86/kvm/i8254.c
> +++ b/arch/x86/kvm/i8254.c
> @@ -439,7 +439,8 @@ static inline int pit_in_range(gpa_t addr)
>  }
>  
>  static int pit_ioport_write(struct kvm_io_device *this,
> - gpa_t addr, int len, const void *data)
> + gpa_t addr, int len, const void *data,
> + struct kvm_io_ext_data *ext_data)
>  {
>   struct kvm_pit *pit = dev_to_pit(this);
>   struct kvm_kpit_state *pit_state = &pit->pit_state;
> @@ -585,7 +586,8 @@ static int pit_ioport_read(struct kvm_io_device *this,
>  }
>  
>  static int speaker_ioport_write(struct kvm_io_device *this,
> - gpa_t addr, int len, const void *data)
> + gpa_t addr, int len, const void *data,
> + struct kvm_io_ext_data *ext_data)
>  {
>   struct kvm_pit *pit = speaker_to_pit(this);
>   struct kvm_kpit_state *pit_state = &pit->pit_state;
> diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
> index 3cece05..96b1070 100644
> --- a/arch/x86/kvm/i8259.c
> +++ b/arch/x86/kvm/i8259.c
> @@ -480,7 +480,8 @@ static inline struct kvm_pic *to_pic(struct kvm_io_device 
> *dev)
>  }
>  
>  static int picdev_write(struct kvm_io_device *this,
> -  gpa_t addr, int len, const void *val)
> +  gpa_t addr, int len, const void *val,
> +  struct kvm_io_ext_data *ext_data)
>  {
>   struct kvm_pic *s = to_pic(this);
>   unsigned char data = *(unsigned char *)val;
> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> index 93cf9d0..f413e9c 100644
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
> @@ -836,7 +836,8 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 
> reg, u32 val)
>  }
>  
>  static int apic_mmio_write(struct kvm_io_device *this,
> - gpa_t address, int len, const void *data)
> + gpa_t address, int len, const void *data,
> + struct kvm_io_ext_data *ext_data)
>  {
>   struct kvm_lapic *apic = to_lapic(this);
>   unsigned int offset = address - apic->base_address;
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index fa708c9..21b84e2 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -3571,13 +3571,14 @@ static void kvm_init_msr_list(void)
>  }
>  
>  static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len,
> -const void *v)
> +const void *v, struct kvm_io_ext_data *ext_data)
>  {
>   if (vcpu->arch.apic &&
> - !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v))
> + !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v, ext_data))
>   return 0;
>  
> - return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, addr, len, v);
> + return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS,
> + addr, len, v, ext_data);
>  }
>  
>  static int vcpu_mmio_read(struct kvm_vcpu *vcpu, gpa_t addr, int len, void 
> *v)
> @@ -3807,6 +3808,7 @@ static int emulator_write_emulated_onepage(unsigned 
> long addr,
>  struct kvm_vcpu *vcpu)
>  {
>   gpa_t gpa;
> + struct kvm_io_ext_data ext_data;
>  
>   gpa = kvm_mmu_gva_to_gpa_write(vcpu, addr, exception);
>  
> @@ -3825,7 +3827,7 @@ mmio:
>   /*
>* Is this MMIO handled locally?
>*/
> - if (!vcpu_mmio_write(vcpu, gpa, bytes, val))
> + if (!vcpu_mmio_write(vcpu, gpa, bytes, val, &ext_data))
>   return X86EMUL_CONTINUE;
>  
>   vcpu->mmio_needed = 1;
> @@ -3940,6 +3942,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
>  {
>   /* TODO: String I/O for in kernel device */
>   int r;
> + struct kvm_io_ext_data ext_data;
>  
>   if (vcpu->arch.pio.in)
>   r = kvm_io_bus_read(vcpu->kvm, KVM_PIO_BUS, vcpu->arch.pio.port,
> @@ -3947,7 +3950,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
>   else
>   r = kvm_io_bus_write(vcpu->kvm, KVM_PIO_BUS,
>vcpu->arch.pio.port, vcpu->arch.pio.size

[PATCH 2/4] KVM: Add kvm_io_ext_data to IO handler

2011-02-24 Thread Sheng Yang
Add a new parameter to IO writing handler, so that we can transfer information
from IO handler to caller.

Signed-off-by: Sheng Yang 
---
 arch/x86/kvm/i8254.c  |6 --
 arch/x86/kvm/i8259.c  |3 ++-
 arch/x86/kvm/lapic.c  |3 ++-
 arch/x86/kvm/x86.c|   13 -
 include/linux/kvm_host.h  |   12 ++--
 virt/kvm/coalesced_mmio.c |3 ++-
 virt/kvm/eventfd.c|2 +-
 virt/kvm/ioapic.c |2 +-
 virt/kvm/iodev.h  |6 --
 virt/kvm/kvm_main.c   |4 ++--
 10 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
index efad723..bd8f0c5 100644
--- a/arch/x86/kvm/i8254.c
+++ b/arch/x86/kvm/i8254.c
@@ -439,7 +439,8 @@ static inline int pit_in_range(gpa_t addr)
 }
 
 static int pit_ioport_write(struct kvm_io_device *this,
-   gpa_t addr, int len, const void *data)
+   gpa_t addr, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_pit *pit = dev_to_pit(this);
struct kvm_kpit_state *pit_state = &pit->pit_state;
@@ -585,7 +586,8 @@ static int pit_ioport_read(struct kvm_io_device *this,
 }
 
 static int speaker_ioport_write(struct kvm_io_device *this,
-   gpa_t addr, int len, const void *data)
+   gpa_t addr, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_pit *pit = speaker_to_pit(this);
struct kvm_kpit_state *pit_state = &pit->pit_state;
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
index 3cece05..96b1070 100644
--- a/arch/x86/kvm/i8259.c
+++ b/arch/x86/kvm/i8259.c
@@ -480,7 +480,8 @@ static inline struct kvm_pic *to_pic(struct kvm_io_device 
*dev)
 }
 
 static int picdev_write(struct kvm_io_device *this,
-gpa_t addr, int len, const void *val)
+gpa_t addr, int len, const void *val,
+struct kvm_io_ext_data *ext_data)
 {
struct kvm_pic *s = to_pic(this);
unsigned char data = *(unsigned char *)val;
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 93cf9d0..f413e9c 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -836,7 +836,8 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, 
u32 val)
 }
 
 static int apic_mmio_write(struct kvm_io_device *this,
-   gpa_t address, int len, const void *data)
+   gpa_t address, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_lapic *apic = to_lapic(this);
unsigned int offset = address - apic->base_address;
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index fa708c9..21b84e2 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3571,13 +3571,14 @@ static void kvm_init_msr_list(void)
 }
 
 static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len,
-  const void *v)
+  const void *v, struct kvm_io_ext_data *ext_data)
 {
if (vcpu->arch.apic &&
-   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v))
+   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v, ext_data))
return 0;
 
-   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, addr, len, v);
+   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS,
+   addr, len, v, ext_data);
 }
 
 static int vcpu_mmio_read(struct kvm_vcpu *vcpu, gpa_t addr, int len, void *v)
@@ -3807,6 +3808,7 @@ static int emulator_write_emulated_onepage(unsigned long 
addr,
   struct kvm_vcpu *vcpu)
 {
gpa_t gpa;
+   struct kvm_io_ext_data ext_data;
 
gpa = kvm_mmu_gva_to_gpa_write(vcpu, addr, exception);
 
@@ -3825,7 +3827,7 @@ mmio:
/*
 * Is this MMIO handled locally?
 */
-   if (!vcpu_mmio_write(vcpu, gpa, bytes, val))
+   if (!vcpu_mmio_write(vcpu, gpa, bytes, val, &ext_data))
return X86EMUL_CONTINUE;
 
vcpu->mmio_needed = 1;
@@ -3940,6 +3942,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
 {
/* TODO: String I/O for in kernel device */
int r;
+   struct kvm_io_ext_data ext_data;
 
if (vcpu->arch.pio.in)
r = kvm_io_bus_read(vcpu->kvm, KVM_PIO_BUS, vcpu->arch.pio.port,
@@ -3947,7 +3950,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
else
r = kvm_io_bus_write(vcpu->kvm, KVM_PIO_BUS,
 vcpu->arch.pio.port, vcpu->arch.pio.size,
-pd);
+pd, &ext_data);
return r;
 }
 
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 7d313e0..6bb211d 10064

[PATCH 2/4] KVM: Add kvm_io_ext_data to IO handler

2011-02-18 Thread Sheng Yang
Add a new parameter to IO writing handler, so that we can transfer information
from IO handler to caller.

Signed-off-by: Sheng Yang 
---
 arch/x86/kvm/i8254.c  |6 --
 arch/x86/kvm/i8259.c  |3 ++-
 arch/x86/kvm/lapic.c  |3 ++-
 arch/x86/kvm/x86.c|   13 -
 include/linux/kvm_host.h  |   12 ++--
 virt/kvm/coalesced_mmio.c |3 ++-
 virt/kvm/eventfd.c|2 +-
 virt/kvm/ioapic.c |2 +-
 virt/kvm/iodev.h  |6 --
 virt/kvm/kvm_main.c   |4 ++--
 10 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
index efad723..bd8f0c5 100644
--- a/arch/x86/kvm/i8254.c
+++ b/arch/x86/kvm/i8254.c
@@ -439,7 +439,8 @@ static inline int pit_in_range(gpa_t addr)
 }
 
 static int pit_ioport_write(struct kvm_io_device *this,
-   gpa_t addr, int len, const void *data)
+   gpa_t addr, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_pit *pit = dev_to_pit(this);
struct kvm_kpit_state *pit_state = &pit->pit_state;
@@ -585,7 +586,8 @@ static int pit_ioport_read(struct kvm_io_device *this,
 }
 
 static int speaker_ioport_write(struct kvm_io_device *this,
-   gpa_t addr, int len, const void *data)
+   gpa_t addr, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_pit *pit = speaker_to_pit(this);
struct kvm_kpit_state *pit_state = &pit->pit_state;
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
index 3cece05..96b1070 100644
--- a/arch/x86/kvm/i8259.c
+++ b/arch/x86/kvm/i8259.c
@@ -480,7 +480,8 @@ static inline struct kvm_pic *to_pic(struct kvm_io_device 
*dev)
 }
 
 static int picdev_write(struct kvm_io_device *this,
-gpa_t addr, int len, const void *val)
+gpa_t addr, int len, const void *val,
+struct kvm_io_ext_data *ext_data)
 {
struct kvm_pic *s = to_pic(this);
unsigned char data = *(unsigned char *)val;
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 93cf9d0..f413e9c 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -836,7 +836,8 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, 
u32 val)
 }
 
 static int apic_mmio_write(struct kvm_io_device *this,
-   gpa_t address, int len, const void *data)
+   gpa_t address, int len, const void *data,
+   struct kvm_io_ext_data *ext_data)
 {
struct kvm_lapic *apic = to_lapic(this);
unsigned int offset = address - apic->base_address;
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index fa708c9..21b84e2 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3571,13 +3571,14 @@ static void kvm_init_msr_list(void)
 }
 
 static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len,
-  const void *v)
+  const void *v, struct kvm_io_ext_data *ext_data)
 {
if (vcpu->arch.apic &&
-   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v))
+   !kvm_iodevice_write(&vcpu->arch.apic->dev, addr, len, v, ext_data))
return 0;
 
-   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, addr, len, v);
+   return kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS,
+   addr, len, v, ext_data);
 }
 
 static int vcpu_mmio_read(struct kvm_vcpu *vcpu, gpa_t addr, int len, void *v)
@@ -3807,6 +3808,7 @@ static int emulator_write_emulated_onepage(unsigned long 
addr,
   struct kvm_vcpu *vcpu)
 {
gpa_t gpa;
+   struct kvm_io_ext_data ext_data;
 
gpa = kvm_mmu_gva_to_gpa_write(vcpu, addr, exception);
 
@@ -3825,7 +3827,7 @@ mmio:
/*
 * Is this MMIO handled locally?
 */
-   if (!vcpu_mmio_write(vcpu, gpa, bytes, val))
+   if (!vcpu_mmio_write(vcpu, gpa, bytes, val, &ext_data))
return X86EMUL_CONTINUE;
 
vcpu->mmio_needed = 1;
@@ -3940,6 +3942,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
 {
/* TODO: String I/O for in kernel device */
int r;
+   struct kvm_io_ext_data ext_data;
 
if (vcpu->arch.pio.in)
r = kvm_io_bus_read(vcpu->kvm, KVM_PIO_BUS, vcpu->arch.pio.port,
@@ -3947,7 +3950,7 @@ static int kernel_pio(struct kvm_vcpu *vcpu, void *pd)
else
r = kvm_io_bus_write(vcpu->kvm, KVM_PIO_BUS,
 vcpu->arch.pio.port, vcpu->arch.pio.size,
-pd);
+pd, &ext_data);
return r;
 }
 
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 7d313e0..6bb211d 10064