提交 c498a892 编写于 作者: A Andrea Bolognani

conf: Add target type and model for spapr-vty

We can finally introduce a specific target model for the spapr-vty
device used by pSeries guests, which means isa-serial will no longer
show up to confuse users.

We make sure migration works in both directions by interpreting the
isa-serial target type, or the lack of target type, appropriately
when parsing the guest XML, and skipping the newly-introduced type
when formatting if for migration. We also verify that spapr-vty is
not used for non-pSeries guests and add a bunch of test cases.

This commit is best viewed with 'git show -w'.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1511421Signed-off-by: NAndrea Bolognani <abologna@redhat.com>
Reviewed-by: NPavel Hrdina <phrdina@redhat.com>
上级 fa96d352
...@@ -6546,7 +6546,9 @@ qemu-kvm -net nic,model=? /dev/null ...@@ -6546,7 +6546,9 @@ qemu-kvm -net nic,model=? /dev/null
<span class="since">since 1.0.2</span>, <code>isa-serial</code> (usable <span class="since">since 1.0.2</span>, <code>isa-serial</code> (usable
with x86 guests), <code>usb-serial</code> (usable whenever USB support with x86 guests), <code>usb-serial</code> (usable whenever USB support
is available) and <code>pci-serial</code> (usable whenever PCI support is available) and <code>pci-serial</code> (usable whenever PCI support
is available). is available); <span class="since">since 3.10.0</span>,
<code>spapr-vio-serial</code> (usable with ppc64/pseries guests)
is available as well.
</p> </p>
<p> <p>
...@@ -6556,7 +6558,9 @@ qemu-kvm -net nic,model=? /dev/null ...@@ -6556,7 +6558,9 @@ qemu-kvm -net nic,model=? /dev/null
<code>isa-serial</code> (usable with the <code>isa-serial</code> target <code>isa-serial</code> (usable with the <code>isa-serial</code> target
type); <code>usb-serial</code> (usable with the <code>usb-serial</code> type); <code>usb-serial</code> (usable with the <code>usb-serial</code>
target type); <code>pci-serial</code> target type); <code>pci-serial</code>
(usable with the <code>pci-serial</code> target type). (usable with the <code>pci-serial</code> target type);
<code>spapr-vty</code> (usable with the <code>spapr-vio-serial</code>
target type).
</p> </p>
<p> <p>
...@@ -6568,8 +6572,9 @@ qemu-kvm -net nic,model=? /dev/null ...@@ -6568,8 +6572,9 @@ qemu-kvm -net nic,model=? /dev/null
All of the target types support configuring the guest-visible device All of the target types support configuring the guest-visible device
address as <a href="#elementsAddress">documented above</a>; more address as <a href="#elementsAddress">documented above</a>; more
specifically, acceptable address types are <code>isa</code> (for specifically, acceptable address types are <code>isa</code> (for
<code>isa-serial</code>), <code>usb</code> (for <code>usb-serial</code>) <code>isa-serial</code>), <code>usb</code> (for <code>usb-serial</code>),
and <code>pci</code> (for <code>pci-serial</code>). <code>pci</code> (for <code>pci-serial</code>) and <code>spapr-vio</code>
(for <code>spapr-vio-serial</code>).
</p> </p>
<p> <p>
......
...@@ -3585,6 +3585,7 @@ ...@@ -3585,6 +3585,7 @@
<value>isa-serial</value> <value>isa-serial</value>
<value>usb-serial</value> <value>usb-serial</value>
<value>pci-serial</value> <value>pci-serial</value>
<value>spapr-vio-serial</value>
</choice> </choice>
</attribute> </attribute>
</define> </define>
...@@ -3596,6 +3597,7 @@ ...@@ -3596,6 +3597,7 @@
<value>isa-serial</value> <value>isa-serial</value>
<value>usb-serial</value> <value>usb-serial</value>
<value>pci-serial</value> <value>pci-serial</value>
<value>spapr-vty</value>
</choice> </choice>
</attribute> </attribute>
</element> </element>
......
...@@ -451,7 +451,9 @@ VIR_ENUM_IMPL(virDomainChrSerialTarget, ...@@ -451,7 +451,9 @@ VIR_ENUM_IMPL(virDomainChrSerialTarget,
"none", "none",
"isa-serial", "isa-serial",
"usb-serial", "usb-serial",
"pci-serial") "pci-serial",
"spapr-vio-serial",
);
VIR_ENUM_IMPL(virDomainChrChannelTarget, VIR_ENUM_IMPL(virDomainChrChannelTarget,
VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST, VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST,
...@@ -478,6 +480,7 @@ VIR_ENUM_IMPL(virDomainChrSerialTargetModel, ...@@ -478,6 +480,7 @@ VIR_ENUM_IMPL(virDomainChrSerialTargetModel,
"isa-serial", "isa-serial",
"usb-serial", "usb-serial",
"pci-serial", "pci-serial",
"spapr-vty",
); );
VIR_ENUM_IMPL(virDomainChrDevice, VIR_DOMAIN_CHR_DEVICE_TYPE_LAST, VIR_ENUM_IMPL(virDomainChrDevice, VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
...@@ -4057,6 +4060,7 @@ virDomainDefAddConsoleCompat(virDomainDefPtr def) ...@@ -4057,6 +4060,7 @@ virDomainDefAddConsoleCompat(virDomainDefPtr def)
switch ((virDomainChrSerialTargetType) def->serials[0]->targetType) { switch ((virDomainChrSerialTargetType) def->serials[0]->targetType) {
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: { case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: {
/* Create a stub console to match the serial port. /* Create a stub console to match the serial port.
......
...@@ -1081,6 +1081,7 @@ typedef enum { ...@@ -1081,6 +1081,7 @@ typedef enum {
VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA, VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA,
VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB, VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB,
VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI, VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI,
VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO,
VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST
} virDomainChrSerialTargetType; } virDomainChrSerialTargetType;
...@@ -1113,6 +1114,7 @@ typedef enum { ...@@ -1113,6 +1114,7 @@ typedef enum {
VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL, VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL,
VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL, VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL,
VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL, VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL,
VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY,
VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST
} virDomainChrSerialTargetModel; } virDomainChrSerialTargetModel;
......
...@@ -9231,6 +9231,8 @@ qemuChrSerialTargetModelToCaps(virDomainChrSerialTargetModel targetModel) ...@@ -9231,6 +9231,8 @@ qemuChrSerialTargetModelToCaps(virDomainChrSerialTargetModel targetModel)
return QEMU_CAPS_DEVICE_USB_SERIAL; return QEMU_CAPS_DEVICE_USB_SERIAL;
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
return QEMU_CAPS_DEVICE_PCI_SERIAL; return QEMU_CAPS_DEVICE_PCI_SERIAL;
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
return QEMU_CAPS_DEVICE_SPAPR_VTY;
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
...@@ -10383,52 +10385,39 @@ qemuBuildSerialChrDeviceStr(char **deviceStr, ...@@ -10383,52 +10385,39 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
virBuffer cmd = VIR_BUFFER_INITIALIZER; virBuffer cmd = VIR_BUFFER_INITIALIZER;
virQEMUCapsFlags caps; virQEMUCapsFlags caps;
if (qemuDomainIsPSeries(def)) { switch ((virDomainChrSerialTargetModel) serial->targetModel) {
if (serial->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL && case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
serial->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) { case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPAPR_VTY)) { case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("spapr-vty not supported in this QEMU binary"));
goto error;
}
virBufferAsprintf(&cmd, "spapr-vty,chardev=char%s",
serial->info.alias);
}
} else {
switch ((virDomainChrSerialTargetModel) serial->targetModel) {
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
caps = qemuChrSerialTargetModelToCaps(serial->targetModel);
if (caps && !virQEMUCapsGet(qemuCaps, caps)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("'%s' is not supported in this QEMU binary"),
virDomainChrSerialTargetModelTypeToString(serial->targetModel));
goto error;
}
break;
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: caps = qemuChrSerialTargetModelToCaps(serial->targetModel);
break;
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: if (caps && !virQEMUCapsGet(qemuCaps, caps)) {
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
/* Except from _LAST, which is just a guard value and will never _("'%s' is not supported in this QEMU binary"),
* be used, all of the above are platform devices, which means virDomainChrSerialTargetModelTypeToString(serial->targetModel));
* qemuBuildSerialCommandLine() will have taken the appropriate
* branch and we will not have ended up here. */
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Invalid target model for serial device"));
goto error; goto error;
} }
break;
virBufferAsprintf(&cmd, "%s,chardev=char%s,id=%s", case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
virDomainChrSerialTargetModelTypeToString(serial->targetModel), break;
serial->info.alias, serial->info.alias);
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
/* Except from _LAST, which is just a guard value and will never
* be used, all of the above are platform devices, which means
* qemuBuildSerialCommandLine() will have taken the appropriate
* branch and we will not have ended up here. */
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Invalid target model for serial device"));
goto error;
} }
virBufferAsprintf(&cmd, "%s,chardev=char%s,id=%s",
virDomainChrSerialTargetModelTypeToString(serial->targetModel),
serial->info.alias, serial->info.alias);
if (qemuBuildDeviceAddressStr(&cmd, def, &serial->info, qemuCaps) < 0) if (qemuBuildDeviceAddressStr(&cmd, def, &serial->info, qemuCaps) < 0)
goto error; goto error;
......
...@@ -3470,6 +3470,8 @@ qemuDomainChrSerialTargetTypeToAddressType(int targetType) ...@@ -3470,6 +3470,8 @@ qemuDomainChrSerialTargetTypeToAddressType(int targetType)
return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB; return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB;
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
break; break;
...@@ -3489,6 +3491,8 @@ qemuDomainChrSerialTargetModelToTargetType(int targetModel) ...@@ -3489,6 +3491,8 @@ qemuDomainChrSerialTargetModelToTargetType(int targetModel)
return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB; return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB;
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI; return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI;
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO;
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
break; break;
...@@ -3499,8 +3503,7 @@ qemuDomainChrSerialTargetModelToTargetType(int targetModel) ...@@ -3499,8 +3503,7 @@ qemuDomainChrSerialTargetModelToTargetType(int targetModel)
static int static int
qemuDomainChrTargetDefValidate(const virDomainDef *def, qemuDomainChrTargetDefValidate(const virDomainChrDef *chr)
const virDomainChrDef *chr)
{ {
int expected; int expected;
...@@ -3512,11 +3515,7 @@ qemuDomainChrTargetDefValidate(const virDomainDef *def, ...@@ -3512,11 +3515,7 @@ qemuDomainChrTargetDefValidate(const virDomainDef *def,
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
/* Hack required until we have a proper type for pSeries
* serial consoles */
if (qemuDomainIsPSeries(def))
return 0;
expected = qemuDomainChrSerialTargetTypeToAddressType(chr->targetType); expected = qemuDomainChrSerialTargetTypeToAddressType(chr->targetType);
...@@ -3540,6 +3539,7 @@ qemuDomainChrTargetDefValidate(const virDomainDef *def, ...@@ -3540,6 +3539,7 @@ qemuDomainChrTargetDefValidate(const virDomainDef *def,
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
expected = qemuDomainChrSerialTargetModelToTargetType(chr->targetModel); expected = qemuDomainChrSerialTargetModelToTargetType(chr->targetModel);
...@@ -3577,7 +3577,7 @@ qemuDomainChrDefValidate(const virDomainChrDef *dev, ...@@ -3577,7 +3577,7 @@ qemuDomainChrDefValidate(const virDomainChrDef *dev,
if (qemuDomainChrSourceDefValidate(dev->source) < 0) if (qemuDomainChrSourceDefValidate(dev->source) < 0)
return -1; return -1;
if (qemuDomainChrTargetDefValidate(def, dev) < 0) if (qemuDomainChrTargetDefValidate(dev) < 0)
return -1; return -1;
if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL && if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL &&
...@@ -3587,6 +3587,26 @@ qemuDomainChrDefValidate(const virDomainChrDef *dev, ...@@ -3587,6 +3587,26 @@ qemuDomainChrDefValidate(const virDomainChrDef *dev,
return -1; return -1;
} }
if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL) {
bool isCompatible = true;
if (!qemuDomainIsPSeries(def) &&
(dev->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO ||
dev->targetModel == VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY)) {
isCompatible = false;
}
if (!isCompatible) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Serial device with target type '%s' and "
"target model '%s' not compatible with guest "
"architecture or machine type"),
virDomainChrSerialTargetTypeToString(dev->targetType),
virDomainChrSerialTargetModelTypeToString(dev->targetModel));
return -1;
}
}
return 0; return 0;
} }
...@@ -4226,10 +4246,7 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr, ...@@ -4226,10 +4246,7 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr,
if (ARCH_IS_X86(def->os.arch)) { if (ARCH_IS_X86(def->os.arch)) {
chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA; chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
} else if (qemuDomainIsPSeries(def)) { } else if (qemuDomainIsPSeries(def)) {
/* Setting TYPE_ISA here is just a temporary hack to reduce test chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO;
* suite churn. Later on we will have a proper serial type for
* pSeries and this line will be updated accordingly. */
chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
} }
} }
...@@ -4246,6 +4263,9 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr, ...@@ -4246,6 +4263,9 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr,
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL; chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL;
break; break;
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY;
break;
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
/* Nothing to do */ /* Nothing to do */
...@@ -5151,6 +5171,31 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver, ...@@ -5151,6 +5171,31 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
goto cleanup; goto cleanup;
} }
for (i = 0; i < def->nserials; i++) {
virDomainChrDefPtr serial = def->serials[i];
/* Historically, the native console type for some machine types
* was not set at all, which means it defaulted to ISA even
* though that was not even remotely accurate. To ensure migration
* towards older libvirt versions works for such guests, we switch
* it back to the default here */
if (flags & VIR_DOMAIN_XML_MIGRATABLE) {
switch ((virDomainChrSerialTargetType) serial->targetType) {
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
serial->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE;
serial->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE;
break;
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
/* Nothing to do */
break;
}
}
}
/* Replace the CPU definition updated according to QEMU with the one /* Replace the CPU definition updated according to QEMU with the one
* used for starting the domain. The updated def will be sent * used for starting the domain. The updated def will be sent
* separately for backward compatibility. * separately for backward compatibility.
......
...@@ -782,6 +782,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, ...@@ -782,6 +782,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
return 0; return 0;
......
...@@ -20,4 +20,4 @@ server,nowait \ ...@@ -20,4 +20,4 @@ server,nowait \
-boot c \ -boot c \
-usb \ -usb \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
qemuxml2argv-pseries-serial-native.args
\ No newline at end of file
<domain type='qemu'>
<name>guest</name>
<uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
<memory unit='KiB'>524288</memory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='ppc64' machine='pseries'>hvm</type>
</os>
<devices>
<emulator>/usr/bin/qemu-system-ppc64</emulator>
<controller type='usb' model='none'/>
<!-- The <console> element being present should result in a matching
<serial> element being created -->
<console type='pty'/>
<memballoon model='none'/>
</devices>
</domain>
LC_ALL=C \
PATH=/bin \
HOME=/home/test \
USER=test \
LOGNAME=test \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-ppc64 \
-name guest \
-S \
-M pseries \
-m 512 \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
-nographic \
-nodefconfig \
-nodefaults \
-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\
server,nowait \
-mon chardev=charmonitor,id=monitor,mode=readline \
-boot c \
-device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x1 \
-chardev pty,id=charconsole0 \
-device virtconsole,chardev=charconsole0,id=console0
<domain type='qemu'>
<name>guest</name>
<uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
<memory unit='KiB'>524288</memory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='ppc64' machine='pseries'>hvm</type>
</os>
<devices>
<emulator>/usr/bin/qemu-system-ppc64</emulator>
<controller type='usb' model='none'/>
<!-- The <console> element being present should *not* result in a
matching <serial> element being created -->
<console type='pty'>
<target type='virtio'/>
</console>
<memballoon model='none'/>
</devices>
</domain>
...@@ -21,4 +21,4 @@ server,nowait \ ...@@ -21,4 +21,4 @@ server,nowait \
-boot c \ -boot c \
-usb \ -usb \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
...@@ -21,4 +21,4 @@ server,nowait \ ...@@ -21,4 +21,4 @@ server,nowait \
-boot c \ -boot c \
-usb \ -usb \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
...@@ -21,4 +21,4 @@ server,nowait \ ...@@ -21,4 +21,4 @@ server,nowait \
-boot c \ -boot c \
-usb \ -usb \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
...@@ -20,4 +20,4 @@ server,nowait \ ...@@ -20,4 +20,4 @@ server,nowait \
-boot c \ -boot c \
-usb \ -usb \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
...@@ -20,4 +20,4 @@ server,nowait \ ...@@ -20,4 +20,4 @@ server,nowait \
-boot c \ -boot c \
-usb \ -usb \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
...@@ -20,4 +20,4 @@ server,nowait \ ...@@ -20,4 +20,4 @@ server,nowait \
-boot c \ -boot c \
-usb \ -usb \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
qemuxml2argv-pseries-serial-native.args
\ No newline at end of file
<domain type='qemu'>
<name>guest</name>
<uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
<memory unit='KiB'>524288</memory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='ppc64' machine='pseries'>hvm</type>
</os>
<devices>
<emulator>/usr/bin/qemu-system-ppc64</emulator>
<controller type='usb' model='none'/>
<!-- When both the <serial> and <console> elements are present, they will
be matched and end up representing the same native serial console -->
<serial type='pty'/>
<console type='pty'/>
<memballoon model='none'/>
</devices>
</domain>
qemuxml2argv-pseries-serial-native.args
\ No newline at end of file
<domain type='qemu'>
<name>guest</name>
<uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
<memory unit='KiB'>524288</memory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='ppc64' machine='pseries'>hvm</type>
</os>
<devices>
<emulator>/usr/bin/qemu-system-ppc64</emulator>
<controller type='usb' model='none'/>
<!-- isa-serial has to be accepted for backwards compatibility reasons,
but should get converted to the proper type (spapr-vty-serial) -->
<serial type='pty'>
<target type='isa-serial'/>
</serial>
<memballoon model='none'/>
</devices>
</domain>
<domain type='qemu'>
<name>guest</name>
<uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
<memory unit='KiB'>524288</memory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
</os>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' model='none'/>
<!-- The spapr-vio-serial target type can only be used for pSeries
guests, so this should be rejected -->
<serial type='pty'>
<target type='spapr-vio-serial'/>
</serial>
<memballoon model='none'/>
</devices>
</domain>
LC_ALL=C \
PATH=/bin \
HOME=/home/test \
USER=test \
LOGNAME=test \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-ppc64 \
-name guest \
-S \
-M pseries \
-m 512 \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
-nographic \
-nodefconfig \
-nodefaults \
-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-guest/monitor.sock,\
server,nowait \
-mon chardev=charmonitor,id=monitor,mode=readline \
-boot c \
-chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
<domain type='qemu'>
<name>guest</name>
<uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
<memory unit='KiB'>524288</memory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='ppc64' machine='pseries'>hvm</type>
</os>
<devices>
<emulator>/usr/bin/qemu-system-ppc64</emulator>
<controller type='usb' model='none'/>
<!-- This will use the spapr-vty-serial target type -->
<serial type='pty'/>
<memballoon model='none'/>
</devices>
</domain>
...@@ -20,4 +20,4 @@ server,nowait \ ...@@ -20,4 +20,4 @@ server,nowait \
-boot c \ -boot c \
-device pci-ohci,id=usb,bus=pci.0,addr=0x1 \ -device pci-ohci,id=usb,bus=pci.0,addr=0x1 \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
...@@ -20,5 +20,5 @@ server,nowait \ ...@@ -20,5 +20,5 @@ server,nowait \
-boot c \ -boot c \
-device pci-ohci,id=usb,bus=pci.0,addr=0x1 \ -device pci-ohci,id=usb,bus=pci.0,addr=0x1 \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 \ -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000 \
-device usb-kbd,id=input0,bus=usb.0,port=1 -device usb-kbd,id=input0,bus=usb.0,port=1
...@@ -21,4 +21,4 @@ server,nowait \ ...@@ -21,4 +21,4 @@ server,nowait \
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1 \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1 \
-device pci-ohci,id=usb1,bus=pci.0,addr=0x2 \ -device pci-ohci,id=usb1,bus=pci.0,addr=0x2 \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000
...@@ -25,6 +25,6 @@ server,nowait \ ...@@ -25,6 +25,6 @@ server,nowait \
-device scsi-disk,bus=scsi1.0,channel=0,scsi-id=0,lun=0,\ -device scsi-disk,bus=scsi1.0,channel=0,scsi-id=0,lun=0,\
drive=drive-scsi1-0-0-0,id=scsi1-0-0-0 \ drive=drive-scsi1-0-0-0,id=scsi1-0-0-0 \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x20000000 \ -device spapr-vty,chardev=charserial0,id=serial0,reg=0x20000000 \
-chardev pty,id=charserial1 \ -chardev pty,id=charserial1 \
-device spapr-vty,chardev=charserial1,reg=0x30001000 -device spapr-vty,chardev=charserial1,id=serial1,reg=0x30001000
...@@ -25,6 +25,6 @@ server,nowait \ ...@@ -25,6 +25,6 @@ server,nowait \
-device scsi-disk,bus=scsi1.0,channel=0,scsi-id=0,lun=0,\ -device scsi-disk,bus=scsi1.0,channel=0,scsi-id=0,lun=0,\
drive=drive-scsi1-0-0-0,id=scsi1-0-0-0 \ drive=drive-scsi1-0-0-0,id=scsi1-0-0-0 \
-chardev pty,id=charserial0 \ -chardev pty,id=charserial0 \
-device spapr-vty,chardev=charserial0,reg=0x30000000 \ -device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000 \
-chardev pty,id=charserial1 \ -chardev pty,id=charserial1 \
-device spapr-vty,chardev=charserial1,reg=0x30001000 -device spapr-vty,chardev=charserial1,id=serial1,reg=0x30001000
...@@ -1877,6 +1877,22 @@ mymain(void) ...@@ -1877,6 +1877,22 @@ mymain(void)
QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MACHINE_OPT,
QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT); QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT);
DO_TEST("pseries-serial-native",
QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_DEVICE_SPAPR_VTY);
DO_TEST("pseries-serial+console-native",
QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_DEVICE_SPAPR_VTY);
DO_TEST("pseries-serial-compat",
QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_DEVICE_SPAPR_VTY);
DO_TEST("pseries-console-native",
QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_DEVICE_SPAPR_VTY);
DO_TEST("pseries-console-virtio",
QEMU_CAPS_NODEFCONFIG);
DO_TEST_PARSE_ERROR("pseries-serial-invalid-machine", NONE);
DO_TEST("disk-ide-drive-split", DO_TEST("disk-ide-drive-split",
QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_IDE_CD); QEMU_CAPS_IDE_CD);
......
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
<target index='0'/> <target index='0'/>
</controller> </controller>
<serial type='pty'> <serial type='pty'>
<target type='isa-serial' port='0'> <target type='spapr-vio-serial' port='0'>
<model name='isa-serial'/> <model name='spapr-vty'/>
</target> </target>
<address type='spapr-vio' reg='0x30000000'/> <address type='spapr-vio' reg='0x30000000'/>
</serial> </serial>
......
qemuxml2xmlout-pseries-serial-native.xml
\ No newline at end of file
<domain type='qemu'>
<name>guest</name>
<uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
<memory unit='KiB'>524288</memory>
<currentMemory unit='KiB'>524288</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='ppc64' machine='pseries'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-ppc64</emulator>
<controller type='usb' index='0' model='none'/>
<controller type='pci' index='0' model='pci-root'>
<model name='spapr-pci-host-bridge'/>
<target index='0'/>
</controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
</controller>
<console type='pty'>
<target type='virtio' port='0'/>
</console>
<memballoon model='none'/>
<panic model='pseries'/>
</devices>
</domain>
...@@ -25,8 +25,8 @@ ...@@ -25,8 +25,8 @@
<target index='0'/> <target index='0'/>
</controller> </controller>
<serial type='pty'> <serial type='pty'>
<target type='isa-serial' port='0'> <target type='spapr-vio-serial' port='0'>
<model name='isa-serial'/> <model name='spapr-vty'/>
</target> </target>
<address type='spapr-vio' reg='0x30000000'/> <address type='spapr-vio' reg='0x30000000'/>
</serial> </serial>
......
...@@ -25,8 +25,8 @@ ...@@ -25,8 +25,8 @@
<target index='0'/> <target index='0'/>
</controller> </controller>
<serial type='pty'> <serial type='pty'>
<target type='isa-serial' port='0'> <target type='spapr-vio-serial' port='0'>
<model name='isa-serial'/> <model name='spapr-vty'/>
</target> </target>
<address type='spapr-vio' reg='0x30000000'/> <address type='spapr-vio' reg='0x30000000'/>
</serial> </serial>
......
...@@ -26,8 +26,8 @@ ...@@ -26,8 +26,8 @@
<target index='0'/> <target index='0'/>
</controller> </controller>
<serial type='pty'> <serial type='pty'>
<target type='isa-serial' port='0'> <target type='spapr-vio-serial' port='0'>
<model name='isa-serial'/> <model name='spapr-vty'/>
</target> </target>
<address type='spapr-vio' reg='0x30000000'/> <address type='spapr-vio' reg='0x30000000'/>
</serial> </serial>
......
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
<target index='0'/> <target index='0'/>
</controller> </controller>
<serial type='pty'> <serial type='pty'>
<target type='isa-serial' port='0'> <target type='spapr-vio-serial' port='0'>
<model name='isa-serial'/> <model name='spapr-vty'/>
</target> </target>
<address type='spapr-vio' reg='0x30000000'/> <address type='spapr-vio' reg='0x30000000'/>
</serial> </serial>
......
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
<target index='0'/> <target index='0'/>
</controller> </controller>
<serial type='pty'> <serial type='pty'>
<target type='isa-serial' port='0'> <target type='spapr-vio-serial' port='0'>
<model name='isa-serial'/> <model name='spapr-vty'/>
</target> </target>
<address type='spapr-vio' reg='0x30000000'/> <address type='spapr-vio' reg='0x30000000'/>
</serial> </serial>
......
qemuxml2xmlout-pseries-serial-native.xml
\ No newline at end of file
qemuxml2xmlout-pseries-serial-native.xml
\ No newline at end of file
<domain type='qemu'>
<name>guest</name>
<uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
<memory unit='KiB'>524288</memory>
<currentMemory unit='KiB'>524288</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='ppc64' machine='pseries'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-ppc64</emulator>
<controller type='usb' index='0' model='none'/>
<controller type='pci' index='0' model='pci-root'>
<model name='spapr-pci-host-bridge'/>
<target index='0'/>
</controller>
<serial type='pty'>
<target type='spapr-vio-serial' port='0'>
<model name='spapr-vty'/>
</target>
<address type='spapr-vio' reg='0x30000000'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
<address type='spapr-vio' reg='0x30000000'/>
</console>
<memballoon model='none'/>
<panic model='pseries'/>
</devices>
</domain>
...@@ -768,6 +768,21 @@ mymain(void) ...@@ -768,6 +768,21 @@ mymain(void)
QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MACHINE_OPT,
QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT); QEMU_CAPS_MACHINE_PSERIES_RESIZE_HPT);
DO_TEST("pseries-serial-native",
QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_DEVICE_SPAPR_VTY);
DO_TEST("pseries-serial+console-native",
QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_DEVICE_SPAPR_VTY);
DO_TEST("pseries-serial-compat",
QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_DEVICE_SPAPR_VTY);
DO_TEST("pseries-console-native",
QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_DEVICE_SPAPR_VTY);
DO_TEST("pseries-console-virtio",
QEMU_CAPS_NODEFCONFIG);
DO_TEST("balloon-device-auto", NONE); DO_TEST("balloon-device-auto", NONE);
DO_TEST("balloon-device-period", NONE); DO_TEST("balloon-device-period", NONE);
DO_TEST("channel-virtio-auto", NONE); DO_TEST("channel-virtio-auto", NONE);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册