@@ -527,19 +527,17 @@ static int kvm_eiointc_regs_access(struct kvm_device *dev,
527527
528528static int kvm_eiointc_sw_status_access (struct kvm_device * dev ,
529529 struct kvm_device_attr * attr ,
530- bool is_write )
530+ bool is_write , int * data )
531531{
532532 int addr , ret = 0 ;
533533 unsigned long flags ;
534534 void * p = NULL ;
535- void __user * data ;
536535 struct loongarch_eiointc * s ;
537536
538537 s = dev -> kvm -> arch .eiointc ;
539538 addr = attr -> attr ;
540539 addr &= 0xffff ;
541540
542- data = (void __user * )attr -> addr ;
543541 switch (addr ) {
544542 case KVM_DEV_LOONGARCH_EXTIOI_SW_STATUS_NUM_CPU :
545543 if (is_write )
@@ -561,13 +559,10 @@ static int kvm_eiointc_sw_status_access(struct kvm_device *dev,
561559 return - EINVAL ;
562560 }
563561 spin_lock_irqsave (& s -> lock , flags );
564- if (is_write ) {
565- if (copy_from_user (p , data , 4 ))
566- ret = - EFAULT ;
567- } else {
568- if (copy_to_user (data , p , 4 ))
569- ret = - EFAULT ;
570- }
562+ if (is_write )
563+ memcpy (p , data , 4 );
564+ else
565+ memcpy (data , p , 4 );
571566 spin_unlock_irqrestore (& s -> lock , flags );
572567
573568 return ret ;
@@ -589,7 +584,14 @@ static int kvm_eiointc_get_attr(struct kvm_device *dev,
589584
590585 return ret ;
591586 case KVM_DEV_LOONGARCH_EXTIOI_GRP_SW_STATUS :
592- return kvm_eiointc_sw_status_access (dev , attr , false);
587+ ret = kvm_eiointc_sw_status_access (dev , attr , false, & data );
588+ if (ret )
589+ return ret ;
590+
591+ if (copy_to_user ((void __user * )attr -> addr , & data , 4 ))
592+ ret = - EFAULT ;
593+
594+ return ret ;
593595 default :
594596 return - EINVAL ;
595597 }
@@ -609,7 +611,10 @@ static int kvm_eiointc_set_attr(struct kvm_device *dev,
609611
610612 return kvm_eiointc_regs_access (dev , attr , true, & data );
611613 case KVM_DEV_LOONGARCH_EXTIOI_GRP_SW_STATUS :
612- return kvm_eiointc_sw_status_access (dev , attr , true);
614+ if (copy_from_user (& data , (void __user * )attr -> addr , 4 ))
615+ return - EFAULT ;
616+
617+ return kvm_eiointc_sw_status_access (dev , attr , true, & data );
613618 default :
614619 return - EINVAL ;
615620 }
0 commit comments