Re: [PATCH kvm-unit-tests 2/4] Introduce a C++ wrapper for the kvm APIs

Anthony Liguori
2010-11-24T17:15:15Z

On 11/24/2010 11:07 AM, Avi Kivity wrote:
> On 11/24/2010 07:02 PM, Gleb Natapov wrote:
>> On Wed, Nov 24, 2010 at 06:56:52PM +0200, Avi Kivity wrote:
>> > On 11/24/2010 06:52 PM, Gleb Natapov wrote:
>> > >> Plus some magic glue. You can't say it is an ISA bridge. It's
>> > >> exactly what its spec says it is.
>> > >>
>> > >First thing my spec says is "Bridge Between the PCI Bus and ISA Bus"
>> >
>> > It's the first item in a list of features. Be serious.
>> >
>> I am serious. The fact that it provides IDE or kbd doesn't make this IDE
>> or kbd special. It means that it has gates that provide functionality of
>> those chips. Just like SoC really. IDE doesn't become part of ARM cpu
>> just because some SoC somewhere include them on the same silicon.
>
> They aren't special. They're just part of the PIIX3 device.

So based on the IRC discussion that pbrook and I have been having, you
can think of things like this:

class PIIX3 {
public:
Plug<I8042> i8042;
};

A plug allows conditional composition whereas the absence of a plug
means unconditional composition. There is a mechanism to name plugs and
you can have an i8042 factory to create the device and then
conditionally attach it to the plug.

This is fine even though I think it's unnecessary abstraction. What I
object to is introducing an artificial ISA bus layering.

A Plug<Type> is basically a Type * except it has some additional
features. It provides null-pointer dereference checking, provides a
marshalling interface, and supports the ability to be locked which
enables a device to enforce that plugging cannot happen after the device
is realized (power-on).

>> > When we do have a spec for something, we should implement it as the
>> > spec says, not according to our ideas of how it should be.
>> >
>> PIIX3 is composite device. It is not one device. To emulate it you need
>> to provide functionality of all devices included om PIIX3. Spec says
>> nothing about how it should be implemented.
>
> Right, we could (and probably should) implement it as
>
> class PIIX3 {
> private:
> class isa_bridge { .... };
> isa_bridge isa_bridge;

No, PIIX3 is an PCI-to-ISA bridge.

It's a fundamental part of the definition of it as a PCI device.

Regards,

Anthony Liguori

> i8042 kbc;
> ...
> }
>
> So the thing becomes just a glue layer for various components. But
> when pc.c says PIIX3, it gets what the spec says, not something else.
>