[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] qdev: Some ISA devices don't handle second instantiatio
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] qdev: Some ISA devices don't handle second instantiation gracefully |
Date: |
Tue, 12 Oct 2010 15:54:59 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) |
Anthony Liguori <address@hidden> writes:
> On 10/12/2010 08:00 AM, Markus Armbruster wrote:
>> Markus Armbruster<address@hidden> writes:
>>
>>
>>> When I try -device isa-applesmc -device isa-applesmc, I get
>>>
>>> WARNING: Using AppleSMC with invalid key
>>> qemu: hardware error: register_ioport_read: invalid opaque
>>> [...]
>>>
>>> and a core dump.
>>>
>>> I know nothing about this device. Instantiating twice may well make no
>>> sense. But hw_error() is not a nice way to reject a command line
>>> option.
>>>
>> Actually, ib700 and isa-debugcon fail the same way.
>>
>> 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.
>>
>
> It's definitely right to fail but I agree, it's better to propagate
> the error.
>
>> 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.
>>
>
> I think the proper thing to do is remove all exit(1)s and propagate
> errors instead.
exit() is good enough during startup, i.e. -device. It's wrong for hot
plug; anything to be used in a hot plug path must propagate errors. We
could keep exiting in code that's only used by non-hotpluggable devices.
> A simple approach would be to make register_ioport_{read,write}()
> return an int, then do a query-replace on the source tree to make all
> invocations of it simply check the return value and exit if it's
> non-zero.
In similar cases, we've used a simple FOO_nofail() wrapper in places
that want to exit.
I'll see what I can do.