[PATCH v3 4/5] KVM: arm64: Mask out filtered events in PCMEID{0,1}_EL1
Marc Zyngier
maz at kernel.org
Wed Sep 9 13:50:43 EDT 2020
Hi Eric,
On 2020-09-09 18:43, Auger Eric wrote:
> Hi Marc,
>
> On 9/8/20 9:58 AM, Marc Zyngier wrote:
>> As we can now hide events from the guest, let's also adjust its view
>> of
>> PCMEID{0,1}_EL1 so that it can figure out why some common events are
>> not
>> counting as they should.
> Referring to my previous comment should we filter the cycle counter
> out?
>>
>> The astute user can still look into the TRM for their CPU and find out
>> they've been cheated, though. Nobody's perfect.
>>
>> Signed-off-by: Marc Zyngier <maz at kernel.org>
>> ---
>> arch/arm64/kvm/pmu-emul.c | 29 +++++++++++++++++++++++++++++
>> arch/arm64/kvm/sys_regs.c | 5 +----
>> include/kvm/arm_pmu.h | 5 +++++
>> 3 files changed, 35 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/arm64/kvm/pmu-emul.c b/arch/arm64/kvm/pmu-emul.c
>> index 67a731bafbc9..0458860bade2 100644
>> --- a/arch/arm64/kvm/pmu-emul.c
>> +++ b/arch/arm64/kvm/pmu-emul.c
>> @@ -765,6 +765,35 @@ static int kvm_pmu_probe_pmuver(void)
>> return pmuver;
>> }
>>
>> +u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmceid1)
>> +{
>> + unsigned long *bmap = vcpu->kvm->arch.pmu_filter;
>> + u64 val, mask = 0;
>> + int base, i;
>> +
>> + if (!pmceid1) {
>> + val = read_sysreg(pmceid0_el0);
>> + base = 0;
>> + } else {
>> + val = read_sysreg(pmceid1_el0);
>> + base = 32;
>> + }
>> +
>> + if (!bmap)
>> + return val;
>> +
>> + for (i = 0; i < 32; i += 8) {
> s/32/4?
I don't think so, see below.
>
> Thanks
>
> Eric
>> + u64 byte;
>> +
>> + byte = bitmap_get_value8(bmap, base + i);
>> + mask |= byte << i;
For each iteration of the loop, we read a byte from the bitmap
(hence the += 8 above), and orr it into the mask. This makes 4
iteration of the loop.
Or am I missing your point entirely?
Thanks,
M.
--
Jazz is not dead. It just smells funny...
More information about the linux-arm-kernel
mailing list