| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3] x86: Fix XEN_DOMCTL_gdbsx_guestmemio crash
 On 25.04.2022 14:37, Andrew Cooper wrote:
> When CONFIG_GDBSX is compiled out, iommu_do_domctl() falls over a NULL
> pointer.  One of several bugs here is known-but-compiled-out subops falling
> into the default chain and hitting unrelated logic.
> 
> Remove the CONFIG_GDBSX ifdefary in arch_do_domctl() by implementing
> gdbsx_domctl() and moving the logic across.
> 
> As minor cleanup,
>  * gdbsx_guest_mem_io() can become static
>  * Remove opencoding of domain_vcpu() and %pd
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Technically
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Yet as mentioned before, ...
> --- a/xen/arch/x86/domctl.c
> +++ b/xen/arch/x86/domctl.c
> @@ -816,71 +816,12 @@ long arch_do_domctl(
>      }
>  #endif
>  
> -#ifdef CONFIG_GDBSX
>      case XEN_DOMCTL_gdbsx_guestmemio:
> -        ret = gdbsx_guest_mem_io(d, &domctl->u.gdbsx_guest_memio);
> -        if ( !ret )
> -           copyback = true;
> -        break;
> -
>      case XEN_DOMCTL_gdbsx_pausevcpu:
> -    {
> -        struct vcpu *v;
> -
> -        ret = -EBUSY;
> -        if ( !d->controller_pause_count )
> -            break;
> -        ret = -EINVAL;
> -        if ( domctl->u.gdbsx_pauseunp_vcpu.vcpu >= d->max_vcpus ||
> -             (v = d->vcpu[domctl->u.gdbsx_pauseunp_vcpu.vcpu]) == NULL )
> -            break;
> -        ret = vcpu_pause_by_systemcontroller(v);
> -        break;
> -    }
> -
>      case XEN_DOMCTL_gdbsx_unpausevcpu:
> -    {
> -        struct vcpu *v;
> -
> -        ret = -EBUSY;
> -        if ( !d->controller_pause_count )
> -            break;
> -        ret = -EINVAL;
> -        if ( domctl->u.gdbsx_pauseunp_vcpu.vcpu >= d->max_vcpus ||
> -             (v = d->vcpu[domctl->u.gdbsx_pauseunp_vcpu.vcpu]) == NULL )
> -            break;
> -        ret = vcpu_unpause_by_systemcontroller(v);
> -        if ( ret == -EINVAL )
> -            printk(XENLOG_G_WARNING
> -                   "WARN: d%d attempting to unpause %pv which is not 
> paused\n",
> -                   currd->domain_id, v);
> -        break;
> -    }
> -
>      case XEN_DOMCTL_gdbsx_domstatus:
> -    {
> -        struct vcpu *v;
> -
> -        domctl->u.gdbsx_domstatus.vcpu_id = -1;
> -        domctl->u.gdbsx_domstatus.paused = d->controller_pause_count > 0;
> -        if ( domctl->u.gdbsx_domstatus.paused )
> -        {
> -            for_each_vcpu ( d, v )
> -            {
> -                if ( v->arch.gdbsx_vcpu_event )
> -                {
> -                    domctl->u.gdbsx_domstatus.vcpu_id = v->vcpu_id;
> -                    domctl->u.gdbsx_domstatus.vcpu_ev =
> -                        v->arch.gdbsx_vcpu_event;
> -                    v->arch.gdbsx_vcpu_event = 0;
> -                    break;
> -                }
> -            }
> -        }
> -        copyback = true;
> +        ret = gdbsx_domctl(d, domctl, ©back);
>          break;
> -    }
> -#endif
... I'm not overly happy with the retaining of the case labels here
(and the knock on effect it'll have for other subsystem domctl-s),
so unlike usually this R-b isn't implicitly an A-b. Which doesn't
matter in practice, aiui ...
Jan
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |