static int
virDomainVirtioSerialAddrNextFromController(virDomainVirtioSerialAddrSet *addrs,
- virDomainDeviceVirtioSerialAddress *addr)
+ virDomainDeviceVirtioSerialAddress *addr,
+ bool allowZero)
{
+ ssize_t startPort = 0;
ssize_t port;
ssize_t i;
virBitmap *map;
+ if (allowZero)
+ startPort = -1;
+
i = virDomainVirtioSerialAddrFindController(addrs, addr->controller);
if (i < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
}
map = addrs->controllers[i]->ports;
- if ((port = virBitmapNextClearBit(map, 0)) <= 0) {
+ if ((port = virBitmapNextClearBit(map, startPort)) < 0) {
virReportError(VIR_ERR_XML_ERROR,
_("Unable to find a free port on virtio-serial controller %1$u"),
addr->controller);
{
virDomainDeviceInfo nfo = { 0 };
virDomainDeviceInfo *ptr = allowZero ? &nfo : info;
+ virBitmap *map;
+ ssize_t i;
ptr->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL;
+ ptr->addr.vioserial.controller = info->addr.vioserial.controller;
if (portOnly) {
if (virDomainVirtioSerialAddrNextFromController(addrs,
- &ptr->addr.vioserial) < 0)
+ &ptr->addr.vioserial,
+ allowZero) < 0)
return -1;
+
+ if (ptr == &nfo) {
+ /* pass the vioserial data back into info as info is used
+ * later for port assignment */
+ info->addr.vioserial = ptr->addr.vioserial;
+
+ /* if the next available port from the controller is zero,
+ * let's reserve it in the map and return */
+ if (ptr->addr.vioserial.port == 0) {
+ i = virDomainVirtioSerialAddrFindController(addrs, ptr->addr.vioserial.controller);
+ map = addrs->controllers[i]->ports;
+ ignore_value(virBitmapSetBit(map, 0));
+ return 0;
+ }
+ }
+
} else {
if (virDomainVirtioSerialAddrNext(def, addrs, &ptr->addr.vioserial,
allowZero) < 0)
-chardev pty,id=charconsole1 \
-device '{"driver":"virtconsole","bus":"virtio-serial0.0","nr":0,"chardev":"charconsole1","id":"console1"}' \
-chardev pty,id=charconsole2 \
--device '{"driver":"virtconsole","bus":"virtio-serial0.0","nr":0,"chardev":"charconsole2","id":"console2"}' \
+-device '{"driver":"virtconsole","bus":"virtio-serial0.0","nr":1,"chardev":"charconsole2","id":"console2"}' \
-chardev pty,id=charconsole3 \
--device '{"driver":"virtconsole","bus":"virtio-serial0.0","nr":0,"chardev":"charconsole3","id":"console3"}' \
+-device '{"driver":"virtconsole","bus":"virtio-serial0.0","nr":2,"chardev":"charconsole3","id":"console3"}' \
-audiodev '{"id":"audio1","driver":"none"}' \
-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x3"}' \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
</console>
<console type='pty'>
<target type='virtio' port='2'/>
- <address type='virtio-serial' controller='0' bus='0' port='0'/>
+ <address type='virtio-serial' controller='0' bus='0' port='1'/>
</console>
<console type='pty'>
<target type='virtio' port='3'/>
- <address type='virtio-serial' controller='0' bus='0' port='0'/>
+ <address type='virtio-serial' controller='0' bus='0' port='2'/>
</console>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>