[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] make domu_debug run-time option + fix int3 handling for MP
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) { _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |