Bug 213257

Summary: KVM-PR: FPU is broken when single-stepping
Product: Virtualization Reporter: Lauri Kasanen (cand)
Component: kvmAssignee: virtualization_kvm
Status: NEW ---    
Severity: normal CC: lkcl
Priority: P1    
Hardware: PPC-64   
OS: Linux   
Kernel Version: 5.6 Subsystem:
Regression: No Bisected commit-id:

Description Lauri Kasanen 2021-05-28 11:20:22 UTC
The FPU is completely broken when single-stepping on KVM-PR. Registers stay zeroes, computation results are zeroes. If I disable single-stepping, computation results are correct, but of course then I cannot dump FPRs between every instruction.

HW is POWER9, 18-core Talos II.

5.6 is slightly old, but there are no commits under arch/powerpc/kvm since that mention single stepping.

Program:
https://git.libre-soc.org/?p=kvm-minippc.git;a=summary

Test file:
https://ftp.libre-soc.org/mini-float-test-kvm.bin

Repro instructions:
git clone https://git.libre-soc.org/git/kvm-minippc.git
cd kvm-minippc
make

wget https://ftp.libre-soc.org/mini-float-test-kvm.bin
./kvm-minippc -i mini-float-test-kvm.bin -t trace
less trace
# you will see FPRs stay zeroes. In larger test programs that dump the computed memory, that is wrong too (all zero).
Comment 1 Luke Kenneth Casson Leighton 2021-05-31 10:28:54 UTC
the module being used is kvm_pr not kvm_hv.
Comment 2 Luke Kenneth Casson Leighton 2021-06-01 00:12:59 UTC
out of interest if the bottom half of vs0-vs31 is read (or written),
are those also zero?

completely unrelated i am running into a gdb machine-interface bug
which has been "solved" through the workaround of reading/writing
the lower 64 bits of VSX registers instead of fp0-fp31
Comment 3 Lauri Kasanen 2021-06-01 07:35:40 UTC
That's probably not worth trying, since the computation results were
also wrong. The computation does not rely on register setting, it
loads, computes and saves entirely in code.
Comment 4 Luke Kenneth Casson Leighton 2021-06-01 12:34:08 UTC
(In reply to Lauri Kasanen from comment #3)
> That's probably not worth trying, since the computation results were
> also wrong.

ok. and the initial setup starts from a blank FPU, no host modification of FPRs needed

> The computation does not rely on register setting, it
> loads, computes and saves entirely in code.

i realised i just said this exact thing, above, in a different way.

and is it the case that the minippc kvm host program is not attempting to read (or write) the FPR regfile after each guest singlestep?

not that i would expect reading of the FPR regfile from the host to affect the guest, but it's worth confirming.

trying to think, how else can this be debugged, to find out what's going on?