From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Cc: kvm@vger.kernel.org, Juan Quintela <quintela@redhat.com>,
patches@linaro.org, Andre Przywara <andre.przywara@linaro.org>,
kvmarm@lists.cs.columbia.edu,
Christoffer Dall <christoffer.dall@linaro.org>
Subject: [Qemu-devel] [PATCH v2 6/7] target-arm: Reinitialize all KVM VCPU registers on reset
Date: Mon, 3 Jun 2013 14:47:16 +0100 [thread overview]
Message-ID: <1370267237-25772-7-git-send-email-peter.maydell@linaro.org> (raw)
In-Reply-To: <1370267237-25772-1-git-send-email-peter.maydell@linaro.org>
Since the ARM KVM API doesn't include a "reset this VCPU"
ioctl, we have to capture the initial values of every
register it knows about so that we can reset the VCPU
by feeding those values back again.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
target-arm/cpu-qom.h | 6 +++++-
target-arm/kvm.c | 16 ++++++++++++++++
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/target-arm/cpu-qom.h b/target-arm/cpu-qom.h
index 2242eee..25239b8 100644
--- a/target-arm/cpu-qom.h
+++ b/target-arm/cpu-qom.h
@@ -72,7 +72,11 @@ typedef struct ARMCPU {
uint64_t *cpreg_indexes;
/* Values of the registers (cpreg_indexes[i]'s value is cpreg_values[i]) */
uint64_t *cpreg_values;
- /* Length of the indexes, values arrays */
+ /* When using KVM, keeps a copy of the initial state of the VCPU,
+ * so that on reset we can feed the reset values back into the kernel.
+ */
+ uint64_t *cpreg_reset_values;
+ /* Length of the indexes, values, reset_values arrays */
int32_t cpreg_array_len;
/* These are used only for migration: incoming data arrives in
* these fields and is sanity checked in post_load before copying
diff --git a/target-arm/kvm.c b/target-arm/kvm.c
index 746ae02..f4a835d 100644
--- a/target-arm/kvm.c
+++ b/target-arm/kvm.c
@@ -162,6 +162,13 @@ int kvm_arch_init_vcpu(CPUState *cs)
goto out;
}
+ /* Save a copy of the initial register values so that we can
+ * feed it back to the kernel on VCPU reset.
+ */
+ cpu->cpreg_reset_values = g_memdup(cpu->cpreg_values,
+ cpu->cpreg_array_len *
+ sizeof(cpu->cpreg_values[0]));
+
out:
g_free(rlp);
return ret;
@@ -603,6 +610,15 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
void kvm_arch_reset_vcpu(CPUState *cs)
{
+ /* Feed the kernel back its initial register state */
+ ARMCPU *cpu = ARM_CPU(cs);
+
+ memmove(cpu->cpreg_values, cpu->cpreg_reset_values,
+ cpu->cpreg_array_len * sizeof(cpu->cpreg_values[0]));
+
+ if (!write_list_to_kvmstate(cpu)) {
+ abort();
+ }
}
bool kvm_arch_stop_on_emulation_error(CPUState *cs)
--
1.7.9.5
next prev parent reply other threads:[~2013-06-03 14:14 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-03 13:47 [Qemu-devel] [PATCH v2 0/7] target-arm: cpregs list for migration, kvm reset Peter Maydell
2013-06-03 13:47 ` [Qemu-devel] [PATCH v2 1/7] target-arm: Allow special cpregs to have flags set Peter Maydell
2013-06-03 13:47 ` [Qemu-devel] [PATCH v2 2/7] target-arm: Add raw_readfn and raw_writefn to ARMCPRegInfo Peter Maydell
2013-06-03 13:47 ` [Qemu-devel] [PATCH v2 3/7] target-arm: mark up cpregs for no-migrate or raw access Peter Maydell
2013-06-03 13:47 ` [Qemu-devel] [PATCH v2 4/7] target-arm: Convert TCG to using (index, value) list for cp migration Peter Maydell
2013-06-03 13:47 ` [Qemu-devel] [PATCH v2 5/7] target-arm: Initialize cpreg list from KVM when using KVM Peter Maydell
2013-06-03 13:47 ` Peter Maydell [this message]
2013-06-03 13:47 ` [Qemu-devel] [PATCH v2 7/7] target-arm: Use tuple list to sync cp regs with KVM Peter Maydell
2013-06-13 14:13 ` [Qemu-devel] [PATCH v2 0/7] target-arm: cpregs list for migration, kvm reset Peter Maydell
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=1370267237-25772-7-git-send-email-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=andre.przywara@linaro.org \
--cc=christoffer.dall@linaro.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=patches@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).