xemu/target/arm
Peter Maydell 823e1b3818 arm: Allow system registers for KVM guests to be changed by QEMU code
At the moment the Arm implementations of kvm_arch_{get,put}_registers()
don't support having QEMU change the values of system registers
(aka coprocessor registers for AArch32). This is because although
kvm_arch_get_registers() calls write_list_to_cpustate() to
update the CPU state struct fields (so QEMU code can read the
values in the usual way), kvm_arch_put_registers() does not
call write_cpustate_to_list(), meaning that any changes to
the CPU state struct fields will not be passed back to KVM.

The rationale for this design is documented in a comment in the
AArch32 kvm_arch_put_registers() -- writing the values in the
cpregs list into the CPU state struct is "lossy" because the
write of a register might not succeed, and so if we blindly
copy the CPU state values back again we will incorrectly
change register values for the guest. The assumption was that
no QEMU code would need to write to the registers.

However, when we implemented debug support for KVM guests, we
broke that assumption: the code to handle "set the guest up
to take a breakpoint exception" does so by updating various
guest registers including ESR_EL1.

Support this by making kvm_arch_put_registers() synchronize
CPU state back into the list. We sync only those registers
where the initial write succeeds, which should be sufficient.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Tested-by: Alex Bennée <alex.bennee@linaro.org>
Tested-by: Dongjiu Geng <gengdongjiu@huawei.com>
2019-02-15 09:56:39 +00:00
..
arch_dump.c target/arm: Add aa{32, 64}_vfp_{dreg, qreg} helpers 2018-01-25 11:45:29 +00:00
arm_ldst.h target: Do not include "exec/exec-all.h" if it is not necessary 2018-06-01 14:15:10 +02:00
arm-powerctl.c arm: Clarify the logic of set_pc() 2019-02-01 14:55:46 +00:00
arm-powerctl.h target-arm/powerctl: defer cpu reset work to CPU context 2017-02-24 10:32:46 +00:00
arm-semi.c target/arm: Remove a handful of stray tabs 2018-08-24 13:17:48 +01:00
cpu64.c target/arm: Enable BTI for -cpu max 2019-02-05 16:52:38 +00:00
cpu-qom.h arm: replace instance_post_init() 2019-01-07 16:18:42 +04:00
cpu.c target/arm: Enable TBI for user-only 2019-02-05 16:52:40 +00:00
cpu.h arm: Allow system registers for KVM guests to be changed by QEMU code 2019-02-15 09:56:39 +00:00
crypto_helper.c target: Do not include "exec/exec-all.h" if it is not necessary 2018-06-01 14:15:10 +02:00
gdbstub64.c
gdbstub.c arm: fix malloc type mismatch 2018-05-31 14:50:52 +01:00
helper-a64.c target/arm: Fix int128_make128 lo, hi order in paired_cmpxchg64_be 2019-02-15 09:56:38 +00:00
helper-a64.h target/arm: Add new_pc argument to helper_exception_return 2019-01-21 10:38:53 +00:00
helper-sve.h target/arm: Rewrite vector gather first-fault loads 2018-10-08 14:55:03 +01:00
helper.c arm: Allow system registers for KVM guests to be changed by QEMU code 2019-02-15 09:56:39 +00:00
helper.h target/arm: Move helper_exception_return to helper-a64.c 2019-01-21 10:38:53 +00:00
idau.h qom: make interface types abstract 2018-12-11 15:45:22 -02:00
internals.h target/arm: Compute TB_FLAGS for TBI for user-only 2019-02-05 16:52:40 +00:00
iwmmxt_helper.c target/arm: Untabify iwmmxt_helper.c 2018-08-24 13:17:48 +01:00
kvm32.c arm: Allow system registers for KVM guests to be changed by QEMU code 2019-02-15 09:56:39 +00:00
kvm64.c arm: Allow system registers for KVM guests to be changed by QEMU code 2019-02-15 09:56:39 +00:00
kvm_arm.h target/arm: Install ARMISARegisters from kvm host 2018-11-19 15:29:07 +00:00
kvm-consts.h arm: add trailing ; after MISMATCH_CHECK 2017-02-01 03:37:18 +02:00
kvm-stub.c
kvm.c qemu/queue.h: leave head structs anonymous unless necessary 2019-01-11 15:46:55 +01:00
machine.c arm: Allow system registers for KVM guests to be changed by QEMU code 2019-02-15 09:56:39 +00:00
Makefile.objs target/arm: Add PAuth helpers 2019-01-21 10:38:53 +00:00
monitor.c qapi: Empty out qapi-schema.json 2018-03-02 13:45:50 -06:00
neon_helper.c target: Do not include "exec/exec-all.h" if it is not necessary 2018-06-01 14:15:10 +02:00
op_addsub.h
op_helper.c target/arm: Move helper_exception_return to helper-a64.c 2019-01-21 10:38:53 +00:00
pauth_helper.c target/arm: Implement pauth_computepac 2019-01-21 10:38:55 +00:00
psci.c target: Do not include "exec/exec-all.h" if it is not necessary 2018-06-01 14:15:10 +02:00
sve_helper.c target/arm/sve_helper: Fix compilation with clang 3.4 2018-11-28 15:31:15 +00:00
sve.decode target/arm: SVE brk[ab] merging does not have s bit 2019-01-07 15:23:45 +00:00
trace-events target/arm/kvm: Translate the MSI doorbell in kvm_arch_fixup_msi_route 2018-05-04 18:52:58 +01:00
translate-a64.c target/arm: Clean TBI for data operations in the translator 2019-02-05 16:52:40 +00:00
translate-a64.h target/arm: Extend vec_reg_offset to larger sizes 2018-06-15 15:23:34 +01:00
translate-sve.c decodetree: Remove "insn" argument from trans_* expanders 2018-10-31 16:48:54 +00:00
translate.c target/arm: Emit barriers for A32/T32 load-acquire/store-release insns 2019-01-07 15:23:48 +00:00
translate.h target/arm: Add TBFLAG_A64_TBID, split out gen_top_byte_ignore 2019-02-05 16:52:39 +00:00
vec_helper.c target/arm: Implement SVE dot product (indexed) 2018-06-29 15:11:15 +01:00