On Mon, Mar 27, 2017 at 05:03:36PM +0100, Marc Zyngier wrote: > Running the following code: > > root@zomby-woof:~# cat test-pmu.c > int main(int argc, char *argv[]) > { > unsigned int val; > asm ("mrc p15, 0, %0, c9, c13, 0\n" : "=r" (val)); > return val; > } > > in a 32bit guest (or a 64bit guest with a 32bit userspace) results in > this surprising result: > > [ 120.347497] kvm [1150]: Unsupported guest CP15 access at: ab0945ae > [ 120.353689] kvm [1142]: { Op0( 0), Op1( 0), CRn( 9), CRm(13), Op2( 0), func_read }, > > which is weird, because the guest behaves correctly: > root@zomby-woof:~# ./test-pmu > [ 16.184422] test-pmu[740]: undefined instruction: pc=00000000ab0945ae > [ 16.186043] Code: 00340001 b4800000 af00b085 60396078 (3f1dee19) > Illegal instruction > > It gets the expected UNDEF, and all is fine. So what? > > It turns out that the PMU emulation code is a bit lazy, and tells the > rest of KVM that the emulation has failed, so that an exception gets > delivered. Subtle differences in the 32bit vs 64bit handling make it > spit an "Unsupported..." error. > > This series tries to set things straight: > - Make all PMU illegal accesses inject an UNDEF > - Make these illegal accesses a successful emulation w.r.t the rest of KVM. > > In the process, we also squash an interesting bug in the 64bit CP > access. Similar treatment is applied to the 32bit kernel, except that > we don't ever inject an exception there (no PMU support yet). > I have applied this series to queue (not next since I haven't tested thoroughly yet), with the fixups agreed in the series. Thanks, -Christoffer