[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] possible changes was Re: [PATCH] make domu_debug run-time option + fix int3 handling for MP


  • To: xen-devel@xxxxxxxxxxxxxxxxxxx
  • From: Kip Macy <kmacy@xxxxxxxxxx>
  • Date: Mon, 16 May 2005 12:07:16 -0700 (PDT)
  • Delivery-date: Mon, 16 May 2005 19:06:51 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

I can chunk this into 3 or 4 patches and make enabling domu_debug a separate 
DOM0 operation. Would this be more palatable?




On Sun, 15 May 2005, Kip Macy wrote:

> I'm not entirely thrilled with the interfaces used to get the domu_debug 
> option 
> into xen, but adding yet another argument xc_linux_build and/or adding a 
> separate handler for domu_debug didn't seem that clean either. The debug 
> support 
> doesn't seem like something Ron would use, so I didn't update the Plan 9 
> builder.
> 
> Feedback would be appreciated.
> 
> 
> # This is a BitKeeper generated diff -Nru style patch.
> #
> # ChangeSet
> #   2005/05/15 18:19:15-07:00 kmacy@xxxxxxxxxxxxxxxxxxxxxx 
> #   make domu_debug domain-builder/run-time option
> #   pause all vcpus on int3 / trace trap
> #   make domu_debug and cdb not be mutually exclusive
> #   Signed-off-by: Kip Macy <kmacy@xxxxxxxxxx>
> # 
> # xen/include/xen/sched.h
> #   2005/05/15 18:19:13-07:00 kmacy@xxxxxxxxxxxxxxxxxxxxxx +3 -0
> #   add DOMF_debug flag
> # 
> # xen/include/public/dom0_ops.h
> #   2005/05/15 18:19:13-07:00 kmacy@xxxxxxxxxxxxxxxxxxxxxx +2 -0
> #   add flags field to setdomaininfo to enable domu_debug
> # 
> # xen/include/asm-x86/debugger.h
> #   2005/05/15 18:19:13-07:00 kmacy@xxxxxxxxxxxxxxxxxxxxxx +24 -24
> #   pause vcpus on int3 or trace trap
> #   enable domu_debug by default
> #   make cdb and domu_debug not be mutually exclusive
> # 
> # xen/common/domain.c
> #   2005/05/15 18:19:13-07:00 kmacy@xxxxxxxxxxxxxxxxxxxxxx +5 -0
> #   toggle DOMF_debug depending on value passed with 
> #   setdomaininfo
> # 
> # xen/Rules.mk
> #   2005/05/15 18:19:12-07:00 kmacy@xxxxxxxxxxxxxxxxxxxxxx +0 -5
> #   remove domu_debug from compile
> # 
> # tools/python/xen/xm/create.py
> #   2005/05/15 18:19:12-07:00 kmacy@xxxxxxxxxxxxxxxxxxxxxx +7 -0
> #   add domu_debug option
> # 
> # tools/python/xen/xend/XendDomainInfo.py
> #   2005/05/15 18:19:12-07:00 kmacy@xxxxxxxxxxxxxxxxxxxxxx +7 -0
> #   pass debug flag to domain builder if option set
> # 
> # tools/libxc/xc_vmx_build.c
> #   2005/05/15 18:19:12-07:00 kmacy@xxxxxxxxxxxxxxxxxxxxxx +7 -1
> #   pass debug flags to setdomaininfo
> # 
> # tools/libxc/xc_linux_build.c
> #   2005/05/15 18:19:12-07:00 kmacy@xxxxxxxxxxxxxxxxxxxxxx +7 -2
> #   pass debug flags to setdomaininfo
> # 
> diff -Nru a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c
> --- a/tools/libxc/xc_linux_build.c    2005-05-14 18:24:04 -07:00
> +++ b/tools/libxc/xc_linux_build.c    2005-05-14 18:24:04 -07:00
> @@ -316,12 +316,16 @@
>      int initrd_fd = -1;
>      gzFile initrd_gfd = NULL;
>      int rc, i;
> +    unsigned int debug_flags;
>      vcpu_guest_context_t st_ctxt, *ctxt = &st_ctxt;
>      unsigned long nr_pages;
>      char         *image = NULL;
> -    unsigned long image_size, initrd_size=0;
> +    unsigned long si_flags, image_size, initrd_size=0;
>      unsigned long vstartinfo_start, vkern_entry;
>  
> +    si_flags = flags & ~DOMFLAGS_DOMU_DEBUG;
> +    debug_flags = flags & DOMFLAGS_DOMU_DEBUG; 
> +
>      if ( (nr_pages = xc_get_tot_pages(xc_handle, domid)) < 0 )
>      {
>          PERROR("Could not find total pages for domain");
> @@ -381,7 +385,7 @@
>                         &vstartinfo_start, &vkern_entry,
>                         ctxt, cmdline,
>                         op.u.getdomaininfo.shared_info_frame,
> -                       control_evtchn, flags, vcpus) < 0 )
> +                       control_evtchn, si_flags, vcpus) < 0 )
>      {
>          ERROR("Error constructing guest OS");
>          goto error_out;
> @@ -458,6 +462,7 @@
>      memset( &launch_op, 0, sizeof(launch_op) );
>  
>      launch_op.u.setdomaininfo.domain = (domid_t)domid;
> +    launch_op.u.setdomaininfo.flags  = debug_flags;
>      launch_op.u.setdomaininfo.vcpu   = 0;
>      launch_op.u.setdomaininfo.ctxt   = ctxt;
>  
> diff -Nru a/tools/libxc/xc_vmx_build.c b/tools/libxc/xc_vmx_build.c
> --- a/tools/libxc/xc_vmx_build.c      2005-05-14 18:24:04 -07:00
> +++ b/tools/libxc/xc_vmx_build.c      2005-05-14 18:24:04 -07:00
> @@ -498,11 +498,16 @@
>      int initrd_fd = -1;
>      gzFile initrd_gfd = NULL;
>      int rc, i;
> +    unsigned long si_flags;
> +    unsigned int debug_flags;
>      vcpu_guest_context_t st_ctxt, *ctxt = &st_ctxt;
>      unsigned long nr_pages;
>      char         *image = NULL;
>      unsigned long image_size, initrd_size=0;
>  
> +    debug_flags = flags & DOMFLAGS_DOMU_DEBUG;
> +    si_flags = flags & ~DOMFLAGS_DOMU_DEBUG;
> +
>      if ( vmx_identify() < 0 )
>      {
>          PERROR("CPU doesn't support VMX Extensions");
> @@ -567,7 +572,7 @@
>                         initrd_gfd, initrd_size, nr_pages, 
>                         ctxt, cmdline,
>                         op.u.getdomaininfo.shared_info_frame,
> -                       control_evtchn, flags, mem_mapp) < 0 )
> +                       control_evtchn, si_flags, mem_mapp) < 0 )
>      {
>          ERROR("Error constructing guest OS");
>          goto error_out;
> @@ -624,6 +629,7 @@
>      memset( &launch_op, 0, sizeof(launch_op) );
>  
>      launch_op.u.setdomaininfo.domain = (domid_t)domid;
> +    launch_op.u.setdomaininfo.flags  = debug_flags;  
>      launch_op.u.setdomaininfo.vcpu   = 0;
>      launch_op.u.setdomaininfo.ctxt   = ctxt;
>  
> diff -Nru a/tools/python/xen/xend/XendDomainInfo.py 
> b/tools/python/xen/xend/XendDomainInfo.py
> --- a/tools/python/xen/xend/XendDomainInfo.py 2005-05-14 18:24:04 -07:00
> +++ b/tools/python/xen/xend/XendDomainInfo.py 2005-05-14 18:24:04 -07:00
> @@ -36,6 +36,9 @@
>  """Flag for a net device backend domain."""
>  SIF_NET_BE_DOMAIN = (1<<5)
>  
> +"""Flag for enable unprivileged domain debugging."""
> +DOMFLAGS_DOMU_DEBUG = (1<<6)
> +
>  """Shutdown code for poweroff."""
>  DOMAIN_POWEROFF = 0
>  
> @@ -272,6 +275,7 @@
>          self.ramdisk = None
>          self.cmdline = None
>  
> +        self.domu_debug = 0
>          self.channel = None
>          self.controllers = {}
>          
> @@ -711,6 +715,8 @@
>          flags = 0
>          if self.netif_backend: flags |= SIF_NET_BE_DOMAIN
>          if self.blkif_backend: flags |= SIF_BLK_BE_DOMAIN
> +        if self.domu_debug:    flags |= DOMFLAGS_DOMU_DEBUG
> +        
>          #todo generalise this
>          if ostype == "vmx":
>              err = buildfn(dom            = dom,
> @@ -1114,6 +1120,7 @@
>      if args:
>          cmdline += " " + args
>      ramdisk = sxp.child_value(image, "ramdisk", '')
> +    vm.domu_debug = sxp.child_value(image, "domu_debug", 0)
>      log.debug("creating linux domain with cmdline: %s" %(cmdline,))
>      vm.create_domain("linux", kernel, ramdisk, cmdline)
>      return vm
> diff -Nru a/tools/python/xen/xm/create.py b/tools/python/xen/xm/create.py
> --- a/tools/python/xen/xm/create.py   2005-05-14 18:24:04 -07:00
> +++ b/tools/python/xen/xm/create.py   2005-05-14 18:24:04 -07:00
> @@ -40,6 +40,10 @@
>            fn=set_true, default=0,
>            use="Quiet.")
>  
> +gopts.opt('domu_debug', short='g',
> +          fn=set_true, default=0,
> +          use="Debug.")
> +
>  gopts.opt('path', val='PATH',
>            fn=set_value, default='.:/etc/xen',
>            use="""Search path for configuration scripts.
> @@ -279,6 +283,9 @@
>          config_image.append(['args', vals.extra])
>      if vals.vcpus:
>          config_image.append(['vcpus', vals.vcpus])
> +    if vals.domu_debug:
> +        config_image.append(['domu_debug', vals.domu_debug])
> +
>      config.append(['image', config_image ])
>  
>      
> diff -Nru a/xen/Rules.mk b/xen/Rules.mk
> --- a/xen/Rules.mk    2005-05-14 18:24:04 -07:00
> +++ b/xen/Rules.mk    2005-05-14 18:24:04 -07:00
> @@ -5,7 +5,6 @@
>  perfc_arrays?= n
>  trace       ?= n
>  optimize    ?= y
> -domu_debug  ?= n
>  crash_debug ?= n
>  
>  include $(BASEDIR)/../Config.mk
> @@ -43,10 +42,6 @@
>  endif
>  else
>  CFLAGS += -g -DVERBOSE
> -endif
> -
> -ifeq ($(domu_debug),y)
> -CFLAGS += -DDOMU_DEBUG
>  endif
>  
>  ifeq ($(crash_debug),y)
> diff -Nru a/xen/common/domain.c b/xen/common/domain.c
> --- a/xen/common/domain.c     2005-05-14 18:24:04 -07:00
> +++ b/xen/common/domain.c     2005-05-14 18:24:04 -07:00
> @@ -227,6 +227,11 @@
>      if ( (vcpu >= MAX_VIRT_CPUS) || ((ed = d->exec_domain[vcpu]) == NULL) )
>          return -EINVAL;
>      
> +    if (setdomaininfo->flags & DOMFLAGS_DOMU_DEBUG)
> +        set_bit(_DOMF_debug, &d->domain_flags);
> +    else
> +        clear_bit(_DOMF_debug, &d->domain_flags);
> +
>      if (test_bit(_DOMF_constructed, &d->domain_flags) && 
>          !test_bit(_VCPUF_ctrl_pause, &ed->vcpu_flags))
>          return -EINVAL;
> diff -Nru a/xen/include/asm-x86/debugger.h b/xen/include/asm-x86/debugger.h
> --- a/xen/include/asm-x86/debugger.h  2005-05-14 18:24:04 -07:00
> +++ b/xen/include/asm-x86/debugger.h  2005-05-14 18:24:04 -07:00
> @@ -38,38 +38,26 @@
>  #define DEBUGGER_trap_fatal(_v, _r) \
>      if ( debugger_trap_fatal(_v, _r) ) return EXCRET_fault_fixed;
>  
> -#if defined(CRASH_DEBUG)
>  
> -extern int __trap_to_cdb(struct cpu_user_regs *r);
> -#define debugger_trap_entry(_v, _r) (0)
>  
> -static inline int debugger_trap_fatal(
> -    unsigned int vector, struct cpu_user_regs *regs)
> -{
> -    (void)__trap_to_cdb(regs);
> -    return (vector == TRAP_int3); /* int3 is harmless */
> -}
> -
> -/* Int3 is a trivial way to gather cpu_user_regs context. */
> -#define debugger_trap_immediate() __asm__ __volatile__ ( "int3" );
> -
> -#elif defined(DOMU_DEBUG)
>  
>  #include <xen/softirq.h>
>  
>  static inline int debugger_trap_entry(
>      unsigned int vector, struct cpu_user_regs *regs)
>  {
> -    struct exec_domain *ed = current;
> +    struct exec_domain *ted, *ed = current;
>  
> -    if ( !KERNEL_MODE(ed, regs) || (ed->domain->domain_id == 0) )
> +    if ( !KERNEL_MODE(ed, regs) || (ed->domain->domain_id == 0) || 
> +      !test_bit(_DOMF_debug, &ed->domain->domain_flags) )
>          return 0;
>      
>      switch ( vector )
>      {
>      case TRAP_int3:
>      case TRAP_debug:
> -        set_bit(_VCPUF_ctrl_pause, &ed->vcpu_flags);
> +        for_each_exec_domain ( ed->domain, ted )
> +         set_bit(_VCPUF_ctrl_pause, &ted->vcpu_flags);
>          raise_softirq(SCHEDULE_SOFTIRQ);
>          return 1;
>      }
> @@ -77,11 +65,29 @@
>      return 0;
>  }
>  
> +
> +#if defined(CRASH_DEBUG)
> +
> +extern int __trap_to_cdb(struct cpu_user_regs *r);
> +
> +static inline int debugger_trap_fatal(
> +    unsigned int vector, struct cpu_user_regs *regs)
> +{
> +    (void)__trap_to_cdb(regs);
> +    return (vector == TRAP_int3); /* int3 is harmless */
> +}
> +
> +/* Int3 is a trivial way to gather cpu_user_regs context. */
> +#define debugger_trap_immediate() __asm__ __volatile__ ( "int3" );
> +
> +#else
> +
>  #define debugger_trap_fatal(_v, _r) (0)
>  #define debugger_trap_immediate()
>  
> +#endif
>  
> -#elif 0
> +#if 0
>  
>  extern int kdb_trap(int, int, struct cpu_user_regs *);
>  
> @@ -99,12 +105,6 @@
>  
>  /* Int3 is a trivial way to gather cpu_user_regs context. */
>  #define debugger_trap_immediate() __asm__ __volatile__ ( "int3" );
> -
> -#else
> -
> -#define debugger_trap_entry(_v, _r) (0)
> -#define debugger_trap_fatal(_v, _r) (0)
> -#define debugger_trap_immediate()
>  
>  #endif
>  
> diff -Nru a/xen/include/public/dom0_ops.h b/xen/include/public/dom0_ops.h
> --- a/xen/include/public/dom0_ops.h   2005-05-14 18:24:04 -07:00
> +++ b/xen/include/public/dom0_ops.h   2005-05-14 18:24:04 -07:00
> @@ -77,6 +77,7 @@
>  #define DOMFLAGS_PAUSED    (1<<3) /* Currently paused by control software.   
> */
>  #define DOMFLAGS_BLOCKED   (1<<4) /* Currently blocked pending an event.     
> */
>  #define DOMFLAGS_RUNNING   (1<<5) /* Domain is currently running.            
> */
> +#define DOMFLAGS_DOMU_DEBUG (1<<6) /* Pause domain on int3 or trace trap.    
>  */
>  #define DOMFLAGS_CPUMASK      255 /* CPU to which this domain is bound.      
> */
>  #define DOMFLAGS_CPUSHIFT       8
>  #define DOMFLAGS_SHUTDOWNMASK 255 /* DOMFLAGS_SHUTDOWN guest-supplied code.  
> */
> @@ -95,6 +96,7 @@
>  typedef struct {
>      /* IN variables. */
>      domid_t                   domain;
> +    u32                       flags;
>      u16                       vcpu;
>      /* IN/OUT parameters */
>      vcpu_guest_context_t *ctxt;
> diff -Nru a/xen/include/xen/sched.h b/xen/include/xen/sched.h
> --- a/xen/include/xen/sched.h 2005-05-14 18:24:04 -07:00
> +++ b/xen/include/xen/sched.h 2005-05-14 18:24:04 -07:00
> @@ -383,6 +383,9 @@
>   /* Death rattle. */
>  #define _DOMF_dying            6
>  #define DOMF_dying             (1UL<<_DOMF_dying)
> + /* PAUSE on int3 or trace trap. */
> +#define _DOMF_debug            7
> +#define DOMF_debug             (1UL<<_DOMF_debug)
>  
>  static inline int domain_runnable(struct exec_domain *ed)
>  {
> 
> 

-- 
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are,
by definition, not smart enough to debug it." - Brian W. Kernighan

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.