From: Ian Jackson <Ian.Jackson@eu.citrix.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
Don Dutile <ddutile@redhat.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: [Xen-devel] Re: [PATCH 11/11] Unplug emulated disks and nics
Date: Thu, 27 May 2010 15:49:34 +0100 [thread overview]
Message-ID: <19454.34430.471499.222290@mariner.uk.xensource.com> (raw)
In-Reply-To: <m2n.s.1OHcBK-0018DA@chiark.greenend.org.uk>
Stefano Stabellini writes ("[Xen-devel] Re: [PATCH 11/11] Unplug emulated disks and nics"):
> On Wed, 26 May 2010, Jeremy Fitzhardinge wrote:
> > Wow, this interface is perverse. It reuses the same IO port but changes
> > function depending on the size of the IO? Again, wow.
>
> Yeah, before you ask, I didn't write it :)
Yes, neither did I :-). However, I did document it and now I also
maintain the "product number" registry. Did you find the interface
spec ? Enclosed below in case not.
I hereby allocate you ("pvops PV-on-HVM Linux, upstream") product
number 3. Does the kernel have a way to distinguish between upstream
and other versions ? Eg, there's the kernel version name suffix
thingy if I remember rightly. Perhaps we should allocate a different
number for "some pvops pv-on-hvm Linux with a nonempty kernel version
name suffix". Please advise.
You are welcome to use whatever you like for the "build number".
Perhaps the best thing would a two-byte encoding of the kernel version
number if that is possible. As the purpose is logging and
blacklisting, it's not that critical although it's better to reuse the
same number for excessively similar builds than to use a random scheme
which might generate accidental clashes between unrelated versions.
Ian.
MAGIC IOPORT 0x10 PROTOCOL
The protocol covers three basic things:
-- Disconnecting emulated devices.
-- Getting log messages out of the drivers and into dom0.
-- Allowing dom0 to block the loading of specific drivers. This is
intended as a backwards-compatibility thing: if we discover a bug
in some old version of the drivers, then rather than working around
it in Xen, we have the option of just making those drivers fall
back to emulated mode.
The current protocol works like this (from the point of view of
drivers):
1) When the drivers first come up, they check whether the unplug logic
is available by reading a two-byte magic number from IO port 0x10.
These should be 0x49d2. If the magic number doesn't match, the
drivers don't do anything.
2) The drivers read a one-byte protocol version from IO port 0x12. If
this is 0, skip to 6.
3) The drivers write a two-byte product number to IO port 0x12. At
the moment, the only drivers using this protocol are our
closed-source ones, which use product number 1.
4) The drivers write a four-byte build number to IO port 0x10.
5) The drivers check the magic number by reading two bytes from 0x10
again. If it's changed from 0x49d2 to 0xd249, the drivers are
blacklisted and should not load.
6) The drivers write a two-byte bitmask of devices to unplug to IO
port 0x10. The defined fields are:
1 -- All IDE disks (not including CD drives)
2 -- All emulated NICs
4 -- All IDE disks except for the primary master (not including CD
drives)
The relevant emulated devices then disappear from the relevant
buses. For most guest operating systems, you want to do this
before device enumeration happens.
...) Once the drivers have checked the magic number, they can send log
messages to qemu which will be logged to wherever qemu's logs go
(/var/log/xen/qemu-dm.log on normal Xen, dom0 syslog on
XenServer). These messages are written to IO port 0x12 a byte at
a time, and are terminated by newlines. There's a fairly
aggressive rate limiter on these messages, so they shouldn't be
used for anything even vaguely high-volume, but they're rather
useful for debugging and support.
It is still permitted for a driver to use this logging feature if
it is blacklisted, but ONLY if it has checked the magic number
and found it to be 0x49d2 or 0xd249.
This isn't exactly a pretty protocol, but it does solve the problem.
The blacklist is, from qemu's point of view, handled mostly through
xenstore. A driver version is considered to be blacklisted if
/mh/driver-blacklist/{product_name}/{build_number} exists and is
readable, where {build_number} is the build number from step 4 as a
decimal number. {product_name} is a string corresponding to the
product number in step 3.
The master registry of product names and numbers is in
qemu-xen-unstable's xenstore.c.
next prev parent reply other threads:[~2010-05-27 14:59 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-24 18:25 [PATCH 0 of 12] PV on HVM Xen Stefano Stabellini
2010-05-24 18:27 ` [PATCH 01/11] Add support for hvm_op Stefano Stabellini
2010-05-24 18:27 ` [PATCH 02/11] early PV on HVM Stefano Stabellini
2010-05-24 18:27 ` [PATCH 03/11] evtchn delivery " Stefano Stabellini
2010-05-24 18:27 ` [PATCH 04/11] Fix find_unbound_irq in presence of ioapic irqs Stefano Stabellini
2010-05-26 18:26 ` [Xen-devel] " Konrad Rzeszutek Wilk
2010-05-27 14:49 ` Stefano Stabellini
2010-05-27 15:36 ` Konrad Rzeszutek Wilk
2010-05-24 18:27 ` [PATCH 05/11] Xen PCI platform device driver Stefano Stabellini
2010-05-28 8:55 ` [Xen-devel] " Zhigang Wang
2010-05-28 14:18 ` Stefano Stabellini
2010-05-24 18:27 ` [PATCH 06/11] Add suspend\resume support for PV on HVM guests Stefano Stabellini
2010-05-25 20:20 ` Jeremy Fitzhardinge
2010-05-24 18:27 ` [PATCH 07/11] Allow xen platform pci device to be compiled as a module Stefano Stabellini
2010-05-24 18:27 ` [PATCH 08/11] Fix possible NULL pointer dereference in print_IO_APIC Stefano Stabellini
2010-05-24 18:27 ` [PATCH 09/11] __setup_vector_irq: handle NULL chip_data Stefano Stabellini
2010-05-24 18:27 ` [PATCH 10/11] Support VIRQ_TIMER and pvclock on HVM Stefano Stabellini
2010-05-25 20:24 ` Jeremy Fitzhardinge
2010-05-26 13:08 ` Stefano Stabellini
2010-05-24 18:27 ` [PATCH 11/11] Unplug emulated disks and nics Stefano Stabellini
2010-05-25 20:31 ` Jeremy Fitzhardinge
2010-05-26 12:27 ` Stefano Stabellini
2010-05-26 20:59 ` Jeremy Fitzhardinge
2010-05-27 12:29 ` Stefano Stabellini
[not found] ` <m2n.s.1OHcBK-0018DA@chiark.greenend.org.uk>
2010-05-27 14:49 ` Ian Jackson [this message]
2010-05-27 17:25 ` [Xen-devel] " Stefano Stabellini
2010-05-27 17:51 ` Jeremy Fitzhardinge
2010-05-27 18:10 ` Stefano Stabellini
2010-05-24 18:29 ` [PATCH 0 of 12] PV on HVM Xen Stefano Stabellini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=19454.34430.471499.222290@mariner.uk.xensource.com \
--to=ian.jackson@eu.citrix.com \
--cc=ddutile@redhat.com \
--cc=jeremy@goop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®