| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2] x86: Fix XEN_DOMCTL_gdbsx_guestmemio crash
 On 25/04/2022 12:04, Jan Beulich wrote:
> On 25.04.2022 12:06, Andrew Cooper wrote:
>> @@ -178,6 +179,71 @@ void domain_pause_for_debugger(void)
>>          send_global_virq(VIRQ_DEBUGGER);
>>  }
>>  
>> +long gdbsx_domctl(struct domain *d, struct xen_domctl *domctl, bool 
>> *copyback)
> Is there anything that requires "long" (and not just "int") here and ...
>
>> +{
>> +    struct vcpu *v;
>> +    long ret = 0;
> ... here?
Consistency with its caller.
Although I can't actually see a good reason for arch_do_domctl() to use
long's either, and that would at least mean we've only got one place
doing extension of ret.
>
>> +    switch ( domctl->cmd )
>> +    {
>> +    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:
>> +        ret = -EBUSY;
>> +        if ( !d->controller_pause_count )
>> +            break;
>> +        ret = -EINVAL;
>> +        if ( (v = domain_vcpu(d, domctl->u.gdbsx_pauseunp_vcpu.vcpu)) == 
>> NULL )
>> +            break;
>> +        ret = vcpu_pause_by_systemcontroller(v);
>> +        break;
>> +
>> +    case XEN_DOMCTL_gdbsx_unpausevcpu:
>> +        ret = -EBUSY;
>> +        if ( !d->controller_pause_count )
>> +            break;
>> +        ret = -EINVAL;
>> +        if ( (v = domain_vcpu(d, domctl->u.gdbsx_pauseunp_vcpu.vcpu)) == 
>> NULL )
>> +            break;
>> +        ret = vcpu_unpause_by_systemcontroller(v);
>> +        if ( ret == -EINVAL )
>> +            printk(XENLOG_G_WARNING
>> +                   "WARN: %pd attempting to unpause %pv which is not 
>> paused\n",
>> +                   current->domain, v);
>> +        break;
>> +
>> +    case XEN_DOMCTL_gdbsx_domstatus:
>> +        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;
>> +        break;
>> +
>> +    default:
>> +        ASSERT_UNREACHABLE();
>> +        ret = -ENOSYS;
>> +    }
> Just as a remark: It's never really clear to me whether we actually want
> to permit omitting "break" in cases like this one.
That was an oversight.  I'd intended to include one.
>> --- a/xen/arch/x86/include/asm/gdbsx.h
>> +++ b/xen/arch/x86/include/asm/gdbsx.h
>> @@ -2,18 +2,27 @@
>>  #ifndef __X86_GDBX_H__
>>  #define __X86_GDBX_H__
>>  
>> -#ifdef CONFIG_GDBSX
>> +#include <xen/stdbool.h>
>>  
>>  struct domain;
>> -struct xen_domctl_gdbsx_memio;
>> +struct xen_domctl;
>>  
>> -int gdbsx_guest_mem_io(struct domain *d, struct xen_domctl_gdbsx_memio 
>> *iop);
>> +#ifdef CONFIG_GDBSX
>>  
>>  void domain_pause_for_debugger(void);
>>  
>> +long gdbsx_domctl(struct domain *d, struct xen_domctl *domctl, bool 
>> *copyback);
>> +
>>  #else
>>  
>> +#include <xen/errno.h>
>> +
>>  static inline void domain_pause_for_debugger(void) {}
>>  
>> +long gdbsx_domctl(struct domain *d, struct xen_domctl *domctl, bool 
>> *copyback)
> static inline?
Oops yes.  I clearly need more coffee.
~Andrew
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |