[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 39/45] hvf: Simplify post reset/init/loadvm hooks
From: |
Peter Maydell |
Subject: |
[PULL 39/45] hvf: Simplify post reset/init/loadvm hooks |
Date: |
Thu, 3 Jun 2021 16:58:58 +0100 |
From: Alexander Graf <agraf@csgraf.de>
The hooks we have that call us after reset, init and loadvm really all
just want to say "The reference of all register state is in the QEMU
vcpu struct, please push it".
We already have a working pushing mechanism though called cpu->vcpu_dirty,
so we can just reuse that for all of the above, syncing state properly the
next time we actually execute a vCPU.
This fixes PSCI resets on ARM, as they modify CPU state even after the
post init call has completed, but before we execute the vCPU again.
To also make the scheme work for x86, we have to make sure we don't
move stale eflags into our env when the vcpu state is dirty.
Signed-off-by: Alexander Graf <agraf@csgraf.de>
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
Tested-by: Roman Bolshakov <r.bolshakov@yadro.com>
Reviewed-by: Sergio Lopez <slp@redhat.com>
Message-id: 20210519202253.76782-13-agraf@csgraf.de
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
accel/hvf/hvf-accel-ops.c | 27 +++++++--------------------
target/i386/hvf/x86hvf.c | 5 ++++-
2 files changed, 11 insertions(+), 21 deletions(-)
diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c
index ded918c443d..d1691be9896 100644
--- a/accel/hvf/hvf-accel-ops.c
+++ b/accel/hvf/hvf-accel-ops.c
@@ -205,39 +205,26 @@ static void hvf_cpu_synchronize_state(CPUState *cpu)
}
}
-static void do_hvf_cpu_synchronize_post_reset(CPUState *cpu,
- run_on_cpu_data arg)
+static void do_hvf_cpu_synchronize_set_dirty(CPUState *cpu,
+ run_on_cpu_data arg)
{
- hvf_put_registers(cpu);
- cpu->vcpu_dirty = false;
+ /* QEMU state is the reference, push it to HVF now and on next entry */
+ cpu->vcpu_dirty = true;
}
static void hvf_cpu_synchronize_post_reset(CPUState *cpu)
{
- run_on_cpu(cpu, do_hvf_cpu_synchronize_post_reset, RUN_ON_CPU_NULL);
-}
-
-static void do_hvf_cpu_synchronize_post_init(CPUState *cpu,
- run_on_cpu_data arg)
-{
- hvf_put_registers(cpu);
- cpu->vcpu_dirty = false;
+ run_on_cpu(cpu, do_hvf_cpu_synchronize_set_dirty, RUN_ON_CPU_NULL);
}
static void hvf_cpu_synchronize_post_init(CPUState *cpu)
{
- run_on_cpu(cpu, do_hvf_cpu_synchronize_post_init, RUN_ON_CPU_NULL);
-}
-
-static void do_hvf_cpu_synchronize_pre_loadvm(CPUState *cpu,
- run_on_cpu_data arg)
-{
- cpu->vcpu_dirty = true;
+ run_on_cpu(cpu, do_hvf_cpu_synchronize_set_dirty, RUN_ON_CPU_NULL);
}
static void hvf_cpu_synchronize_pre_loadvm(CPUState *cpu)
{
- run_on_cpu(cpu, do_hvf_cpu_synchronize_pre_loadvm, RUN_ON_CPU_NULL);
+ run_on_cpu(cpu, do_hvf_cpu_synchronize_set_dirty, RUN_ON_CPU_NULL);
}
static void hvf_set_dirty_tracking(MemoryRegionSection *section, bool on)
diff --git a/target/i386/hvf/x86hvf.c b/target/i386/hvf/x86hvf.c
index 28cfee4f608..2ced2c24784 100644
--- a/target/i386/hvf/x86hvf.c
+++ b/target/i386/hvf/x86hvf.c
@@ -433,7 +433,10 @@ int hvf_process_events(CPUState *cpu_state)
X86CPU *cpu = X86_CPU(cpu_state);
CPUX86State *env = &cpu->env;
- env->eflags = rreg(cpu_state->hvf->fd, HV_X86_RFLAGS);
+ if (!cpu_state->vcpu_dirty) {
+ /* light weight sync for CPU_INTERRUPT_HARD and IF_MASK */
+ env->eflags = rreg(cpu_state->hvf->fd, HV_X86_RFLAGS);
+ }
if (cpu_state->interrupt_request & CPU_INTERRUPT_INIT) {
cpu_synchronize_state(cpu_state);
--
2.20.1
- [PULL 28/45] hvf: Move assert_hvf_ok() into common directory, (continued)
- [PULL 28/45] hvf: Move assert_hvf_ok() into common directory, Peter Maydell, 2021/06/03
- [PULL 29/45] hvf: Move vcpu thread functions into common directory, Peter Maydell, 2021/06/03
- [PULL 30/45] hvf: Move cpu functions into common directory, Peter Maydell, 2021/06/03
- [PULL 31/45] hvf: Move hvf internal definitions into common header, Peter Maydell, 2021/06/03
- [PULL 33/45] hvf: Remove use of hv_uvaddr_t and hv_gpaddr_t, Peter Maydell, 2021/06/03
- [PULL 34/45] hvf: Split out common code on vcpu init and destroy, Peter Maydell, 2021/06/03
- [PULL 35/45] hvf: Use cpu_synchronize_state(), Peter Maydell, 2021/06/03
- [PULL 37/45] hvf: Remove hvf-accel-ops.h, Peter Maydell, 2021/06/03
- [PULL 36/45] hvf: Make synchronize functions static, Peter Maydell, 2021/06/03
- [PULL 32/45] hvf: Make hvf_set_phys_mem() static, Peter Maydell, 2021/06/03
- [PULL 39/45] hvf: Simplify post reset/init/loadvm hooks,
Peter Maydell <=
- [PULL 40/45] tests/qtest/bios-tables-test: Check for dup2() failure, Peter Maydell, 2021/06/03
- [PULL 44/45] tests/qtest/tpm-tests: Remove unnecessary NULL checks, Peter Maydell, 2021/06/03
- [PULL 41/45] tests/qtest/e1000e-test: Check qemu_recv() succeeded, Peter Maydell, 2021/06/03
- [PULL 38/45] hvf: Introduce hvf vcpu struct, Peter Maydell, 2021/06/03
- [PULL 42/45] tests/qtest/hd-geo-test: Fix checks on mkstemp() return value, Peter Maydell, 2021/06/03
- [PULL 43/45] tests/qtest/pflash-cfi02-test: Avoid potential integer overflow, Peter Maydell, 2021/06/03
- [PULL 45/45] tests/unit/test-vmstate: Assert that dup() and mkstemp() succeed, Peter Maydell, 2021/06/03
- Re: [PULL 00/45] target-arm queue, no-reply, 2021/06/03
- Re: [PULL 00/45] target-arm queue, Peter Maydell, 2021/06/03