Hi,
They call register_ioport_write(), which aborts via hw_error() when
the port is already in use. This is okay for non-configurable
parts of a board emulation, but not okay for a qdev device, unless
it has no_user set.
Related: when isa_init_irq() finds the requested IRQ already in
use, it fails with exit(1). Maybe register_ioport_write()&
friends should do that as well.
Or maybe qdev device models should have an "at most one" flag.
There can be multiple of these devices on different ports, but a
single PIO port can still only be managed by a single device. By
creating the same device twice without giving it a PIO option, you
put two devices on the same PIO port which can't work.
As this is a configuration error, I'd guess the best way to deal with
it is to return an error for register_ioport which makes the qdev
init fail. Then the respective instantiator can do what is fit. If
the device is passed in on the cmdline, it'd refuse to create the
machine and exit. If it's a hotplug event, it would fail to hotplug.
ISA isn't hotpluggable anyway, so just exiting unconditionally here
isn't a big issue IMHO as effectively only ISA devices are affected by
this.
register_ioport_write() should exit with a more useful error message
here instead of calling hw_error() though.
We could also make register_ioport_write() pass up an error and have all
callers check that. Not sure this is worth the trouble though.
An "at most one" flag might make sense. But on a PC all ISA devices
which exist only once at a fixed address (keyboard, floppy, ...) are
automagically created so no_user does the trick here. The other ones
(serial, ne2k_isa, ...) actually can be created multiple times if you
configure different iobases using properties.
Dunno what kind of device apple-smc is ...
cheers,
Gerd