@@ -467,19 +467,17 @@ static int kvm_eiointc_ctrl_access(struct kvm_device *dev,
467467
468468static int kvm_eiointc_regs_access (struct kvm_device * dev ,
469469 struct kvm_device_attr * attr ,
470- bool is_write )
470+ bool is_write , int * data )
471471{
472472 int addr , cpu , offset , ret = 0 ;
473473 unsigned long flags ;
474474 void * p = NULL ;
475- void __user * data ;
476475 struct loongarch_eiointc * s ;
477476
478477 s = dev -> kvm -> arch .eiointc ;
479478 addr = attr -> attr ;
480479 cpu = addr >> 16 ;
481480 addr &= 0xffff ;
482- data = (void __user * )attr -> addr ;
483481 switch (addr ) {
484482 case EIOINTC_NODETYPE_START ... EIOINTC_NODETYPE_END :
485483 offset = (addr - EIOINTC_NODETYPE_START ) / 4 ;
@@ -518,13 +516,10 @@ static int kvm_eiointc_regs_access(struct kvm_device *dev,
518516 }
519517
520518 spin_lock_irqsave (& s -> lock , flags );
521- if (is_write ) {
522- if (copy_from_user (p , data , 4 ))
523- ret = - EFAULT ;
524- } else {
525- if (copy_to_user (data , p , 4 ))
526- ret = - EFAULT ;
527- }
519+ if (is_write )
520+ memcpy (p , data , 4 );
521+ else
522+ memcpy (data , p , 4 );
528523 spin_unlock_irqrestore (& s -> lock , flags );
529524
530525 return ret ;
@@ -581,9 +576,18 @@ static int kvm_eiointc_sw_status_access(struct kvm_device *dev,
581576static int kvm_eiointc_get_attr (struct kvm_device * dev ,
582577 struct kvm_device_attr * attr )
583578{
579+ int ret , data ;
580+
584581 switch (attr -> group ) {
585582 case KVM_DEV_LOONGARCH_EXTIOI_GRP_REGS :
586- return kvm_eiointc_regs_access (dev , attr , false);
583+ ret = kvm_eiointc_regs_access (dev , attr , false, & data );
584+ if (ret )
585+ return ret ;
586+
587+ if (copy_to_user ((void __user * )attr -> addr , & data , 4 ))
588+ ret = - EFAULT ;
589+
590+ return ret ;
587591 case KVM_DEV_LOONGARCH_EXTIOI_GRP_SW_STATUS :
588592 return kvm_eiointc_sw_status_access (dev , attr , false);
589593 default :
@@ -594,11 +598,16 @@ static int kvm_eiointc_get_attr(struct kvm_device *dev,
594598static int kvm_eiointc_set_attr (struct kvm_device * dev ,
595599 struct kvm_device_attr * attr )
596600{
601+ int data ;
602+
597603 switch (attr -> group ) {
598604 case KVM_DEV_LOONGARCH_EXTIOI_GRP_CTRL :
599605 return kvm_eiointc_ctrl_access (dev , attr );
600606 case KVM_DEV_LOONGARCH_EXTIOI_GRP_REGS :
601- return kvm_eiointc_regs_access (dev , attr , true);
607+ if (copy_from_user (& data , (void __user * )attr -> addr , 4 ))
608+ return - EFAULT ;
609+
610+ return kvm_eiointc_regs_access (dev , attr , true, & data );
602611 case KVM_DEV_LOONGARCH_EXTIOI_GRP_SW_STATUS :
603612 return kvm_eiointc_sw_status_access (dev , attr , true);
604613 default :
0 commit comments