diff --git a/qemu/qemu.go b/qemu/qemu.go index 05cf9e16b9..99a7677f2b 100644 --- a/qemu/qemu.go +++ b/qemu/qemu.go @@ -1118,6 +1118,24 @@ func (blkdev BlockDevice) deviceName(config *Config) string { return string(blkdev.Driver) } +// PVPanicDevice represents a qemu pvpanic device. +type PVPanicDevice struct { + NoShutdown bool +} + +// Valid always returns true for pvpanic device +func (dev PVPanicDevice) Valid() bool { + return true +} + +// QemuParams returns the qemu parameters built out of this serial device. +func (dev PVPanicDevice) QemuParams(config *Config) []string { + if dev.NoShutdown { + return []string{"-device", "pvpanic", "-no-shutdown"} + } + return []string{"-device", "pvpanic"} +} + // VhostUserDevice represents a qemu vhost-user device meant to be passed // in to the guest type VhostUserDevice struct { diff --git a/qemu/qemu_test.go b/qemu/qemu_test.go index 6928ede4bc..cabc57cc63 100644 --- a/qemu/qemu_test.go +++ b/qemu/qemu_test.go @@ -1203,3 +1203,18 @@ func TestAppendFwcfg(t *testing.T) { } testAppend(fwcfg, fwcfgString, t) } + +func TestAppendPVPanicDevice(t *testing.T) { + testCases := []struct { + dev Device + out string + }{ + {nil, ""}, + {PVPanicDevice{}, "-device pvpanic"}, + {PVPanicDevice{NoShutdown: true}, "-device pvpanic -no-shutdown"}, + } + + for _, tc := range testCases { + testAppend(tc.dev, tc.out, t) + } +}