1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

Cpu: Add support for Power LE Architecture.

This adds support for PowerPC Little Endian architecture.,
and allows libvirt to spawn VMs based on 'ppc64le' architecture.

Signed-off-by: Pradipta Kr. Banerjee <bpradip@in.ibm.com>
Signed-off-by: Prerna Saxena <prerna@linux.vnet.ibm.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Prerna Saxena 2014-11-04 22:51:26 +05:30 committed by Michal Privoznik
parent a17bfd6304
commit da636d83dc
6 changed files with 20 additions and 16 deletions

View File

@ -10043,7 +10043,7 @@ virDomainVideoDefaultType(const virDomainDef *def)
(STREQ(def->os.type, "xen") || (STREQ(def->os.type, "xen") ||
STREQ(def->os.type, "linux"))) STREQ(def->os.type, "linux")))
return VIR_DOMAIN_VIDEO_TYPE_XEN; return VIR_DOMAIN_VIDEO_TYPE_XEN;
else if (def->os.arch == VIR_ARCH_PPC64) else if ARCH_IS_PPC64(def->os.arch)
return VIR_DOMAIN_VIDEO_TYPE_VGA; return VIR_DOMAIN_VIDEO_TYPE_VGA;
else else
return VIR_DOMAIN_VIDEO_TYPE_CIRRUS; return VIR_DOMAIN_VIDEO_TYPE_CIRRUS;

View File

@ -38,7 +38,7 @@
VIR_LOG_INIT("cpu.cpu_powerpc"); VIR_LOG_INIT("cpu.cpu_powerpc");
static const virArch archs[] = { VIR_ARCH_PPC64 }; static const virArch archs[] = { VIR_ARCH_PPC64, VIR_ARCH_PPC64LE };
struct ppc_vendor { struct ppc_vendor {
char *name; char *name;

View File

@ -633,7 +633,7 @@ virQEMUCapsProbeCPUModels(virQEMUCapsPtr qemuCaps, uid_t runUid, gid_t runGid)
if (qemuCaps->arch == VIR_ARCH_I686 || if (qemuCaps->arch == VIR_ARCH_I686 ||
qemuCaps->arch == VIR_ARCH_X86_64) { qemuCaps->arch == VIR_ARCH_X86_64) {
parse = virQEMUCapsParseX86Models; parse = virQEMUCapsParseX86Models;
} else if (qemuCaps->arch == VIR_ARCH_PPC64) { } else if ARCH_IS_PPC64(qemuCaps->arch) {
parse = virQEMUCapsParsePPCModels; parse = virQEMUCapsParsePPCModels;
} else { } else {
VIR_DEBUG("don't know how to parse %s CPU models", VIR_DEBUG("don't know how to parse %s CPU models",
@ -2003,7 +2003,7 @@ bool virQEMUCapsHasPCIMultiBus(virQEMUCapsPtr qemuCaps,
return true; return true;
if (def->os.arch == VIR_ARCH_PPC || if (def->os.arch == VIR_ARCH_PPC ||
def->os.arch == VIR_ARCH_PPC64) { ARCH_IS_PPC64(def->os.arch)) {
/* /*
* Usage of pci.0 naming: * Usage of pci.0 naming:
* *
@ -3575,7 +3575,7 @@ virQEMUCapsSupportsChardev(virDomainDefPtr def,
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
return false; return false;
if ((def->os.arch == VIR_ARCH_PPC) || (def->os.arch == VIR_ARCH_PPC64)) { if ((def->os.arch == VIR_ARCH_PPC) || ARCH_IS_PPC64(def->os.arch)) {
/* only pseries need -device spapr-vty with -chardev */ /* only pseries need -device spapr-vty with -chardev */
return (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL && return (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO); chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO);

View File

@ -714,7 +714,7 @@ qemuSetSCSIControllerModel(virDomainDefPtr def,
return -1; return -1;
} }
} else { } else {
if ((def->os.arch == VIR_ARCH_PPC64) && if (ARCH_IS_PPC64(def->os.arch) &&
STRPREFIX(def->os.machine, "pseries")) { STRPREFIX(def->os.machine, "pseries")) {
*model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI; *model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI;
} else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_LSI)) { } else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_LSI)) {
@ -1265,7 +1265,7 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
for (i = 0; i < def->nserials; i++) { for (i = 0; i < def->nserials; i++) {
if (def->serials[i]->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL && if (def->serials[i]->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
(def->os.arch == VIR_ARCH_PPC64) && ARCH_IS_PPC64(def->os.arch) &&
STRPREFIX(def->os.machine, "pseries")) STRPREFIX(def->os.machine, "pseries"))
def->serials[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO; def->serials[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
if (qemuAssignSpaprVIOAddress(def, &def->serials[i]->info, if (qemuAssignSpaprVIOAddress(def, &def->serials[i]->info,
@ -1274,7 +1274,7 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
} }
if (def->nvram) { if (def->nvram) {
if (def->os.arch == VIR_ARCH_PPC64 && if (ARCH_IS_PPC64(def->os.arch) &&
STRPREFIX(def->os.machine, "pseries")) STRPREFIX(def->os.machine, "pseries"))
def->nvram->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO; def->nvram->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
if (qemuAssignSpaprVIOAddress(def, &def->nvram->info, if (qemuAssignSpaprVIOAddress(def, &def->nvram->info,
@ -4200,7 +4200,7 @@ qemuBuildUSBControllerDevStr(virDomainDefPtr domainDef,
model = def->model; model = def->model;
if (model == -1) { if (model == -1) {
if (domainDef->os.arch == VIR_ARCH_PPC64) if ARCH_IS_PPC64(domainDef->os.arch)
model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI; model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI;
else else
model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI; model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI;
@ -8572,7 +8572,7 @@ qemuBuildCommandLine(virConnectPtr conn,
!qemuDomainMachineIsQ35(def) && !qemuDomainMachineIsQ35(def) &&
(!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI) || (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI) ||
(!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI) && (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI) &&
def->os.arch == VIR_ARCH_PPC64))) { ARCH_IS_PPC64(def->os.arch)))) {
if (usblegacy) { if (usblegacy) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Multiple legacy USB controllers are " _("Multiple legacy USB controllers are "
@ -9770,7 +9770,7 @@ qemuBuildCommandLine(virConnectPtr conn,
} }
if (def->nvram) { if (def->nvram) {
if (def->os.arch == VIR_ARCH_PPC64 && if (ARCH_IS_PPC64(def->os.arch) &&
STRPREFIX(def->os.machine, "pseries")) { STRPREFIX(def->os.machine, "pseries")) {
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVRAM)) { if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVRAM)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@ -9893,7 +9893,7 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
{ {
virBuffer cmd = VIR_BUFFER_INITIALIZER; virBuffer cmd = VIR_BUFFER_INITIALIZER;
if ((arch == VIR_ARCH_PPC64) && STRPREFIX(machine, "pseries")) { if (ARCH_IS_PPC64(arch) && STRPREFIX(machine, "pseries")) {
if (serial->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL && if (serial->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
serial->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) { serial->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) {
virBufferAsprintf(&cmd, "spapr-vty,chardev=char%s", virBufferAsprintf(&cmd, "spapr-vty,chardev=char%s",
@ -10315,7 +10315,7 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
if (VIR_ALLOC(def->src) < 0) if (VIR_ALLOC(def->src) < 0)
goto error; goto error;
if (((dom->os.arch == VIR_ARCH_PPC64) && if ((ARCH_IS_PPC64(dom->os.arch) &&
dom->os.machine && STRPREFIX(dom->os.machine, "pseries"))) dom->os.machine && STRPREFIX(dom->os.machine, "pseries")))
def->bus = VIR_DOMAIN_DISK_BUS_SCSI; def->bus = VIR_DOMAIN_DISK_BUS_SCSI;
else else
@ -10408,7 +10408,7 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
} else if (STREQ(keywords[i], "if")) { } else if (STREQ(keywords[i], "if")) {
if (STREQ(values[i], "ide")) { if (STREQ(values[i], "ide")) {
def->bus = VIR_DOMAIN_DISK_BUS_IDE; def->bus = VIR_DOMAIN_DISK_BUS_IDE;
if (((dom->os.arch == VIR_ARCH_PPC64) && if ((ARCH_IS_PPC64(dom->os.arch) &&
dom->os.machine && STRPREFIX(dom->os.machine, "pseries"))) { dom->os.machine && STRPREFIX(dom->os.machine, "pseries"))) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("pseries systems do not support ide devices '%s'"), val); _("pseries systems do not support ide devices '%s'"), val);
@ -11653,7 +11653,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
} }
if (STREQ(arg, "-cdrom")) { if (STREQ(arg, "-cdrom")) {
disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM; disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
if (((def->os.arch == VIR_ARCH_PPC64) && if ((ARCH_IS_PPC64(def->os.arch) &&
def->os.machine && STRPREFIX(def->os.machine, "pseries"))) def->os.machine && STRPREFIX(def->os.machine, "pseries")))
disk->bus = VIR_DOMAIN_DISK_BUS_SCSI; disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
if (VIR_STRDUP(disk->dst, "hdc") < 0) if (VIR_STRDUP(disk->dst, "hdc") < 0)
@ -11669,7 +11669,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
disk->bus = VIR_DOMAIN_DISK_BUS_IDE; disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
else else
disk->bus = VIR_DOMAIN_DISK_BUS_SCSI; disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
if (((def->os.arch == VIR_ARCH_PPC64) && if ((ARCH_IS_PPC64(def->os.arch) &&
def->os.machine && STRPREFIX(def->os.machine, "pseries"))) def->os.machine && STRPREFIX(def->os.machine, "pseries")))
disk->bus = VIR_DOMAIN_DISK_BUS_SCSI; disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
} }

View File

@ -980,6 +980,7 @@ qemuDomainDefPostParse(virDomainDefPtr def,
break; break;
case VIR_ARCH_PPC64: case VIR_ARCH_PPC64:
case VIR_ARCH_PPC64LE:
addPCIRoot = true; addPCIRoot = true;
addDefaultUSBKBD = true; addDefaultUSBKBD = true;
addDefaultUSBMouse = true; addDefaultUSBMouse = true;

View File

@ -79,6 +79,9 @@ typedef enum {
(arch) == VIR_ARCH_PPC64LE ||\ (arch) == VIR_ARCH_PPC64LE ||\
(arch) == VIR_ARCH_PPCEMB) (arch) == VIR_ARCH_PPCEMB)
# define ARCH_IS_PPC64(arch) ((arch) == VIR_ARCH_PPC64 ||\
(arch) == VIR_ARCH_PPC64LE)
# define ARCH_IS_ARM(arch) ((arch) == VIR_ARCH_ARMV6L ||\ # define ARCH_IS_ARM(arch) ((arch) == VIR_ARCH_ARMV6L ||\
(arch) == VIR_ARCH_ARMV7L ||\ (arch) == VIR_ARCH_ARMV7L ||\
(arch) == VIR_ARCH_ARMV7B ||\ (arch) == VIR_ARCH_ARMV7B ||\