Hi Marc, > -----Original Message----- > From: Marc Zyngier <maz@xxxxxxxxxx> > Sent: Tuesday, January 7, 2020 5:16 PM > To: Jianyong Wu <Jianyong.Wu@xxxxxxx> > Cc: netdev@xxxxxxxxxxxxxxx; yangbo.lu@xxxxxxx; john.stultz@xxxxxxxxxx; > tglx@xxxxxxxxxxxxx; pbonzini@xxxxxxxxxx; sean.j.christopherson@xxxxxxxxx; > richardcochran@xxxxxxxxx; Mark Rutland <Mark.Rutland@xxxxxxx>; > will@xxxxxxxxxx; Suzuki Poulose <Suzuki.Poulose@xxxxxxx>; Steven Price > <Steven.Price@xxxxxxx>; linux-kernel@xxxxxxxxxxxxxxx; linux-arm- > kernel@xxxxxxxxxxxxxxxxxxx; kvmarm@xxxxxxxxxxxxxxxxxxxxx; > kvm@xxxxxxxxxxxxxxx; Steve Capper <Steve.Capper@xxxxxxx>; Kaly Xin > <Kaly.Xin@xxxxxxx>; Justin He <Justin.He@xxxxxxx>; nd <nd@xxxxxxx> > Subject: Re: [RFC PATCH v9 6/8] psci: Add hvc call service for ptp_kvm. > > On 2019-12-10 03:40, Jianyong Wu wrote: > > ptp_kvm modules will call hvc to get this service. > > The service offers real time and counter cycle of host for guest. > > > > Signed-off-by: Jianyong Wu <jianyong.wu@xxxxxxx> > > --- > > include/linux/arm-smccc.h | 12 ++++++++++++ > > virt/kvm/arm/psci.c | 22 ++++++++++++++++++++++ > > 2 files changed, 34 insertions(+) > > > > diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h > > index 6f82c87308ed..aafb6bac167d 100644 > > --- a/include/linux/arm-smccc.h > > +++ b/include/linux/arm-smccc.h > > @@ -94,6 +94,7 @@ > > > > /* KVM "vendor specific" services */ > > #define ARM_SMCCC_KVM_FUNC_FEATURES 0 > > +#define ARM_SMCCC_KVM_PTP 1 > > #define ARM_SMCCC_KVM_FUNC_FEATURES_2 127 > > #define ARM_SMCCC_KVM_NUM_FUNCS 128 > > > > @@ -103,6 +104,17 @@ > > ARM_SMCCC_OWNER_VENDOR_HYP, > \ > > ARM_SMCCC_KVM_FUNC_FEATURES) > > > > +/* > > + * This ID used for virtual ptp kvm clock and it will pass second > > value > > + * and nanosecond value of host real time and system counter by vcpu > > + * register to guest. > > + */ > > +#define ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID > \ > > + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, > \ > > + ARM_SMCCC_SMC_32, > \ > > + ARM_SMCCC_OWNER_VENDOR_HYP, > \ > > + ARM_SMCCC_KVM_PTP) > > + > > All of this depends on patches that have never need posted to any ML, and > just linger in Will's tree. You need to pick them up and post them as part of > this series so that they can at least be reviewed. > Ok, I will add them next version. > > #ifndef __ASSEMBLY__ > > > > #include <linux/linkage.h> > > diff --git a/virt/kvm/arm/psci.c b/virt/kvm/arm/psci.c index > > 0debf49bf259..682d892d6717 100644 > > --- a/virt/kvm/arm/psci.c > > +++ b/virt/kvm/arm/psci.c > > @@ -9,6 +9,7 @@ > > #include <linux/kvm_host.h> > > #include <linux/uaccess.h> > > #include <linux/wait.h> > > +#include <linux/clocksource_ids.h> > > > > #include <asm/cputype.h> > > #include <asm/kvm_emulate.h> > > @@ -389,6 +390,8 @@ static int kvm_psci_call(struct kvm_vcpu *vcpu) > > > > int kvm_hvc_call_handler(struct kvm_vcpu *vcpu) { > > + struct system_time_snapshot systime_snapshot; > > + u64 cycles; > > u32 func_id = smccc_get_function(vcpu); > > u32 val[4] = {}; > > u32 option; > > @@ -431,6 +434,25 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu) > > case ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID: > > val[0] = BIT(ARM_SMCCC_KVM_FUNC_FEATURES); > > break; > > + /* > > + * This will used for virtual ptp kvm clock. three > > + * values will be passed back. > > + * reg0 stores high 32-bit host ktime; > > + * reg1 stores low 32-bit host ktime; > > + * reg2 stores high 32-bit difference of host cycles and cntvoff; > > + * reg3 stores low 32-bit difference of host cycles and cntvoff. > > That's either two or four values, and not three as you claim above. > Sorry, I'm not sure what do you mean "three", the registers here is 4 from reg0 to reg3. > Also, I fail to understand the meaning of the host cycle vs cntvoff comparison. > This is something that guest can perform on its own (it has access to both > physical and virtual timers, and can compute cntvoff without intervention of > the hypervisor). > To keep consistency and precision, clock time and counter cycle must captured at the same time. It will perform at ktime_get_snapshot. > Finally, how does it work with nested virt, where cntvoff is for the the vEL2 > guest? > For now, I have not considered ptp_kvm in nested virtualization. Also I'm not sure about if nested virtualization is ready on arm64 , as I need test ptp_kvm on it. If so, I can consider it. > > + */ > > + case ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID: > > + ktime_get_snapshot(&systime_snapshot); > > + if (systime_snapshot.cs_id != CSID_ARM_ARCH_COUNTER) > > + return kvm_psci_call(vcpu); > > What does this mean? Calling PSCI because you've failed to identify the clock > source? What result do you expect from this? Hint: this isn't a PSCI call. > Sorry, what I want to do here is that return to guest with the error info. Maybe I should set val[0] to -1 and break to let the guest know that error comes, as the guest will check if val[0] is positive to determine the next step. > Cosmetic comments below: > > > + val[0] = systime_snapshot.real >> 32; > > val[0] = upper_32_bits(systime_snapshot.real); Ok > > > + val[1] = systime_snapshot.real << 32 >> 32; > > val[1] = lower_32_bits(systime_snapshot.real); > Yeah > > + cycles = systime_snapshot.cycles - > > + vcpu_vtimer(vcpu)->cntvoff; > > On a single line please. > ok > > + val[2] = cycles >> 32; > > + val[3] = cycles << 32 >> 32; > > Same as above. > yeah > > + break; > > default: > > return kvm_psci_call(vcpu); > > } > Thanks Jianyong > Thanks, > > M. > -- > Jazz is not dead. It just smells funny...