| 
 I rewrite the patch, pls check.  
  
Thanks, 
-James 
  
  
diff -r 0705efd9c69e tools/python/xen/xend/XendDomain.py --- a/tools/python/xen/xend/XendDomain.py       Fri Oct 16 09:04:53 2009 +0100 +++ b/tools/python/xen/xend/XendDomain.py       Mon Oct 19 10:15:06 2009 +0800 @@ -1522,6 +1522,45 @@              raise XendError("can't write guest state file %s: %s" %                              (dst, ex[1])) 
  
+    def domain_usb_add(self, domid, dev_id): +        dominfo = self.domain_lookup_nr(domid) +        if not dominfo: +            raise XendInvalidDomain(str(domid)) + +        usb = dominfo.info['platform'].get('usb') +        if not usb: +            raise XendError("Can't add usb device to a guest with usb disabled in configure file") + +        hvm = dominfo.info.is_hvm() +        if not hvm: +            raise XendError("Can't add usb device to a non-hvm guest") + +        if dominfo._stateGet() != DOM_STATE_HALTED: +            dominfo.image.signalDeviceModel("usb-add", +                "usb-added", dev_id) +        else: +            log.debug("error: Domain is not running!") + + +    def domain_usb_del(self, domid, dev_id): +        dominfo = self.domain_lookup_nr(domid) +        if not dominfo: +            raise XendInvalidDomain(str(domid)) + +        usb = dominfo.info['platform'].get('usb') +        if not usb: +            raise XendError("Can't add usb device to a guest with usb disabled in configure file") + +        hvm = dominfo.info.is_hvm() 
+        if not hvm: +            raise XendError("Can't del usb to a non-hvm guest") + +        if dominfo._stateGet() != DOM_STATE_HALTED: +            dominfo.image.signalDeviceModel("usb-del", +                "usb-deleted", dev_id) +        else: +            log.debug("error: Domain is not running!") +      def domain_pincpu(self, domid, vcpu, cpumap):          """Set which cpus vcpu can use 
  
diff -r 0705efd9c69e tools/python/xen/xend/server/SrvDomain.py --- a/tools/python/xen/xend/server/SrvDomain.py Fri Oct 16 09:04:53 2009 +0100 +++ b/tools/python/xen/xend/server/SrvDomain.py Mon Oct 19 10:15:06 2009 +0800 @@ -225,6 +225,19 @@          self.acceptCommand(req)          return self.xd.domain_reset(self.dom.getName()) 
  
+    def op_usb_add(self, op, req): +        self.acceptCommand(req) +        return req.threadRequest(self.do_usb_add, op, req) + +    def do_usb_add(self, _, req): +        return self.xd.domain_usb_add(self.dom.getName(), req) +  +    def op_usb_del(self, op, req): +        self.acceptCommand(req) +        return req.threadRequest(self.do_usb_add, op, req) + +    def do_usb_del(self, _, req): +        return self.xd.domain_usb_add(self.dom.getName(), req) 
  
     def render_POST(self, req):          return self.perform(req) diff -r 0705efd9c69e tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py       Fri Oct 16 09:04:53 2009 +0100 
+++ b/tools/python/xen/xm/main.py       Mon Oct 19 10:15:06 2009 +0800 @@ -161,6 +161,9 @@      'vcpu-set'    : ('<Domain> <vCPUs>',                       'Set the number of active VCPUs for allowed for the'                       ' domain.'), +    #usb +    'usb-add'     : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Add the usb device to FV VM.'), +    'usb-del'     : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Delete the usb device to FV VM.'), 
  
     # device commands 
  
@@ -350,6 +353,8 @@      "top",      "unpause",      "uptime", +    "usb-add", +    "usb-del",      "vcpu-set",      ] 
  
@@ -382,6 +387,8 @@      "top",      "unpause",      "uptime", +    "usb-add", +    "usb-del",      "vcpu-list",      "vcpu-pin",      "vcpu-set", @@ -1473,6 +1480,14 @@      else:          mem_target = int_unit(args[1], 'm')          server.xend.domain.setMemoryTarget(dom, mem_target) + +def xm_usb_add(args): +    arg_check(args, "usb-add", 2) +    server.xend.domain.usb_add(args[0],args[1]) 
+ +def xm_usb_del(args): +    arg_check(args, "usb-del", 2) +    server.xend.domain.usb_del(args[0],args[1]) 
  
 def xm_vcpu_set(args):      arg_check(args, "vcpu-set", 2) @@ -3311,6 +3326,9 @@      "tmem-set": xm_tmem_set,      "tmem-freeable": xm_tmem_freeable_mb,      "tmem-shared-auth": xm_tmem_shared_auth, +    #usb +    "usb-add": xm_usb_add, +    "usb-del": xm_usb_del,      } 
  
 ## The commands supported by a separate argument parser in xend.xm. 
  
  
--------------------------For qemu-xen-unstable ----------------------------------------------------- 
  
  
  
diff --git a/xenstore.c b/xenstore.c index da278f4..694152a 100644 --- a/xenstore.c +++ b/xenstore.c @@ -752,6 +752,34 @@ static void xenstore_process_dm_command_event(void)      } else if (!strncmp(command, "continue", len)) {          fprintf(logfile, "dm-command: continue after state save\n");          xen_pause_requested = 0; +    } else if (!strncmp(command, "usb-add", len)) { +        fprintf(logfile, "dm-command: usb-add a usb device\n"); +        if (pasprintf(&path, +                "/local/domain/0/device-model/%u/parameter", domid) == -1) { +            fprintf(logfile, "out of memory reading dm command parameter\n"); +            goto out; +        } +        par = xs_read(xsh, XBT_NULL, path, &len); +        fprintf(logfile, "dm-command: usb-add a usb device: %s \n", par); +        if (!par) +            goto out; +        do_usb_add(par); +        xenstore_record_dm_state("usb-added"); +        fprintf(logfile, "dm-command: finish usb-add a usb device:%s\n",par); +    } else if (!strncmp(command, "usb-del", len)) { +        fprintf(logfile, "dm-command: usb-del a usb device\n"); +        if (pasprintf(&path, +                "/local/domain/0/device-model/%u/parameter", domid) == -1) { +            fprintf(logfile, "out of memory reading dm command parameter\n"); +            goto out; +        } +        par = xs_read(xsh, XBT_NULL, path, &len); +        fprintf(logfile, "dm-command: usb-del a usb device: %s \n", par); +        if (!par) +            goto out; +        do_usb_del(par); +        xenstore_record_dm_state("usb-deleted"); +        fprintf(logfile, "dm-command: finish usb-del a usb device:%s\n",par);  #ifdef CONFIG_PASSTHROUGH 
     } else if (!strncmp(command, "pci-rem", len)) {          fprintf(logfile, "dm-command: hot remove pass-through pci dev \n"); 
  >>> Keir Fraser <keir.fraser@xxxxxxxxxxxxx> 2009-10-15 16:46 >>> On 15/10/2009 09:12, "James Song" <jsong@xxxxxxxxxx> wrote:
  > Add the two commands( "xm usb-add" and "xm usb-del") to add or delete the usb > device instead of do it in QEMU console. >   > Signed-off-by: James Song Wei <jsong@xxxxxxxxxx>
  Again, given the weird encoding of your email this patch will probably turn out to be corrupted. But also you cannot patch tools/iomu-remote/ -- ioemu patches are to be applied to the separate qemu-xen-unstable.git repository and sent to the list cc'ed to Ian Jackson who maintains that repository.
  -- Keir
 
 
  
 |