Auger Eric <eric.au...@redhat.com> writes:

> Hi Peter, Alex,
> On 2/14/19 8:05 PM, Peter Maydell wrote:
>> 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.mayd...@linaro.org>
>> Reviewed-by: Alex Bennée <alex.ben...@linaro.org>
>> Tested-by: Alex Bennée <alex.ben...@linaro.org>
>> Tested-by: Dongjiu Geng <gengdong...@huawei.com>
> This commit introduces a regression when running with EDK2 FW:
>
> I get the following traces:
>
> error: kvm run failed Function not implemented
>  PC=000000013f5a6208 X00=00000000404003c4 X01=000000000000003a

Any chance of attaching to the gdbstub and an x/10i around that PC?

--
Alex Bennée

Reply via email to