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' : (' ', 'Set the number of active VCPUs for allowed for the' ' domain.'), + #usb + 'usb-add' : (' <[host:bus.addr] [host:vendor_id:product_id]>','Add the usb device to FV VM.'), + 'usb-del' : (' <[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.