OSDN Git Service

arm: Allow system registers for KVM guests to be changed by QEMU code
authorPeter Maydell <peter.maydell@linaro.org>
Tue, 7 May 2019 11:55:02 +0000 (12:55 +0100)
committerPeter Maydell <peter.maydell@linaro.org>
Tue, 7 May 2019 11:55:02 +0000 (12:55 +0100)
commitb698e4eef5111e2df7598261b09dcef8249b7ae6
tree873f24bb52928958f671fe55185eea73a8e77f65
parentff3dcf28c0b7a3ac261399c3754bf2f410c2e91e
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.

This commit is the same as commit 823e1b3818f9b10b824ddc which we
had to revert in commit 942f99c825fc94c8b1a4, except that the bug
which was preventing EDK2 guest firmware running has been fixed:
kvm_arm_reset_vcpu() now calls write_list_to_cpustate().

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Eric Auger <eric.auger@redhat.com>
target/arm/cpu.h
target/arm/helper.c
target/arm/kvm.c
target/arm/kvm32.c
target/arm/kvm64.c
target/arm/machine.c