qemu-devel
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]