From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Yang, Sheng" Subject: [PATCH 6/6] kvm: qemu: Add save/restore support for in kernel PIT Date: Fri, 7 Mar 2008 20:52:27 +0800 Message-ID: <200803072052.28094.sheng.yang@intel.com> Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_MqT0Hmvfc9SEaxJ" To: kvm-devel@lists.sourceforge.net Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces@lists.sourceforge.net Errors-To: kvm-devel-bounces@lists.sourceforge.net List-Id: kvm.vger.kernel.org --Boundary-00=_MqT0Hmvfc9SEaxJ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =46rom 1af4bc979495e9e51b67635d5a9890c559e31078 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Fri, 7 Mar 2008 19:13:06 +0800 Subject: [PATCH] kvm: qemu: Add save/restore support for in kernel PIT Signed-off-by: Sheng Yang =2D-- qemu/hw/i8254.c | 73=20 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 73 insertions(+), 0 deletions(-) diff --git a/qemu/hw/i8254.c b/qemu/hw/i8254.c index 9e18ebc..e215f8b 100644 =2D-- a/qemu/hw/i8254.c +++ b/qemu/hw/i8254.c @@ -414,12 +414,78 @@ static void pit_irq_timer(void *opaque) pit_irq_timer_update(s, s->next_transition_time); } +#ifdef KVM_CAP_PIT + +static void kvm_kernel_pit_save_to_user(PITState *s) +{ + struct kvm_pit_state pit; + struct kvm_pit_channel_state *c; + struct PITChannelState *sc; + int i; + + kvm_get_pit(kvm_context, &pit); + + for (i =3D 0; i < 3; i++) { + c =3D &pit.channels[i]; + sc =3D &s->channels[i]; + sc->count =3D c->count; + sc->latched_count =3D c->latched_count; + sc->count_latched =3D c->count_latched; + sc->status_latched =3D c->status_latched; + sc->status =3D c->status; + sc->read_state =3D c->read_state; + sc->write_state =3D c->write_state; + sc->write_latch =3D c->write_latch; + sc->rw_mode =3D c->rw_mode; + sc->mode =3D c->mode; + sc->bcd =3D c->bcd; + sc->gate =3D c->gate; + sc->count_load_time =3D c->count_load_time; + } +} + +static void kvm_kernel_pit_load_from_user(PITState *s) +{ + struct kvm_pit_state pit; + struct kvm_pit_channel_state *c; + struct PITChannelState *sc; + int i; + + for (i =3D 0; i < 3; i++) { + c =3D &pit.channels[i]; + sc =3D &s->channels[i]; + c->count =3D sc->count; + c->latched_count =3D sc->latched_count; + c->count_latched =3D sc->count_latched; + c->status_latched =3D sc->status_latched; + c->status =3D sc->status; + c->read_state =3D sc->read_state; + c->write_state =3D sc->write_state; + c->write_latch =3D sc->write_latch; + c->rw_mode =3D sc->rw_mode; + c->mode =3D sc->mode; + c->bcd =3D sc->bcd; + c->gate =3D sc->gate; + c->count_load_time =3D sc->count_load_time; + } + + kvm_set_pit(kvm_context, &pit); +} + +#endif + static void pit_save(QEMUFile *f, void *opaque) { PITState *pit =3D opaque; PITChannelState *s; int i; +#ifdef KVM_CAP_PIT + if (kvm_enabled() && qemu_kvm_pit_in_kernel()) { + kvm_kernel_pit_save_to_user(pit); + } +#endif + for(i =3D 0; i < 3; i++) { s =3D &pit->channels[i]; qemu_put_be32(f, s->count); @@ -471,6 +537,13 @@ static int pit_load(QEMUFile *f, void *opaque, int=20 version_id) qemu_get_timer(f, s->irq_timer); } } + +#ifdef KVM_CAP_PIT + if (kvm_enabled() && qemu_kvm_pit_in_kernel()) { + kvm_kernel_pit_load_from_user(pit); + } +#endif + return 0; } =2D- debian.1.5.3.7.1-dirty --Boundary-00=_MqT0Hmvfc9SEaxJ Content-Type: text/x-diff; charset="utf-8"; name="0004-kvm-qemu-Add-save-restore-support-for-in-kernel-PI.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0004-kvm-qemu-Add-save-restore-support-for-in-kernel-PI.patch" =46rom 1af4bc979495e9e51b67635d5a9890c559e31078 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Fri, 7 Mar 2008 19:13:06 +0800 Subject: [PATCH] kvm: qemu: Add save/restore support for in kernel PIT Signed-off-by: Sheng Yang =2D-- qemu/hw/i8254.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 files changed, 73 insertions(+), 0 deletions(-) diff --git a/qemu/hw/i8254.c b/qemu/hw/i8254.c index 9e18ebc..e215f8b 100644 =2D-- a/qemu/hw/i8254.c +++ b/qemu/hw/i8254.c @@ -414,12 +414,78 @@ static void pit_irq_timer(void *opaque) pit_irq_timer_update(s, s->next_transition_time); } =20 +#ifdef KVM_CAP_PIT + +static void kvm_kernel_pit_save_to_user(PITState *s) +{ + struct kvm_pit_state pit; + struct kvm_pit_channel_state *c; + struct PITChannelState *sc; + int i; + + kvm_get_pit(kvm_context, &pit); + + for (i =3D 0; i < 3; i++) { + c =3D &pit.channels[i]; + sc =3D &s->channels[i]; + sc->count =3D c->count; + sc->latched_count =3D c->latched_count; + sc->count_latched =3D c->count_latched; + sc->status_latched =3D c->status_latched; + sc->status =3D c->status; + sc->read_state =3D c->read_state; + sc->write_state =3D c->write_state; + sc->write_latch =3D c->write_latch; + sc->rw_mode =3D c->rw_mode; + sc->mode =3D c->mode; + sc->bcd =3D c->bcd; + sc->gate =3D c->gate; + sc->count_load_time =3D c->count_load_time; + } +} + +static void kvm_kernel_pit_load_from_user(PITState *s) +{ + struct kvm_pit_state pit; + struct kvm_pit_channel_state *c; + struct PITChannelState *sc; + int i; + + for (i =3D 0; i < 3; i++) { + c =3D &pit.channels[i]; + sc =3D &s->channels[i]; + c->count =3D sc->count; + c->latched_count =3D sc->latched_count; + c->count_latched =3D sc->count_latched; + c->status_latched =3D sc->status_latched; + c->status =3D sc->status; + c->read_state =3D sc->read_state; + c->write_state =3D sc->write_state; + c->write_latch =3D sc->write_latch; + c->rw_mode =3D sc->rw_mode; + c->mode =3D sc->mode; + c->bcd =3D sc->bcd; + c->gate =3D sc->gate; + c->count_load_time =3D sc->count_load_time; + } + + kvm_set_pit(kvm_context, &pit); +} + +#endif + static void pit_save(QEMUFile *f, void *opaque) { PITState *pit =3D opaque; PITChannelState *s; int i; =20 +#ifdef KVM_CAP_PIT + if (kvm_enabled() && qemu_kvm_pit_in_kernel()) { + kvm_kernel_pit_save_to_user(pit); + } +#endif + for(i =3D 0; i < 3; i++) { s =3D &pit->channels[i]; qemu_put_be32(f, s->count); @@ -471,6 +537,13 @@ static int pit_load(QEMUFile *f, void *opaque, int ver= sion_id) qemu_get_timer(f, s->irq_timer); } } + +#ifdef KVM_CAP_PIT + if (kvm_enabled() && qemu_kvm_pit_in_kernel()) { + kvm_kernel_pit_load_from_user(pit); + } +#endif + return 0; } =20 =2D-=20 debian.1.5.3.7.1-dirty --Boundary-00=_MqT0Hmvfc9SEaxJ Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ --Boundary-00=_MqT0Hmvfc9SEaxJ Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel --Boundary-00=_MqT0Hmvfc9SEaxJ--