@@ -2305,7 +2305,7 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
23052305 * val = get_reg_val (id , kvmppc_get_siar_hv (vcpu ));
23062306 break ;
23072307 case KVM_REG_PPC_SDAR :
2308- * val = get_reg_val (id , kvmppc_get_siar_hv (vcpu ));
2308+ * val = get_reg_val (id , kvmppc_get_sdar_hv (vcpu ));
23092309 break ;
23102310 case KVM_REG_PPC_SIER :
23112311 * val = get_reg_val (id , kvmppc_get_sier_hv (vcpu , 0 ));
@@ -2349,6 +2349,15 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
23492349 case KVM_REG_PPC_DAWRX1 :
23502350 * val = get_reg_val (id , kvmppc_get_dawrx1_hv (vcpu ));
23512351 break ;
2352+ case KVM_REG_PPC_DEXCR :
2353+ * val = get_reg_val (id , kvmppc_get_dexcr_hv (vcpu ));
2354+ break ;
2355+ case KVM_REG_PPC_HASHKEYR :
2356+ * val = get_reg_val (id , kvmppc_get_hashkeyr_hv (vcpu ));
2357+ break ;
2358+ case KVM_REG_PPC_HASHPKEYR :
2359+ * val = get_reg_val (id , kvmppc_get_hashpkeyr_hv (vcpu ));
2360+ break ;
23522361 case KVM_REG_PPC_CIABR :
23532362 * val = get_reg_val (id , kvmppc_get_ciabr_hv (vcpu ));
23542363 break ;
@@ -2540,7 +2549,7 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
25402549 vcpu -> arch .mmcrs = set_reg_val (id , * val );
25412550 break ;
25422551 case KVM_REG_PPC_MMCR3 :
2543- * val = get_reg_val (id , vcpu -> arch . mmcr [ 3 ] );
2552+ kvmppc_set_mmcr_hv ( vcpu , 3 , set_reg_val (id , * val ) );
25442553 break ;
25452554 case KVM_REG_PPC_PMC1 ... KVM_REG_PPC_PMC8 :
25462555 i = id - KVM_REG_PPC_PMC1 ;
@@ -2592,6 +2601,15 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
25922601 case KVM_REG_PPC_DAWRX1 :
25932602 kvmppc_set_dawrx1_hv (vcpu , set_reg_val (id , * val ) & ~DAWRX_HYP );
25942603 break ;
2604+ case KVM_REG_PPC_DEXCR :
2605+ kvmppc_set_dexcr_hv (vcpu , set_reg_val (id , * val ));
2606+ break ;
2607+ case KVM_REG_PPC_HASHKEYR :
2608+ kvmppc_set_hashkeyr_hv (vcpu , set_reg_val (id , * val ));
2609+ break ;
2610+ case KVM_REG_PPC_HASHPKEYR :
2611+ kvmppc_set_hashpkeyr_hv (vcpu , set_reg_val (id , * val ));
2612+ break ;
25952613 case KVM_REG_PPC_CIABR :
25962614 kvmppc_set_ciabr_hv (vcpu , set_reg_val (id , * val ));
25972615 /* Don't allow setting breakpoints in hypervisor code */
@@ -4108,6 +4126,77 @@ static void vcpu_vpa_increment_dispatch(struct kvm_vcpu *vcpu)
41084126 }
41094127}
41104128
4129+ /* Helper functions for reading L2's stats from L1's VPA */
4130+ #ifdef CONFIG_PPC_PSERIES
4131+ static DEFINE_PER_CPU (u64 , l1_to_l2_cs ) ;
4132+ static DEFINE_PER_CPU (u64 , l2_to_l1_cs ) ;
4133+ static DEFINE_PER_CPU (u64 , l2_runtime_agg ) ;
4134+
4135+ int kvmhv_get_l2_counters_status (void )
4136+ {
4137+ return firmware_has_feature (FW_FEATURE_LPAR ) &&
4138+ get_lppaca ()-> l2_counters_enable ;
4139+ }
4140+
4141+ void kvmhv_set_l2_counters_status (int cpu , bool status )
4142+ {
4143+ if (!firmware_has_feature (FW_FEATURE_LPAR ))
4144+ return ;
4145+ if (status )
4146+ lppaca_of (cpu ).l2_counters_enable = 1 ;
4147+ else
4148+ lppaca_of (cpu ).l2_counters_enable = 0 ;
4149+ }
4150+
4151+ int kmvhv_counters_tracepoint_regfunc (void )
4152+ {
4153+ int cpu ;
4154+
4155+ for_each_present_cpu (cpu ) {
4156+ kvmhv_set_l2_counters_status (cpu , true);
4157+ }
4158+ return 0 ;
4159+ }
4160+
4161+ void kmvhv_counters_tracepoint_unregfunc (void )
4162+ {
4163+ int cpu ;
4164+
4165+ for_each_present_cpu (cpu ) {
4166+ kvmhv_set_l2_counters_status (cpu , false);
4167+ }
4168+ }
4169+
4170+ static void do_trace_nested_cs_time (struct kvm_vcpu * vcpu )
4171+ {
4172+ struct lppaca * lp = get_lppaca ();
4173+ u64 l1_to_l2_ns , l2_to_l1_ns , l2_runtime_ns ;
4174+ u64 * l1_to_l2_cs_ptr = this_cpu_ptr (& l1_to_l2_cs );
4175+ u64 * l2_to_l1_cs_ptr = this_cpu_ptr (& l2_to_l1_cs );
4176+ u64 * l2_runtime_agg_ptr = this_cpu_ptr (& l2_runtime_agg );
4177+
4178+ l1_to_l2_ns = tb_to_ns (be64_to_cpu (lp -> l1_to_l2_cs_tb ));
4179+ l2_to_l1_ns = tb_to_ns (be64_to_cpu (lp -> l2_to_l1_cs_tb ));
4180+ l2_runtime_ns = tb_to_ns (be64_to_cpu (lp -> l2_runtime_tb ));
4181+ trace_kvmppc_vcpu_stats (vcpu , l1_to_l2_ns - * l1_to_l2_cs_ptr ,
4182+ l2_to_l1_ns - * l2_to_l1_cs_ptr ,
4183+ l2_runtime_ns - * l2_runtime_agg_ptr );
4184+ * l1_to_l2_cs_ptr = l1_to_l2_ns ;
4185+ * l2_to_l1_cs_ptr = l2_to_l1_ns ;
4186+ * l2_runtime_agg_ptr = l2_runtime_ns ;
4187+ }
4188+
4189+ #else
4190+ int kvmhv_get_l2_counters_status (void )
4191+ {
4192+ return 0 ;
4193+ }
4194+
4195+ static void do_trace_nested_cs_time (struct kvm_vcpu * vcpu )
4196+ {
4197+ }
4198+ #endif
4199+
41114200static int kvmhv_vcpu_entry_nestedv2 (struct kvm_vcpu * vcpu , u64 time_limit ,
41124201 unsigned long lpcr , u64 * tb )
41134202{
@@ -4116,6 +4205,11 @@ static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,
41164205 int trap ;
41174206 long rc ;
41184207
4208+ if (vcpu -> arch .doorbell_request ) {
4209+ vcpu -> arch .doorbell_request = 0 ;
4210+ kvmppc_set_dpdes (vcpu , 1 );
4211+ }
4212+
41194213 io = & vcpu -> arch .nestedv2_io ;
41204214
41214215 msr = mfmsr ();
@@ -4156,6 +4250,10 @@ static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,
41564250
41574251 timer_rearm_host_dec (* tb );
41584252
4253+ /* Record context switch and guest_run_time data */
4254+ if (kvmhv_get_l2_counters_status ())
4255+ do_trace_nested_cs_time (vcpu );
4256+
41594257 return trap ;
41604258}
41614259
@@ -6519,6 +6617,7 @@ static void kvmppc_book3s_exit_hv(void)
65196617
65206618module_init (kvmppc_book3s_init_hv );
65216619module_exit (kvmppc_book3s_exit_hv );
6620+ MODULE_DESCRIPTION ("KVM on Book3S (POWER8 and later) in hypervisor mode" );
65226621MODULE_LICENSE ("GPL" );
65236622MODULE_ALIAS_MISCDEV (KVM_MINOR );
65246623MODULE_ALIAS ("devname:kvm" );
0 commit comments