diff --git a/qemu/qemu.go b/qemu/qemu.go index 4b0e41795..f2f4f5b8b 100644 --- a/qemu/qemu.go +++ b/qemu/qemu.go @@ -907,6 +907,9 @@ type BridgeDevice struct { // SHPC is used to enable or disable the standard hot plug controller SHPC bool + + // PCI Slot + Addr string } // Valid returns true if the BridgeDevice structure is valid and complete. @@ -941,6 +944,13 @@ func (bridgeDev BridgeDevice) QemuParams(config *Config) []string { } deviceParam := fmt.Sprintf("%s,bus=%s,id=%s,chassis_nr=%d,shpc=%s", deviceName, bridgeDev.Bus, bridgeDev.ID, bridgeDev.Chassis, shpc) + if bridgeDev.Addr != "" { + addr, err := strconv.Atoi(bridgeDev.Addr) + if err == nil && addr >= 0 { + deviceParam += fmt.Sprintf(",addr=%x", addr) + } + } + qemuParams = append(qemuParams, "-device") qemuParams = append(qemuParams, deviceParam) diff --git a/qemu/qemu_test.go b/qemu/qemu_test.go index 0506f4240..895fe0f15 100644 --- a/qemu/qemu_test.go +++ b/qemu/qemu_test.go @@ -365,6 +365,22 @@ func TestAppendDeviceSCSIController(t *testing.T) { testAppend(scsiCon, deviceSCSIControllerBusAddrStr, t) } +var deviceBridgeString = "-device pci-bridge,bus=/pci-bus/pcie.0,id=mybridge,chassis_nr=5,shpc=on,addr=ff" + +func TestAppendBridgeDevice(t *testing.T) { + + bridge := BridgeDevice{ + Type: PCIBridge, + ID: "mybridge", + Bus: "/pci-bus/pcie.0", + Addr: "255", + Chassis: 5, + SHPC: true, + } + + testAppend(bridge, deviceBridgeString, t) +} + func TestAppendEmptyDevice(t *testing.T) { device := SerialDevice{}