mirror of
				https://github.com/kata-containers/kata-containers.git
				synced 2025-10-31 01:13:02 +00:00 
			
		
		
		
	qemu: Consistent parameter building
Always join by ",", do not put commas in the parameter slices. Always use the variable name `deviceParams`. Fixes: #180 Signed-off-by: Jakob Naucke <jakob.naucke@ibm.com>
This commit is contained in:
		
							
								
								
									
										357
									
								
								qemu/qemu.go
									
									
									
									
									
								
							
							
						
						
									
										357
									
								
								qemu/qemu.go
									
									
									
									
									
								
							| @@ -308,56 +308,56 @@ func (object Object) QemuParams(config *Config) []string { | |||||||
| 	switch object.Type { | 	switch object.Type { | ||||||
| 	case MemoryBackendFile: | 	case MemoryBackendFile: | ||||||
| 		objectParams = append(objectParams, string(object.Type)) | 		objectParams = append(objectParams, string(object.Type)) | ||||||
| 		objectParams = append(objectParams, fmt.Sprintf(",id=%s", object.ID)) | 		objectParams = append(objectParams, fmt.Sprintf("id=%s", object.ID)) | ||||||
| 		objectParams = append(objectParams, fmt.Sprintf(",mem-path=%s", object.MemPath)) | 		objectParams = append(objectParams, fmt.Sprintf("mem-path=%s", object.MemPath)) | ||||||
| 		objectParams = append(objectParams, fmt.Sprintf(",size=%d", object.Size)) | 		objectParams = append(objectParams, fmt.Sprintf("size=%d", object.Size)) | ||||||
|  |  | ||||||
| 		deviceParams = append(deviceParams, string(object.Driver)) | 		deviceParams = append(deviceParams, string(object.Driver)) | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",id=%s", object.DeviceID)) | 		deviceParams = append(deviceParams, fmt.Sprintf("id=%s", object.DeviceID)) | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",memdev=%s", object.ID)) | 		deviceParams = append(deviceParams, fmt.Sprintf("memdev=%s", object.ID)) | ||||||
| 	case TDXGuest: | 	case TDXGuest: | ||||||
| 		objectParams = append(objectParams, string(object.Type)) | 		objectParams = append(objectParams, string(object.Type)) | ||||||
| 		objectParams = append(objectParams, fmt.Sprintf(",id=%s", object.ID)) | 		objectParams = append(objectParams, fmt.Sprintf("id=%s", object.ID)) | ||||||
| 		if object.Debug { | 		if object.Debug { | ||||||
| 			objectParams = append(objectParams, ",debug=on") | 			objectParams = append(objectParams, "debug=on") | ||||||
| 		} | 		} | ||||||
| 		deviceParams = append(deviceParams, string(object.Driver)) | 		deviceParams = append(deviceParams, string(object.Driver)) | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",id=%s", object.DeviceID)) | 		deviceParams = append(deviceParams, fmt.Sprintf("id=%s", object.DeviceID)) | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",file=%s", object.File)) | 		deviceParams = append(deviceParams, fmt.Sprintf("file=%s", object.File)) | ||||||
| 	case SEVGuest: | 	case SEVGuest: | ||||||
| 		objectParams = append(objectParams, string(object.Type)) | 		objectParams = append(objectParams, string(object.Type)) | ||||||
| 		objectParams = append(objectParams, fmt.Sprintf(",id=%s", object.ID)) | 		objectParams = append(objectParams, fmt.Sprintf("id=%s", object.ID)) | ||||||
| 		objectParams = append(objectParams, fmt.Sprintf(",cbitpos=%d", object.CBitPos)) | 		objectParams = append(objectParams, fmt.Sprintf("cbitpos=%d", object.CBitPos)) | ||||||
| 		objectParams = append(objectParams, fmt.Sprintf(",reduced-phys-bits=%d", object.ReducedPhysBits)) | 		objectParams = append(objectParams, fmt.Sprintf("reduced-phys-bits=%d", object.ReducedPhysBits)) | ||||||
|  |  | ||||||
| 		driveParams = append(driveParams, "if=pflash,format=raw,readonly=on") | 		driveParams = append(driveParams, "if=pflash,format=raw,readonly=on") | ||||||
| 		driveParams = append(driveParams, fmt.Sprintf(",file=%s", object.File)) | 		driveParams = append(driveParams, fmt.Sprintf("file=%s", object.File)) | ||||||
| 	case SecExecGuest: | 	case SecExecGuest: | ||||||
| 		objectParams = append(objectParams, string(object.Type)) | 		objectParams = append(objectParams, string(object.Type)) | ||||||
| 		objectParams = append(objectParams, fmt.Sprintf(",id=%s", object.ID)) | 		objectParams = append(objectParams, fmt.Sprintf("id=%s", object.ID)) | ||||||
| 	case PEFGuest: | 	case PEFGuest: | ||||||
| 		objectParams = append(objectParams, string(object.Type)) | 		objectParams = append(objectParams, string(object.Type)) | ||||||
| 		objectParams = append(objectParams, fmt.Sprintf(",id=%s", object.ID)) | 		objectParams = append(objectParams, fmt.Sprintf("id=%s", object.ID)) | ||||||
|  |  | ||||||
| 		deviceParams = append(deviceParams, string(object.Driver)) | 		deviceParams = append(deviceParams, string(object.Driver)) | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",id=%s", object.DeviceID)) | 		deviceParams = append(deviceParams, fmt.Sprintf("id=%s", object.DeviceID)) | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",host-path=%s", object.File)) | 		deviceParams = append(deviceParams, fmt.Sprintf("host-path=%s", object.File)) | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if len(deviceParams) > 0 { | 	if len(deviceParams) > 0 { | ||||||
| 		qemuParams = append(qemuParams, "-device") | 		qemuParams = append(qemuParams, "-device") | ||||||
| 		qemuParams = append(qemuParams, strings.Join(deviceParams, "")) | 		qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if len(objectParams) > 0 { | 	if len(objectParams) > 0 { | ||||||
| 		qemuParams = append(qemuParams, "-object") | 		qemuParams = append(qemuParams, "-object") | ||||||
| 		qemuParams = append(qemuParams, strings.Join(objectParams, "")) | 		qemuParams = append(qemuParams, strings.Join(objectParams, ",")) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if len(driveParams) > 0 { | 	if len(driveParams) > 0 { | ||||||
| 		qemuParams = append(qemuParams, "-drive") | 		qemuParams = append(qemuParams, "-drive") | ||||||
| 		qemuParams = append(qemuParams, strings.Join(driveParams, "")) | 		qemuParams = append(qemuParams, strings.Join(driveParams, ",")) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| @@ -473,34 +473,34 @@ func (fsdev FSDevice) QemuParams(config *Config) []string { | |||||||
|  |  | ||||||
| 	deviceParams = append(deviceParams, fsdev.deviceName(config)) | 	deviceParams = append(deviceParams, fsdev.deviceName(config)) | ||||||
| 	if s := fsdev.Transport.disableModern(config, fsdev.DisableModern); s != "" { | 	if s := fsdev.Transport.disableModern(config, fsdev.DisableModern); s != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | 		deviceParams = append(deviceParams, s) | ||||||
| 	} | 	} | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",fsdev=%s", fsdev.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("fsdev=%s", fsdev.ID)) | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",mount_tag=%s", fsdev.MountTag)) | 	deviceParams = append(deviceParams, fmt.Sprintf("mount_tag=%s", fsdev.MountTag)) | ||||||
| 	if fsdev.Transport.isVirtioPCI(config) && fsdev.ROMFile != "" { | 	if fsdev.Transport.isVirtioPCI(config) && fsdev.ROMFile != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",romfile=%s", fsdev.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", fsdev.ROMFile)) | ||||||
| 	} | 	} | ||||||
| 	if fsdev.Transport.isVirtioCCW(config) { | 	if fsdev.Transport.isVirtioCCW(config) { | ||||||
| 		if config.Knobs.IOMMUPlatform { | 		if config.Knobs.IOMMUPlatform { | ||||||
| 			deviceParams = append(deviceParams, ",iommu_platform=on") | 			deviceParams = append(deviceParams, ",iommu_platform=on") | ||||||
| 		} | 		} | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",devno=%s", fsdev.DevNo)) | 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", fsdev.DevNo)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	fsParams = append(fsParams, string(fsdev.FSDriver)) | 	fsParams = append(fsParams, string(fsdev.FSDriver)) | ||||||
| 	fsParams = append(fsParams, fmt.Sprintf(",id=%s", fsdev.ID)) | 	fsParams = append(fsParams, fmt.Sprintf("id=%s", fsdev.ID)) | ||||||
| 	fsParams = append(fsParams, fmt.Sprintf(",path=%s", fsdev.Path)) | 	fsParams = append(fsParams, fmt.Sprintf("path=%s", fsdev.Path)) | ||||||
| 	fsParams = append(fsParams, fmt.Sprintf(",security_model=%s", fsdev.SecurityModel)) | 	fsParams = append(fsParams, fmt.Sprintf("security_model=%s", fsdev.SecurityModel)) | ||||||
|  |  | ||||||
| 	if fsdev.Multidev != "" { | 	if fsdev.Multidev != "" { | ||||||
| 		fsParams = append(fsParams, fmt.Sprintf(",multidevs=%s", fsdev.Multidev)) | 		fsParams = append(fsParams, fmt.Sprintf("multidevs=%s", fsdev.Multidev)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(deviceParams, "")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-fsdev") | 	qemuParams = append(qemuParams, "-fsdev") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(fsParams, "")) | 	qemuParams = append(qemuParams, strings.Join(fsParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -599,41 +599,41 @@ func (cdev CharDevice) QemuParams(config *Config) []string { | |||||||
| 	deviceParams = append(deviceParams, cdev.deviceName(config)) | 	deviceParams = append(deviceParams, cdev.deviceName(config)) | ||||||
| 	if cdev.Driver == VirtioSerial { | 	if cdev.Driver == VirtioSerial { | ||||||
| 		if s := cdev.Transport.disableModern(config, cdev.DisableModern); s != "" { | 		if s := cdev.Transport.disableModern(config, cdev.DisableModern); s != "" { | ||||||
| 			deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | 			deviceParams = append(deviceParams, s) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if cdev.Bus != "" { | 	if cdev.Bus != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",bus=%s", cdev.Bus)) | 		deviceParams = append(deviceParams, fmt.Sprintf("bus=%s", cdev.Bus)) | ||||||
| 	} | 	} | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",chardev=%s", cdev.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("chardev=%s", cdev.ID)) | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",id=%s", cdev.DeviceID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("id=%s", cdev.DeviceID)) | ||||||
| 	if cdev.Name != "" { | 	if cdev.Name != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",name=%s", cdev.Name)) | 		deviceParams = append(deviceParams, fmt.Sprintf("name=%s", cdev.Name)) | ||||||
| 	} | 	} | ||||||
| 	if cdev.Driver == VirtioSerial && cdev.Transport.isVirtioPCI(config) && cdev.ROMFile != "" { | 	if cdev.Driver == VirtioSerial && cdev.Transport.isVirtioPCI(config) && cdev.ROMFile != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",romfile=%s", cdev.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", cdev.ROMFile)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if cdev.Driver == VirtioSerial && cdev.Transport.isVirtioCCW(config) { | 	if cdev.Driver == VirtioSerial && cdev.Transport.isVirtioCCW(config) { | ||||||
| 		if config.Knobs.IOMMUPlatform { | 		if config.Knobs.IOMMUPlatform { | ||||||
| 			deviceParams = append(deviceParams, ",iommu_platform=on") | 			deviceParams = append(deviceParams, "iommu_platform=on") | ||||||
| 		} | 		} | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",devno=%s", cdev.DevNo)) | 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", cdev.DevNo)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cdevParams = append(cdevParams, string(cdev.Backend)) | 	cdevParams = append(cdevParams, string(cdev.Backend)) | ||||||
| 	cdevParams = append(cdevParams, fmt.Sprintf(",id=%s", cdev.ID)) | 	cdevParams = append(cdevParams, fmt.Sprintf("id=%s", cdev.ID)) | ||||||
| 	if cdev.Backend == Socket { | 	if cdev.Backend == Socket { | ||||||
| 		cdevParams = append(cdevParams, fmt.Sprintf(",path=%s,server=on,wait=off", cdev.Path)) | 		cdevParams = append(cdevParams, fmt.Sprintf("path=%s,server=on,wait=off", cdev.Path)) | ||||||
| 	} else { | 	} else { | ||||||
| 		cdevParams = append(cdevParams, fmt.Sprintf(",path=%s", cdev.Path)) | 		cdevParams = append(cdevParams, fmt.Sprintf("path=%s", cdev.Path)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(deviceParams, "")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-chardev") | 	qemuParams = append(qemuParams, "-chardev") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(cdevParams, "")) | 	qemuParams = append(qemuParams, strings.Join(cdevParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -829,7 +829,7 @@ func (netdev NetDevice) Valid() bool { | |||||||
| // multi-queue option mq needs to be activated. See comment in libvirt code at | // multi-queue option mq needs to be activated. See comment in libvirt code at | ||||||
| // https://github.com/libvirt/libvirt/blob/6e7e965dcd3d885739129b1454ce19e819b54c25/src/qemu/qemu_command.c#L3633 | // https://github.com/libvirt/libvirt/blob/6e7e965dcd3d885739129b1454ce19e819b54c25/src/qemu/qemu_command.c#L3633 | ||||||
| func (netdev NetDevice) mqParameter(config *Config) string { | func (netdev NetDevice) mqParameter(config *Config) string { | ||||||
| 	p := []string{",mq=on"} | 	p := []string{"mq=on"} | ||||||
|  |  | ||||||
| 	if netdev.Transport.isVirtioPCI(config) { | 	if netdev.Transport.isVirtioPCI(config) { | ||||||
| 		// https://www.linux-kvm.org/page/Multiqueue | 		// https://www.linux-kvm.org/page/Multiqueue | ||||||
| @@ -842,10 +842,10 @@ func (netdev NetDevice) mqParameter(config *Config) string { | |||||||
| 		// The agent implementation should do this to ensure that it is | 		// The agent implementation should do this to ensure that it is | ||||||
| 		// always set | 		// always set | ||||||
| 		vectors := len(netdev.FDs)*2 + 2 | 		vectors := len(netdev.FDs)*2 + 2 | ||||||
| 		p = append(p, fmt.Sprintf(",vectors=%d", vectors)) | 		p = append(p, fmt.Sprintf("vectors=%d", vectors)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return strings.Join(p, "") | 	return strings.Join(p, ",") | ||||||
| } | } | ||||||
|  |  | ||||||
| // QemuDeviceParams returns the -device parameters for this network device | // QemuDeviceParams returns the -device parameters for this network device | ||||||
| @@ -858,21 +858,21 @@ func (netdev NetDevice) QemuDeviceParams(config *Config) []string { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf("driver=%s", driver)) | 	deviceParams = append(deviceParams, fmt.Sprintf("driver=%s", driver)) | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",netdev=%s", netdev.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("netdev=%s", netdev.ID)) | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",mac=%s", netdev.MACAddress)) | 	deviceParams = append(deviceParams, fmt.Sprintf("mac=%s", netdev.MACAddress)) | ||||||
|  |  | ||||||
| 	if netdev.Bus != "" { | 	if netdev.Bus != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",bus=%s", netdev.Bus)) | 		deviceParams = append(deviceParams, fmt.Sprintf("bus=%s", netdev.Bus)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if netdev.Addr != "" { | 	if netdev.Addr != "" { | ||||||
| 		addr, err := strconv.Atoi(netdev.Addr) | 		addr, err := strconv.Atoi(netdev.Addr) | ||||||
| 		if err == nil && addr >= 0 { | 		if err == nil && addr >= 0 { | ||||||
| 			deviceParams = append(deviceParams, fmt.Sprintf(",addr=%x", addr)) | 			deviceParams = append(deviceParams, fmt.Sprintf("addr=%x", addr)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if s := netdev.Transport.disableModern(config, netdev.DisableModern); s != "" { | 	if s := netdev.Transport.disableModern(config, netdev.DisableModern); s != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | 		deviceParams = append(deviceParams, s) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if len(netdev.FDs) > 0 { | 	if len(netdev.FDs) > 0 { | ||||||
| @@ -881,14 +881,14 @@ func (netdev NetDevice) QemuDeviceParams(config *Config) []string { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if netdev.Transport.isVirtioPCI(config) && netdev.ROMFile != "" { | 	if netdev.Transport.isVirtioPCI(config) && netdev.ROMFile != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",romfile=%s", netdev.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", netdev.ROMFile)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if netdev.Transport.isVirtioCCW(config) { | 	if netdev.Transport.isVirtioCCW(config) { | ||||||
| 		if config.Knobs.IOMMUPlatform { | 		if config.Knobs.IOMMUPlatform { | ||||||
| 			deviceParams = append(deviceParams, ",iommu_platform=on") | 			deviceParams = append(deviceParams, "iommu_platform=on") | ||||||
| 		} | 		} | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",devno=%s", netdev.DevNo)) | 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", netdev.DevNo)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return deviceParams | 	return deviceParams | ||||||
| @@ -904,17 +904,17 @@ func (netdev NetDevice) QemuNetdevParams(config *Config) []string { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	netdevParams = append(netdevParams, netdevType) | 	netdevParams = append(netdevParams, netdevType) | ||||||
| 	netdevParams = append(netdevParams, fmt.Sprintf(",id=%s", netdev.ID)) | 	netdevParams = append(netdevParams, fmt.Sprintf("id=%s", netdev.ID)) | ||||||
|  |  | ||||||
| 	if netdev.VHost { | 	if netdev.VHost { | ||||||
| 		netdevParams = append(netdevParams, ",vhost=on") | 		netdevParams = append(netdevParams, "vhost=on") | ||||||
| 		if len(netdev.VhostFDs) > 0 { | 		if len(netdev.VhostFDs) > 0 { | ||||||
| 			var fdParams []string | 			var fdParams []string | ||||||
| 			qemuFDs := config.appendFDs(netdev.VhostFDs) | 			qemuFDs := config.appendFDs(netdev.VhostFDs) | ||||||
| 			for _, fd := range qemuFDs { | 			for _, fd := range qemuFDs { | ||||||
| 				fdParams = append(fdParams, fmt.Sprintf("%d", fd)) | 				fdParams = append(fdParams, fmt.Sprintf("%d", fd)) | ||||||
| 			} | 			} | ||||||
| 			netdevParams = append(netdevParams, fmt.Sprintf(",vhostfds=%s", strings.Join(fdParams, ":"))) | 			netdevParams = append(netdevParams, fmt.Sprintf("vhostfds=%s", strings.Join(fdParams, ":"))) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -926,15 +926,15 @@ func (netdev NetDevice) QemuNetdevParams(config *Config) []string { | |||||||
| 			fdParams = append(fdParams, fmt.Sprintf("%d", fd)) | 			fdParams = append(fdParams, fmt.Sprintf("%d", fd)) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		netdevParams = append(netdevParams, fmt.Sprintf(",fds=%s", strings.Join(fdParams, ":"))) | 		netdevParams = append(netdevParams, fmt.Sprintf("fds=%s", strings.Join(fdParams, ":"))) | ||||||
|  |  | ||||||
| 	} else { | 	} else { | ||||||
| 		netdevParams = append(netdevParams, fmt.Sprintf(",ifname=%s", netdev.IFName)) | 		netdevParams = append(netdevParams, fmt.Sprintf("ifname=%s", netdev.IFName)) | ||||||
| 		if netdev.DownScript != "" { | 		if netdev.DownScript != "" { | ||||||
| 			netdevParams = append(netdevParams, fmt.Sprintf(",downscript=%s", netdev.DownScript)) | 			netdevParams = append(netdevParams, fmt.Sprintf("downscript=%s", netdev.DownScript)) | ||||||
| 		} | 		} | ||||||
| 		if netdev.Script != "" { | 		if netdev.Script != "" { | ||||||
| 			netdevParams = append(netdevParams, fmt.Sprintf(",script=%s", netdev.Script)) | 			netdevParams = append(netdevParams, fmt.Sprintf("script=%s", netdev.Script)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return netdevParams | 	return netdevParams | ||||||
| @@ -955,7 +955,7 @@ func (netdev NetDevice) QemuParams(config *Config) []string { | |||||||
| 		netdevParams = netdev.QemuNetdevParams(config) | 		netdevParams = netdev.QemuNetdevParams(config) | ||||||
| 		if netdevParams != nil { | 		if netdevParams != nil { | ||||||
| 			qemuParams = append(qemuParams, "-netdev") | 			qemuParams = append(qemuParams, "-netdev") | ||||||
| 			qemuParams = append(qemuParams, strings.Join(netdevParams, "")) | 			qemuParams = append(qemuParams, strings.Join(netdevParams, ",")) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -963,7 +963,7 @@ func (netdev NetDevice) QemuParams(config *Config) []string { | |||||||
| 		deviceParams = netdev.QemuDeviceParams(config) | 		deviceParams = netdev.QemuDeviceParams(config) | ||||||
| 		if deviceParams != nil { | 		if deviceParams != nil { | ||||||
| 			qemuParams = append(qemuParams, "-device") | 			qemuParams = append(qemuParams, "-device") | ||||||
| 			qemuParams = append(qemuParams, strings.Join(deviceParams, "")) | 			qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -1010,25 +1010,25 @@ func (dev SerialDevice) QemuParams(config *Config) []string { | |||||||
|  |  | ||||||
| 	deviceParams = append(deviceParams, dev.deviceName(config)) | 	deviceParams = append(deviceParams, dev.deviceName(config)) | ||||||
| 	if s := dev.Transport.disableModern(config, dev.DisableModern); s != "" { | 	if s := dev.Transport.disableModern(config, dev.DisableModern); s != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | 		deviceParams = append(deviceParams, s) | ||||||
| 	} | 	} | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",id=%s", dev.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("id=%s", dev.ID)) | ||||||
| 	if dev.Transport.isVirtioPCI(config) && dev.ROMFile != "" { | 	if dev.Transport.isVirtioPCI(config) && dev.ROMFile != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",romfile=%s", dev.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", dev.ROMFile)) | ||||||
| 		if dev.Driver == VirtioSerial && dev.MaxPorts != 0 { | 		if dev.Driver == VirtioSerial && dev.MaxPorts != 0 { | ||||||
| 			deviceParams = append(deviceParams, fmt.Sprintf(",max_ports=%d", dev.MaxPorts)) | 			deviceParams = append(deviceParams, fmt.Sprintf("max_ports=%d", dev.MaxPorts)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if dev.Transport.isVirtioCCW(config) { | 	if dev.Transport.isVirtioCCW(config) { | ||||||
| 		if config.Knobs.IOMMUPlatform { | 		if config.Knobs.IOMMUPlatform { | ||||||
| 			deviceParams = append(deviceParams, ",iommu_platform=on") | 			deviceParams = append(deviceParams, "iommu_platform=on") | ||||||
| 		} | 		} | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",devno=%s", dev.DevNo)) | 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", dev.DevNo)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(deviceParams, "")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1133,46 +1133,46 @@ func (blkdev BlockDevice) QemuParams(config *Config) []string { | |||||||
|  |  | ||||||
| 	deviceParams = append(deviceParams, blkdev.deviceName(config)) | 	deviceParams = append(deviceParams, blkdev.deviceName(config)) | ||||||
| 	if s := blkdev.Transport.disableModern(config, blkdev.DisableModern); s != "" { | 	if s := blkdev.Transport.disableModern(config, blkdev.DisableModern); s != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | 		deviceParams = append(deviceParams, s) | ||||||
| 	} | 	} | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",drive=%s", blkdev.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("drive=%s", blkdev.ID)) | ||||||
| 	if !blkdev.SCSI { | 	if !blkdev.SCSI { | ||||||
| 		deviceParams = append(deviceParams, ",scsi=off") | 		deviceParams = append(deviceParams, "scsi=off") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if !blkdev.WCE { | 	if !blkdev.WCE { | ||||||
| 		deviceParams = append(deviceParams, ",config-wce=off") | 		deviceParams = append(deviceParams, "config-wce=off") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if blkdev.Transport.isVirtioPCI(config) && blkdev.ROMFile != "" { | 	if blkdev.Transport.isVirtioPCI(config) && blkdev.ROMFile != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",romfile=%s", blkdev.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", blkdev.ROMFile)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if blkdev.Transport.isVirtioCCW(config) { | 	if blkdev.Transport.isVirtioCCW(config) { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",devno=%s", blkdev.DevNo)) | 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", blkdev.DevNo)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if blkdev.ShareRW { | 	if blkdev.ShareRW { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",share-rw=on")) | 		deviceParams = append(deviceParams, fmt.Sprintf("share-rw=on")) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",serial=%s", blkdev.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("serial=%s", blkdev.ID)) | ||||||
|  |  | ||||||
| 	blkParams = append(blkParams, fmt.Sprintf("id=%s", blkdev.ID)) | 	blkParams = append(blkParams, fmt.Sprintf("id=%s", blkdev.ID)) | ||||||
| 	blkParams = append(blkParams, fmt.Sprintf(",file=%s", blkdev.File)) | 	blkParams = append(blkParams, fmt.Sprintf("file=%s", blkdev.File)) | ||||||
| 	blkParams = append(blkParams, fmt.Sprintf(",aio=%s", blkdev.AIO)) | 	blkParams = append(blkParams, fmt.Sprintf("aio=%s", blkdev.AIO)) | ||||||
| 	blkParams = append(blkParams, fmt.Sprintf(",format=%s", blkdev.Format)) | 	blkParams = append(blkParams, fmt.Sprintf("format=%s", blkdev.Format)) | ||||||
| 	blkParams = append(blkParams, fmt.Sprintf(",if=%s", blkdev.Interface)) | 	blkParams = append(blkParams, fmt.Sprintf("if=%s", blkdev.Interface)) | ||||||
|  |  | ||||||
| 	if blkdev.ReadOnly { | 	if blkdev.ReadOnly { | ||||||
| 		blkParams = append(blkParams, ",readonly") | 		blkParams = append(blkParams, "readonly") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(deviceParams, "")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-drive") | 	qemuParams = append(qemuParams, "-drive") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(blkParams, "")) | 	qemuParams = append(qemuParams, strings.Join(blkParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1232,14 +1232,14 @@ func (dev LoaderDevice) Valid() bool { | |||||||
| // QemuParams returns the qemu parameters built out of this loader device. | // QemuParams returns the qemu parameters built out of this loader device. | ||||||
| func (dev LoaderDevice) QemuParams(config *Config) []string { | func (dev LoaderDevice) QemuParams(config *Config) []string { | ||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
| 	var devParams []string | 	var deviceParams []string | ||||||
|  |  | ||||||
| 	devParams = append(devParams, "loader") | 	deviceParams = append(deviceParams, "loader") | ||||||
| 	devParams = append(devParams, fmt.Sprintf("file=%s", dev.File)) | 	deviceParams = append(deviceParams, fmt.Sprintf("file=%s", dev.File)) | ||||||
| 	devParams = append(devParams, fmt.Sprintf("id=%s", dev.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("id=%s", dev.ID)) | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(devParams, ",")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1330,7 +1330,7 @@ func (vhostuserDev VhostUserDevice) Valid() bool { | |||||||
| func (vhostuserDev VhostUserDevice) QemuNetParams(config *Config) []string { | func (vhostuserDev VhostUserDevice) QemuNetParams(config *Config) []string { | ||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
| 	var netParams []string | 	var netParams []string | ||||||
| 	var devParams []string | 	var deviceParams []string | ||||||
|  |  | ||||||
| 	driver := vhostuserDev.deviceName(config) | 	driver := vhostuserDev.deviceName(config) | ||||||
| 	if driver == "" { | 	if driver == "" { | ||||||
| @@ -1342,18 +1342,18 @@ func (vhostuserDev VhostUserDevice) QemuNetParams(config *Config) []string { | |||||||
| 	netParams = append(netParams, fmt.Sprintf("chardev=%s", vhostuserDev.CharDevID)) | 	netParams = append(netParams, fmt.Sprintf("chardev=%s", vhostuserDev.CharDevID)) | ||||||
| 	netParams = append(netParams, "vhostforce") | 	netParams = append(netParams, "vhostforce") | ||||||
|  |  | ||||||
| 	devParams = append(devParams, driver) | 	deviceParams = append(deviceParams, driver) | ||||||
| 	devParams = append(devParams, fmt.Sprintf("netdev=%s", vhostuserDev.TypeDevID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("netdev=%s", vhostuserDev.TypeDevID)) | ||||||
| 	devParams = append(devParams, fmt.Sprintf("mac=%s", vhostuserDev.Address)) | 	deviceParams = append(deviceParams, fmt.Sprintf("mac=%s", vhostuserDev.Address)) | ||||||
|  |  | ||||||
| 	if vhostuserDev.Transport.isVirtioPCI(config) && vhostuserDev.ROMFile != "" { | 	if vhostuserDev.Transport.isVirtioPCI(config) && vhostuserDev.ROMFile != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("romfile=%s", vhostuserDev.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", vhostuserDev.ROMFile)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-netdev") | 	qemuParams = append(qemuParams, "-netdev") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(netParams, ",")) | 	qemuParams = append(qemuParams, strings.Join(netParams, ",")) | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(devParams, ",")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1361,23 +1361,23 @@ func (vhostuserDev VhostUserDevice) QemuNetParams(config *Config) []string { | |||||||
| // QemuSCSIParams builds QEMU device parameters for a VhostUserSCSI device | // QemuSCSIParams builds QEMU device parameters for a VhostUserSCSI device | ||||||
| func (vhostuserDev VhostUserDevice) QemuSCSIParams(config *Config) []string { | func (vhostuserDev VhostUserDevice) QemuSCSIParams(config *Config) []string { | ||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
| 	var devParams []string | 	var deviceParams []string | ||||||
|  |  | ||||||
| 	driver := vhostuserDev.deviceName(config) | 	driver := vhostuserDev.deviceName(config) | ||||||
| 	if driver == "" { | 	if driver == "" { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	devParams = append(devParams, driver) | 	deviceParams = append(deviceParams, driver) | ||||||
| 	devParams = append(devParams, fmt.Sprintf("id=%s", vhostuserDev.TypeDevID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("id=%s", vhostuserDev.TypeDevID)) | ||||||
| 	devParams = append(devParams, fmt.Sprintf("chardev=%s", vhostuserDev.CharDevID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("chardev=%s", vhostuserDev.CharDevID)) | ||||||
|  |  | ||||||
| 	if vhostuserDev.Transport.isVirtioPCI(config) && vhostuserDev.ROMFile != "" { | 	if vhostuserDev.Transport.isVirtioPCI(config) && vhostuserDev.ROMFile != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("romfile=%s", vhostuserDev.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", vhostuserDev.ROMFile)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(devParams, ",")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1385,24 +1385,24 @@ func (vhostuserDev VhostUserDevice) QemuSCSIParams(config *Config) []string { | |||||||
| // QemuBlkParams builds QEMU device parameters for a VhostUserBlk device | // QemuBlkParams builds QEMU device parameters for a VhostUserBlk device | ||||||
| func (vhostuserDev VhostUserDevice) QemuBlkParams(config *Config) []string { | func (vhostuserDev VhostUserDevice) QemuBlkParams(config *Config) []string { | ||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
| 	var devParams []string | 	var deviceParams []string | ||||||
|  |  | ||||||
| 	driver := vhostuserDev.deviceName(config) | 	driver := vhostuserDev.deviceName(config) | ||||||
| 	if driver == "" { | 	if driver == "" { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	devParams = append(devParams, driver) | 	deviceParams = append(deviceParams, driver) | ||||||
| 	devParams = append(devParams, "logical_block_size=4096") | 	deviceParams = append(deviceParams, "logical_block_size=4096") | ||||||
| 	devParams = append(devParams, "size=512M") | 	deviceParams = append(deviceParams, "size=512M") | ||||||
| 	devParams = append(devParams, fmt.Sprintf("chardev=%s", vhostuserDev.CharDevID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("chardev=%s", vhostuserDev.CharDevID)) | ||||||
|  |  | ||||||
| 	if vhostuserDev.Transport.isVirtioPCI(config) && vhostuserDev.ROMFile != "" { | 	if vhostuserDev.Transport.isVirtioPCI(config) && vhostuserDev.ROMFile != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("romfile=%s", vhostuserDev.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", vhostuserDev.ROMFile)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(devParams, ",")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1410,31 +1410,31 @@ func (vhostuserDev VhostUserDevice) QemuBlkParams(config *Config) []string { | |||||||
| // QemuFSParams builds QEMU device parameters for a VhostUserFS device | // QemuFSParams builds QEMU device parameters for a VhostUserFS device | ||||||
| func (vhostuserDev VhostUserDevice) QemuFSParams(config *Config) []string { | func (vhostuserDev VhostUserDevice) QemuFSParams(config *Config) []string { | ||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
| 	var devParams []string | 	var deviceParams []string | ||||||
|  |  | ||||||
| 	driver := vhostuserDev.deviceName(config) | 	driver := vhostuserDev.deviceName(config) | ||||||
| 	if driver == "" { | 	if driver == "" { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	devParams = append(devParams, driver) | 	deviceParams = append(deviceParams, driver) | ||||||
| 	devParams = append(devParams, fmt.Sprintf("chardev=%s", vhostuserDev.CharDevID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("chardev=%s", vhostuserDev.CharDevID)) | ||||||
| 	devParams = append(devParams, fmt.Sprintf("tag=%s", vhostuserDev.Tag)) | 	deviceParams = append(deviceParams, fmt.Sprintf("tag=%s", vhostuserDev.Tag)) | ||||||
| 	if vhostuserDev.CacheSize != 0 { | 	if vhostuserDev.CacheSize != 0 { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("cache-size=%dM", vhostuserDev.CacheSize)) | 		deviceParams = append(deviceParams, fmt.Sprintf("cache-size=%dM", vhostuserDev.CacheSize)) | ||||||
| 	} | 	} | ||||||
| 	if vhostuserDev.SharedVersions { | 	if vhostuserDev.SharedVersions { | ||||||
| 		devParams = append(devParams, "versiontable=/dev/shm/fuse_shared_versions") | 		deviceParams = append(deviceParams, "versiontable=/dev/shm/fuse_shared_versions") | ||||||
| 	} | 	} | ||||||
| 	if vhostuserDev.Transport.isVirtioCCW(config) { | 	if vhostuserDev.Transport.isVirtioCCW(config) { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("devno=%s", vhostuserDev.DevNo)) | 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", vhostuserDev.DevNo)) | ||||||
| 	} | 	} | ||||||
| 	if vhostuserDev.Transport.isVirtioPCI(config) && vhostuserDev.ROMFile != "" { | 	if vhostuserDev.Transport.isVirtioPCI(config) && vhostuserDev.ROMFile != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("romfile=%s", vhostuserDev.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", vhostuserDev.ROMFile)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(devParams, ",")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1443,7 +1443,7 @@ func (vhostuserDev VhostUserDevice) QemuFSParams(config *Config) []string { | |||||||
| func (vhostuserDev VhostUserDevice) QemuParams(config *Config) []string { | func (vhostuserDev VhostUserDevice) QemuParams(config *Config) []string { | ||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
| 	var charParams []string | 	var charParams []string | ||||||
| 	var devParams []string | 	var deviceParams []string | ||||||
|  |  | ||||||
| 	charParams = append(charParams, "socket") | 	charParams = append(charParams, "socket") | ||||||
| 	charParams = append(charParams, fmt.Sprintf("id=%s", vhostuserDev.CharDevID)) | 	charParams = append(charParams, fmt.Sprintf("id=%s", vhostuserDev.CharDevID)) | ||||||
| @@ -1454,19 +1454,19 @@ func (vhostuserDev VhostUserDevice) QemuParams(config *Config) []string { | |||||||
|  |  | ||||||
| 	switch vhostuserDev.VhostUserType { | 	switch vhostuserDev.VhostUserType { | ||||||
| 	case VhostUserNet: | 	case VhostUserNet: | ||||||
| 		devParams = vhostuserDev.QemuNetParams(config) | 		deviceParams = vhostuserDev.QemuNetParams(config) | ||||||
| 	case VhostUserSCSI: | 	case VhostUserSCSI: | ||||||
| 		devParams = vhostuserDev.QemuSCSIParams(config) | 		deviceParams = vhostuserDev.QemuSCSIParams(config) | ||||||
| 	case VhostUserBlk: | 	case VhostUserBlk: | ||||||
| 		devParams = vhostuserDev.QemuBlkParams(config) | 		deviceParams = vhostuserDev.QemuBlkParams(config) | ||||||
| 	case VhostUserFS: | 	case VhostUserFS: | ||||||
| 		devParams = vhostuserDev.QemuFSParams(config) | 		deviceParams = vhostuserDev.QemuFSParams(config) | ||||||
| 	default: | 	default: | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if devParams != nil { | 	if deviceParams != nil { | ||||||
| 		return append(qemuParams, devParams...) | 		return append(qemuParams, deviceParams...) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| @@ -1639,26 +1639,26 @@ func (vfioDev VFIODevice) QemuParams(config *Config) []string { | |||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf("%s,host=%s", driver, vfioDev.BDF)) | 	deviceParams = append(deviceParams, fmt.Sprintf("%s,host=%s", driver, vfioDev.BDF)) | ||||||
| 	if vfioDev.Transport.isVirtioPCI(config) { | 	if vfioDev.Transport.isVirtioPCI(config) { | ||||||
| 		if vfioDev.VendorID != "" { | 		if vfioDev.VendorID != "" { | ||||||
| 			deviceParams = append(deviceParams, fmt.Sprintf(",x-pci-vendor-id=%s", vfioDev.VendorID)) | 			deviceParams = append(deviceParams, fmt.Sprintf("x-pci-vendor-id=%s", vfioDev.VendorID)) | ||||||
| 		} | 		} | ||||||
| 		if vfioDev.DeviceID != "" { | 		if vfioDev.DeviceID != "" { | ||||||
| 			deviceParams = append(deviceParams, fmt.Sprintf(",x-pci-device-id=%s", vfioDev.DeviceID)) | 			deviceParams = append(deviceParams, fmt.Sprintf("x-pci-device-id=%s", vfioDev.DeviceID)) | ||||||
| 		} | 		} | ||||||
| 		if vfioDev.ROMFile != "" { | 		if vfioDev.ROMFile != "" { | ||||||
| 			deviceParams = append(deviceParams, fmt.Sprintf(",romfile=%s", vfioDev.ROMFile)) | 			deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", vfioDev.ROMFile)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if vfioDev.Bus != "" { | 	if vfioDev.Bus != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",bus=%s", vfioDev.Bus)) | 		deviceParams = append(deviceParams, fmt.Sprintf("bus=%s", vfioDev.Bus)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if vfioDev.Transport.isVirtioCCW(config) { | 	if vfioDev.Transport.isVirtioCCW(config) { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",devno=%s", vfioDev.DevNo)) | 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", vfioDev.DevNo)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(deviceParams, "")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1715,35 +1715,35 @@ func (scsiCon SCSIController) Valid() bool { | |||||||
| // QemuParams returns the qemu parameters built out of this SCSIController device. | // QemuParams returns the qemu parameters built out of this SCSIController device. | ||||||
| func (scsiCon SCSIController) QemuParams(config *Config) []string { | func (scsiCon SCSIController) QemuParams(config *Config) []string { | ||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
| 	var devParams []string | 	var deviceParams []string | ||||||
|  |  | ||||||
| 	driver := scsiCon.deviceName(config) | 	driver := scsiCon.deviceName(config) | ||||||
| 	devParams = append(devParams, fmt.Sprintf("%s,id=%s", driver, scsiCon.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("%s,id=%s", driver, scsiCon.ID)) | ||||||
| 	if scsiCon.Bus != "" { | 	if scsiCon.Bus != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("bus=%s", scsiCon.Bus)) | 		deviceParams = append(deviceParams, fmt.Sprintf("bus=%s", scsiCon.Bus)) | ||||||
| 	} | 	} | ||||||
| 	if scsiCon.Addr != "" { | 	if scsiCon.Addr != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("addr=%s", scsiCon.Addr)) | 		deviceParams = append(deviceParams, fmt.Sprintf("addr=%s", scsiCon.Addr)) | ||||||
| 	} | 	} | ||||||
| 	if s := scsiCon.Transport.disableModern(config, scsiCon.DisableModern); s != "" { | 	if s := scsiCon.Transport.disableModern(config, scsiCon.DisableModern); s != "" { | ||||||
| 		devParams = append(devParams, s) | 		deviceParams = append(deviceParams, s) | ||||||
| 	} | 	} | ||||||
| 	if scsiCon.IOThread != "" { | 	if scsiCon.IOThread != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("iothread=%s", scsiCon.IOThread)) | 		deviceParams = append(deviceParams, fmt.Sprintf("iothread=%s", scsiCon.IOThread)) | ||||||
| 	} | 	} | ||||||
| 	if scsiCon.Transport.isVirtioPCI(config) && scsiCon.ROMFile != "" { | 	if scsiCon.Transport.isVirtioPCI(config) && scsiCon.ROMFile != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("romfile=%s", scsiCon.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", scsiCon.ROMFile)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if scsiCon.Transport.isVirtioCCW(config) { | 	if scsiCon.Transport.isVirtioCCW(config) { | ||||||
| 		if config.Knobs.IOMMUPlatform { | 		if config.Knobs.IOMMUPlatform { | ||||||
| 			devParams = append(devParams, ",iommu_platform=on") | 			deviceParams = append(deviceParams, "iommu_platform=on") | ||||||
| 		} | 		} | ||||||
| 		devParams = append(devParams, fmt.Sprintf("devno=%s", scsiCon.DevNo)) | 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", scsiCon.DevNo)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(devParams, ",")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1813,36 +1813,36 @@ func (bridgeDev BridgeDevice) Valid() bool { | |||||||
| // QemuParams returns the qemu parameters built out of this bridge device. | // QemuParams returns the qemu parameters built out of this bridge device. | ||||||
| func (bridgeDev BridgeDevice) QemuParams(config *Config) []string { | func (bridgeDev BridgeDevice) QemuParams(config *Config) []string { | ||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
| 	var deviceParam []string | 	var deviceParams []string | ||||||
| 	var driver DeviceDriver | 	var driver DeviceDriver | ||||||
|  |  | ||||||
| 	switch bridgeDev.Type { | 	switch bridgeDev.Type { | ||||||
| 	case PCIEBridge: | 	case PCIEBridge: | ||||||
| 		driver = PCIePCIBridgeDriver | 		driver = PCIePCIBridgeDriver | ||||||
| 		deviceParam = append(deviceParam, fmt.Sprintf("%s,bus=%s,id=%s", driver, bridgeDev.Bus, bridgeDev.ID)) | 		deviceParams = append(deviceParams, fmt.Sprintf("%s,bus=%s,id=%s", driver, bridgeDev.Bus, bridgeDev.ID)) | ||||||
| 	default: | 	default: | ||||||
| 		driver = PCIBridgeDriver | 		driver = PCIBridgeDriver | ||||||
| 		shpc := "off" | 		shpc := "off" | ||||||
| 		if bridgeDev.SHPC { | 		if bridgeDev.SHPC { | ||||||
| 			shpc = "on" | 			shpc = "on" | ||||||
| 		} | 		} | ||||||
| 		deviceParam = append(deviceParam, fmt.Sprintf("%s,bus=%s,id=%s,chassis_nr=%d,shpc=%s", driver, bridgeDev.Bus, bridgeDev.ID, bridgeDev.Chassis, shpc)) | 		deviceParams = append(deviceParams, fmt.Sprintf("%s,bus=%s,id=%s,chassis_nr=%d,shpc=%s", driver, bridgeDev.Bus, bridgeDev.ID, bridgeDev.Chassis, shpc)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if bridgeDev.Addr != "" { | 	if bridgeDev.Addr != "" { | ||||||
| 		addr, err := strconv.Atoi(bridgeDev.Addr) | 		addr, err := strconv.Atoi(bridgeDev.Addr) | ||||||
| 		if err == nil && addr >= 0 { | 		if err == nil && addr >= 0 { | ||||||
| 			deviceParam = append(deviceParam, fmt.Sprintf(",addr=%x", addr)) | 			deviceParams = append(deviceParams, fmt.Sprintf("addr=%x", addr)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var transport VirtioTransport | 	var transport VirtioTransport | ||||||
| 	if transport.isVirtioPCI(config) && bridgeDev.ROMFile != "" { | 	if transport.isVirtioPCI(config) && bridgeDev.ROMFile != "" { | ||||||
| 		deviceParam = append(deviceParam, fmt.Sprintf(",romfile=%s", bridgeDev.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", bridgeDev.ROMFile)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(deviceParam, "")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1907,28 +1907,28 @@ func (vsock VSOCKDevice) QemuParams(config *Config) []string { | |||||||
| 	driver := vsock.deviceName(config) | 	driver := vsock.deviceName(config) | ||||||
| 	deviceParams = append(deviceParams, string(driver)) | 	deviceParams = append(deviceParams, string(driver)) | ||||||
| 	if s := vsock.Transport.disableModern(config, vsock.DisableModern); s != "" { | 	if s := vsock.Transport.disableModern(config, vsock.DisableModern); s != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | 		deviceParams = append(deviceParams, s) | ||||||
| 	} | 	} | ||||||
| 	if vsock.VHostFD != nil { | 	if vsock.VHostFD != nil { | ||||||
| 		qemuFDs := config.appendFDs([]*os.File{vsock.VHostFD}) | 		qemuFDs := config.appendFDs([]*os.File{vsock.VHostFD}) | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",vhostfd=%d", qemuFDs[0])) | 		deviceParams = append(deviceParams, fmt.Sprintf("vhostfd=%d", qemuFDs[0])) | ||||||
| 	} | 	} | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",id=%s", vsock.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("id=%s", vsock.ID)) | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",%s=%d", VSOCKGuestCID, vsock.ContextID)) | 	deviceParams = append(deviceParams, fmt.Sprintf("%s=%d", VSOCKGuestCID, vsock.ContextID)) | ||||||
|  |  | ||||||
| 	if vsock.Transport.isVirtioPCI(config) && vsock.ROMFile != "" { | 	if vsock.Transport.isVirtioPCI(config) && vsock.ROMFile != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",romfile=%s", vsock.ROMFile)) | 		deviceParams = append(deviceParams, fmt.Sprintf("romfile=%s", vsock.ROMFile)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if vsock.Transport.isVirtioCCW(config) { | 	if vsock.Transport.isVirtioCCW(config) { | ||||||
| 		if config.Knobs.IOMMUPlatform { | 		if config.Knobs.IOMMUPlatform { | ||||||
| 			deviceParams = append(deviceParams, ",iommu_platform=on") | 			deviceParams = append(deviceParams, "iommu_platform=on") | ||||||
| 		} | 		} | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",devno=%s", vsock.DevNo)) | 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", vsock.DevNo)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(deviceParams, "")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| } | } | ||||||
| @@ -1995,7 +1995,7 @@ func (v RngDevice) QemuParams(config *Config) []string { | |||||||
|  |  | ||||||
| 	if v.Transport.isVirtioCCW(config) { | 	if v.Transport.isVirtioCCW(config) { | ||||||
| 		if config.Knobs.IOMMUPlatform { | 		if config.Knobs.IOMMUPlatform { | ||||||
| 			deviceParams = append(deviceParams, ",iommu_platform=on") | 			deviceParams = append(deviceParams, "iommu_platform=on") | ||||||
| 		} | 		} | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", v.DevNo)) | 		deviceParams = append(deviceParams, fmt.Sprintf("devno=%s", v.DevNo)) | ||||||
| 	} | 	} | ||||||
| @@ -2331,16 +2331,16 @@ func (fwcfg FwCfg) QemuParams(config *Config) []string { | |||||||
| 			fwcfgParams = append(fwcfgParams, fmt.Sprintf("name=%s", f.Name)) | 			fwcfgParams = append(fwcfgParams, fmt.Sprintf("name=%s", f.Name)) | ||||||
|  |  | ||||||
| 			if f.File != "" { | 			if f.File != "" { | ||||||
| 				fwcfgParams = append(fwcfgParams, fmt.Sprintf(",file=%s", f.File)) | 				fwcfgParams = append(fwcfgParams, fmt.Sprintf("file=%s", f.File)) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if f.Str != "" { | 			if f.Str != "" { | ||||||
| 				fwcfgParams = append(fwcfgParams, fmt.Sprintf(",string=%s", f.Str)) | 				fwcfgParams = append(fwcfgParams, fmt.Sprintf("string=%s", f.Str)) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		qemuParams = append(qemuParams, "-fw_cfg") | 		qemuParams = append(qemuParams, "-fw_cfg") | ||||||
| 		qemuParams = append(qemuParams, strings.Join(fwcfgParams, "")) | 		qemuParams = append(qemuParams, strings.Join(fwcfgParams, ",")) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return qemuParams | 	return qemuParams | ||||||
| @@ -2530,15 +2530,15 @@ func (config *Config) appendMachine() { | |||||||
| 		machineParams = append(machineParams, config.Machine.Type) | 		machineParams = append(machineParams, config.Machine.Type) | ||||||
|  |  | ||||||
| 		if config.Machine.Acceleration != "" { | 		if config.Machine.Acceleration != "" { | ||||||
| 			machineParams = append(machineParams, fmt.Sprintf(",accel=%s", config.Machine.Acceleration)) | 			machineParams = append(machineParams, fmt.Sprintf("accel=%s", config.Machine.Acceleration)) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if config.Machine.Options != "" { | 		if config.Machine.Options != "" { | ||||||
| 			machineParams = append(machineParams, fmt.Sprintf(",%s", config.Machine.Options)) | 			machineParams = append(machineParams, config.Machine.Options) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		config.qemuParams = append(config.qemuParams, "-machine") | 		config.qemuParams = append(config.qemuParams, "-machine") | ||||||
| 		config.qemuParams = append(config.qemuParams, strings.Join(machineParams, "")) | 		config.qemuParams = append(config.qemuParams, strings.Join(machineParams, ",")) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -2555,17 +2555,16 @@ func (config *Config) appendQMPSockets() { | |||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		qmpParams := append([]string{}, fmt.Sprintf("%s:", q.Type)) | 		qmpParams := append([]string{}, fmt.Sprintf("%s:%s", q.Type, q.Name)) | ||||||
| 		qmpParams = append(qmpParams, q.Name) |  | ||||||
| 		if q.Server { | 		if q.Server { | ||||||
| 			qmpParams = append(qmpParams, ",server=on") | 			qmpParams = append(qmpParams, "server=on") | ||||||
| 			if q.NoWait { | 			if q.NoWait { | ||||||
| 				qmpParams = append(qmpParams, ",wait=off") | 				qmpParams = append(qmpParams, "wait=off") | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		config.qemuParams = append(config.qemuParams, "-qmp") | 		config.qemuParams = append(config.qemuParams, "-qmp") | ||||||
| 		config.qemuParams = append(config.qemuParams, strings.Join(qmpParams, "")) | 		config.qemuParams = append(config.qemuParams, strings.Join(qmpParams, ",")) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -2593,15 +2592,15 @@ func (config *Config) appendMemory() { | |||||||
| 		memoryParams = append(memoryParams, config.Memory.Size) | 		memoryParams = append(memoryParams, config.Memory.Size) | ||||||
|  |  | ||||||
| 		if config.Memory.Slots > 0 { | 		if config.Memory.Slots > 0 { | ||||||
| 			memoryParams = append(memoryParams, fmt.Sprintf(",slots=%d", config.Memory.Slots)) | 			memoryParams = append(memoryParams, fmt.Sprintf("slots=%d", config.Memory.Slots)) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if config.Memory.MaxMem != "" { | 		if config.Memory.MaxMem != "" { | ||||||
| 			memoryParams = append(memoryParams, fmt.Sprintf(",maxmem=%s", config.Memory.MaxMem)) | 			memoryParams = append(memoryParams, fmt.Sprintf("maxmem=%s", config.Memory.MaxMem)) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		config.qemuParams = append(config.qemuParams, "-m") | 		config.qemuParams = append(config.qemuParams, "-m") | ||||||
| 		config.qemuParams = append(config.qemuParams, strings.Join(memoryParams, "")) | 		config.qemuParams = append(config.qemuParams, strings.Join(memoryParams, ",")) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -2612,15 +2611,15 @@ func (config *Config) appendCPUs() error { | |||||||
| 		SMPParams = append(SMPParams, fmt.Sprintf("%d", config.SMP.CPUs)) | 		SMPParams = append(SMPParams, fmt.Sprintf("%d", config.SMP.CPUs)) | ||||||
|  |  | ||||||
| 		if config.SMP.Cores > 0 { | 		if config.SMP.Cores > 0 { | ||||||
| 			SMPParams = append(SMPParams, fmt.Sprintf(",cores=%d", config.SMP.Cores)) | 			SMPParams = append(SMPParams, fmt.Sprintf("cores=%d", config.SMP.Cores)) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if config.SMP.Threads > 0 { | 		if config.SMP.Threads > 0 { | ||||||
| 			SMPParams = append(SMPParams, fmt.Sprintf(",threads=%d", config.SMP.Threads)) | 			SMPParams = append(SMPParams, fmt.Sprintf("threads=%d", config.SMP.Threads)) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if config.SMP.Sockets > 0 { | 		if config.SMP.Sockets > 0 { | ||||||
| 			SMPParams = append(SMPParams, fmt.Sprintf(",sockets=%d", config.SMP.Sockets)) | 			SMPParams = append(SMPParams, fmt.Sprintf("sockets=%d", config.SMP.Sockets)) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if config.SMP.MaxCPUs > 0 { | 		if config.SMP.MaxCPUs > 0 { | ||||||
| @@ -2628,11 +2627,11 @@ func (config *Config) appendCPUs() error { | |||||||
| 				return fmt.Errorf("MaxCPUs %d must be equal to or greater than CPUs %d", | 				return fmt.Errorf("MaxCPUs %d must be equal to or greater than CPUs %d", | ||||||
| 					config.SMP.MaxCPUs, config.SMP.CPUs) | 					config.SMP.MaxCPUs, config.SMP.CPUs) | ||||||
| 			} | 			} | ||||||
| 			SMPParams = append(SMPParams, fmt.Sprintf(",maxcpus=%d", config.SMP.MaxCPUs)) | 			SMPParams = append(SMPParams, fmt.Sprintf("maxcpus=%d", config.SMP.MaxCPUs)) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		config.qemuParams = append(config.qemuParams, "-smp") | 		config.qemuParams = append(config.qemuParams, "-smp") | ||||||
| 		config.qemuParams = append(config.qemuParams, strings.Join(SMPParams, "")) | 		config.qemuParams = append(config.qemuParams, strings.Join(SMPParams, ",")) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| @@ -2648,15 +2647,15 @@ func (config *Config) appendRTC() { | |||||||
| 	RTCParams = append(RTCParams, fmt.Sprintf("base=%s", string(config.RTC.Base))) | 	RTCParams = append(RTCParams, fmt.Sprintf("base=%s", string(config.RTC.Base))) | ||||||
|  |  | ||||||
| 	if config.RTC.DriftFix != "" { | 	if config.RTC.DriftFix != "" { | ||||||
| 		RTCParams = append(RTCParams, fmt.Sprintf(",driftfix=%s", config.RTC.DriftFix)) | 		RTCParams = append(RTCParams, fmt.Sprintf("driftfix=%s", config.RTC.DriftFix)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if config.RTC.Clock != "" { | 	if config.RTC.Clock != "" { | ||||||
| 		RTCParams = append(RTCParams, fmt.Sprintf(",clock=%s", config.RTC.Clock)) | 		RTCParams = append(RTCParams, fmt.Sprintf("clock=%s", config.RTC.Clock)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	config.qemuParams = append(config.qemuParams, "-rtc") | 	config.qemuParams = append(config.qemuParams, "-rtc") | ||||||
| 	config.qemuParams = append(config.qemuParams, strings.Join(RTCParams, "")) | 	config.qemuParams = append(config.qemuParams, strings.Join(RTCParams, ",")) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (config *Config) appendGlobalParam() { | func (config *Config) appendGlobalParam() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user