Paul Durrant
2012-Sep-26 12:33 UTC
[PATCH] Use new Xen public header for product numbers and names
xen/include/public/hvm/pvdrivers.h has been added as the
register of product numbers used by the blacklisting protocol.
Use the definitions therein rather then locally coded values.
Signed-off-by: Paul Durrant <paul.durrent@citrix.com>
---
xenstore.c | 30 ++++++++++++++----------------
1 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/xenstore.c b/xenstore.c
index 1857160..04ae199 100644
--- a/xenstore.c
+++ b/xenstore.c
@@ -23,6 +23,8 @@
#include "qemu-timer.h"
#include "qemu-xen.h"
+#include <xen/hvm/pvdrivers.h>
+
struct xs_handle *xsh = NULL;
static char *media_filename[MAX_DRIVES+1];
static QEMUTimer *insert_timer = NULL;
@@ -961,22 +963,18 @@ xenstore_pv_driver_build_blacklisted(uint16_t product_nr,
const char *product;
switch (product_nr) {
- /*
- * In qemu-xen-unstable, this is the master registry of product
- * numbers. If you need a new product number allocating, please
- * post to xen-devel@lists.xensource.com. You should NOT use
- * an existing product number without allocating one.
- *
- * If you maintain a seaparate versioning and distribution path
- * for PV drivers you should have a separate product number so
- * that your drivers can be separated from others''.
- *
- * During development, you may use the product ID 0xffff to
- * indicate a driver which is yet to be released.
- */
- case 1: product = "xensource-windows"; break; /* Citrix */
- case 2: product = "gplpv-windows"; break; /* James Harper */
- case 0xffff: product = "experimental"; break;
+ case PVDRIVERS_XENSOURCE_WINDOWS_ID:
+ product = PVDRIVERS_XENSOURCE_WINDOWS_NAME;
+ break;
+ case PVDRIVERS_GPLPV_WINDOWS_ID:
+ product = PVDRIVERS_GPLPV_WINDOWS_NAME;
+ break;
+ case PVDRIVERS_LINUX_ID:
+ product = PVDRIVERS_LINUX_NAME;
+ break;
+ case PVDRIVERS_EXPERIMENTAL_ID:
+ product = PVDRIVERS_EXPERIMENTAL_NAME;
+ break;
default:
/* Don''t know what product this is -> we can''t
blacklist
* it. */
--
1.7.2.5
Paul Durrant
2012-Sep-26 13:54 UTC
[PATCH] Use new Xen public header for product numbers and names
xen/include/public/hvm/pvdrivers.h has been added as the
register of product numbers used by the blacklisting protocol.
Use the definitions therein rather then locally coded values.
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
xenstore.c | 30 ++++++++++++++----------------
1 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/xenstore.c b/xenstore.c
index 1857160..04ae199 100644
--- a/xenstore.c
+++ b/xenstore.c
@@ -23,6 +23,8 @@
#include "qemu-timer.h"
#include "qemu-xen.h"
+#include <xen/hvm/pvdrivers.h>
+
struct xs_handle *xsh = NULL;
static char *media_filename[MAX_DRIVES+1];
static QEMUTimer *insert_timer = NULL;
@@ -961,22 +963,18 @@ xenstore_pv_driver_build_blacklisted(uint16_t product_nr,
const char *product;
switch (product_nr) {
- /*
- * In qemu-xen-unstable, this is the master registry of product
- * numbers. If you need a new product number allocating, please
- * post to xen-devel@lists.xensource.com. You should NOT use
- * an existing product number without allocating one.
- *
- * If you maintain a seaparate versioning and distribution path
- * for PV drivers you should have a separate product number so
- * that your drivers can be separated from others''.
- *
- * During development, you may use the product ID 0xffff to
- * indicate a driver which is yet to be released.
- */
- case 1: product = "xensource-windows"; break; /* Citrix */
- case 2: product = "gplpv-windows"; break; /* James Harper */
- case 0xffff: product = "experimental"; break;
+ case PVDRIVERS_XENSOURCE_WINDOWS_ID:
+ product = PVDRIVERS_XENSOURCE_WINDOWS_NAME;
+ break;
+ case PVDRIVERS_GPLPV_WINDOWS_ID:
+ product = PVDRIVERS_GPLPV_WINDOWS_NAME;
+ break;
+ case PVDRIVERS_LINUX_ID:
+ product = PVDRIVERS_LINUX_NAME;
+ break;
+ case PVDRIVERS_EXPERIMENTAL_ID:
+ product = PVDRIVERS_EXPERIMENTAL_NAME;
+ break;
default:
/* Don''t know what product this is -> we can''t
blacklist
* it. */
--
1.7.2.5
Ian Jackson
2012-Sep-28 17:55 UTC
Re: [PATCH] Use new Xen public header for product numbers and names
Paul Durrant writes ("[Xen-devel] [PATCH] Use new Xen public header for
product numbers and names"):> xen/include/public/hvm/pvdrivers.h has been added as the
> register of product numbers used by the blacklisting protocol.
> Use the definitions therein rather then locally coded values.
This approach duplicates the list as is IMO not acceptable:
> + case PVDRIVERS_XENSOURCE_WINDOWS_ID:
> + product = PVDRIVERS_XENSOURCE_WINDOWS_NAME;
> + break;
> + case PVDRIVERS_GPLPV_WINDOWS_ID:
> + product = PVDRIVERS_GPLPV_WINDOWS_NAME;
> + break;
> + case PVDRIVERS_LINUX_ID:
> + product = PVDRIVERS_LINUX_NAME;
> + break;
> + case PVDRIVERS_EXPERIMENTAL_ID:
> + product = PVDRIVERS_EXPERIMENTAL_NAME;
> + break;
We need to avoid this formulaic code which needs changing every time a
new entry is added.
Ian.
Paul Durrant
2012-Oct-01 08:38 UTC
Re: [PATCH] Use new Xen public header for product numbers and names
> -----Original Message----- > From: Ian Jackson [mailto:Ian.Jackson@eu.citrix.com] > Sent: 28 September 2012 18:56 > To: Paul Durrant > Cc: xen-devel@lists.xen.org > Subject: Re: [Xen-devel] [PATCH] Use new Xen public header for product > numbers and names > > Paul Durrant writes ("[Xen-devel] [PATCH] Use new Xen public header for > product numbers and names"): > > xen/include/public/hvm/pvdrivers.h has been added as the register of > > product numbers used by the blacklisting protocol. > > Use the definitions therein rather then locally coded values. > > This approach duplicates the list as is IMO not acceptable: > > > + case PVDRIVERS_XENSOURCE_WINDOWS_ID: > > + product = PVDRIVERS_XENSOURCE_WINDOWS_NAME; > > + break; > > + case PVDRIVERS_GPLPV_WINDOWS_ID: > > + product = PVDRIVERS_GPLPV_WINDOWS_NAME; > > + break; > > + case PVDRIVERS_LINUX_ID: > > + product = PVDRIVERS_LINUX_NAME; > > + break; > > + case PVDRIVERS_EXPERIMENTAL_ID: > > + product = PVDRIVERS_EXPERIMENTAL_NAME; > > + break; > > We need to avoid this formulaic code which needs changing every time a > new entry is added. >Ok. I''ll come up with something we can use to define an array and then we can iterate over that. Paul
Paul Durrant
2012-Oct-01 09:43 UTC
[PATCH] Use new Xen public header for product numbers and names
xen/include/public/hvm/pvdrivers.h has been added as the
register of product numbers used by the blacklisting protocol.
Use the definitions therein rather then locally coded values.
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
xenstore.c | 23 +++++++----------------
1 files changed, 7 insertions(+), 16 deletions(-)
diff --git a/xenstore.c b/xenstore.c
index 1857160..4382674 100644
--- a/xenstore.c
+++ b/xenstore.c
@@ -23,6 +23,8 @@
#include "qemu-timer.h"
#include "qemu-xen.h"
+#include <xen/hvm/pvdrivers.h>
+
struct xs_handle *xsh = NULL;
static char *media_filename[MAX_DRIVES+1];
static QEMUTimer *insert_timer = NULL;
@@ -960,28 +962,17 @@ xenstore_pv_driver_build_blacklisted(uint16_t product_nr,
char *tmp;
const char *product;
+#define PRODUCT(_name, _nr) case _nr: product = _name; break;
switch (product_nr) {
- /*
- * In qemu-xen-unstable, this is the master registry of product
- * numbers. If you need a new product number allocating, please
- * post to xen-devel@lists.xensource.com. You should NOT use
- * an existing product number without allocating one.
- *
- * If you maintain a seaparate versioning and distribution path
- * for PV drivers you should have a separate product number so
- * that your drivers can be separated from others''.
- *
- * During development, you may use the product ID 0xffff to
- * indicate a driver which is yet to be released.
- */
- case 1: product = "xensource-windows"; break; /* Citrix */
- case 2: product = "gplpv-windows"; break; /* James Harper */
- case 0xffff: product = "experimental"; break;
+ PVDRIVERS_PRODUCT_LIST(PRODUCT)
default:
/* Don''t know what product this is -> we can''t
blacklist
* it. */
return 0;
}
+
+#undef PRODUCT
+
if (asprintf(&buf, "/mh/driver-blacklist/%s/%d", product,
build_nr) < 0)
return 0;
tmp = xs_read(xsh, XBT_NULL, buf, NULL);
--
1.7.2.5
Ian Jackson
2012-Oct-01 10:13 UTC
Re: [PATCH] Use new Xen public header for product numbers and names
Paul Durrant writes ("RE: [Xen-devel] [PATCH] Use new Xen public header for
product numbers and names"):> Ok. I''ll come up with something we can use to define an array and
> then we can iterate over that.
Great.
What do people think of this preprocessor approach, which I suggested
earlier:
#define PVDRIVERS_LIST(EACH) \
EACH(WINDOWS, 0x0001 /* Citrix */, "xensource-windows") \
...
That can be used to generate arrays, or switch statements, or
whatever. For example in pvdrivers.h:
#define PVDRIVERS_EACH_ENUM(name,num,string) \
PVDRIVERS_ID_##name = num,
enum {
PVDRIVERS_LIST(PVDRIVERS_EACH_ENUM)
};
and then in qemu:
#define PVDRIVERS_EACH_SWITCH(name,num,string) \
case PVDRIVERS_ID_##name: product = string; break;
switch (id) {
PVDRIVERS_LIST(PVDRIVERS_EACH_SWITCH)
default:
sprintf blah blah
}
If the indirect macro trick is too abstruse it''s also possible to do
this:
#define PVDRIVERS_LIST \
PVDRIVERS_EACH(WINDOWS, 0x0001 /* Citrix */, "xensource-windows")
\
...
That can be used to generate arrays, or switch statements, or
whatever. For example in pvdrivers.h:
#define PVDRIVERS_EACH(name,num,string) \
PVDRIVERS_ID_##name = num,
enum {
PVDRIVERS_LIST
};
#undef PVDRIVERS_EACH
and then in qemu:
#define PVDRIVERS_EACH(name,num,string) \
case PVDRIVERS_ID_##name: product = string; break;
switch (id) {
PVDRIVERS_LIST
default:
sprintf blah blah
}
#undef PVDRIVERS_EACH
A #define containing an array initialiser is the other obvious
alternative although of course the macro-based approaches I sketch
above can be used to define arrays but not vice versa.
Ian.
Paul Durrant
2012-Oct-01 10:28 UTC
Re: [PATCH] Use new Xen public header for product numbers and names
> -----Original Message----- > > What do people think of this preprocessor approach, which I suggested > earlier: > > #define PVDRIVERS_LIST(EACH) \ > EACH(WINDOWS, 0x0001 /* Citrix */, "xensource-windows") \ > ... >I liked it so that''s what I did :-) I added a terminator entry for convenience when defining an array. Not needed when defining a switch statement but harmless since it''s a case that should never be hit. Paul
Keir Fraser
2012-Oct-01 10:36 UTC
Re: [PATCH] Use new Xen public header for product numbers and names
On 01/10/2012 11:13, "Ian Jackson" <Ian.Jackson@eu.citrix.com> wrote:> Paul Durrant writes ("RE: [Xen-devel] [PATCH] Use new Xen public header for > product numbers and names"): >> Ok. I''ll come up with something we can use to define an array and >> then we can iterate over that. > > Great. > > > What do people think of this preprocessor approach, which I suggested > earlier:My usual way to do this would be to place the list in its own header file: pvdrivers_list.h: EACH(WINDOWS, 0x0001, "xensource-windows") EACH(...) ... Then e.g., #define EACH(name,num,string) PVDRIVERS_ID_##name = num, enum { #include "pvdrivers_list.h" } #undef EACH Which is a bit more abstruse on the consuming side, but does avoid the list itself being an ugly multi-line macro monster. I don''t have a strong opinion on this by the way. :) Just saying... -- Keir> #define PVDRIVERS_LIST(EACH) \ > EACH(WINDOWS, 0x0001 /* Citrix */, "xensource-windows") \ > ... > > That can be used to generate arrays, or switch statements, or > whatever. For example in pvdrivers.h: > > #define PVDRIVERS_EACH_ENUM(name,num,string) \ > PVDRIVERS_ID_##name = num, > enum { > PVDRIVERS_LIST(PVDRIVERS_EACH_ENUM) > }; > > and then in qemu: > > #define PVDRIVERS_EACH_SWITCH(name,num,string) \ > case PVDRIVERS_ID_##name: product = string; break; > > switch (id) { > PVDRIVERS_LIST(PVDRIVERS_EACH_SWITCH) > default: > sprintf blah blah > } > > > If the indirect macro trick is too abstruse it''s also possible to do > this: > > #define PVDRIVERS_LIST \ > PVDRIVERS_EACH(WINDOWS, 0x0001 /* Citrix */, "xensource-windows") \ > ... > > That can be used to generate arrays, or switch statements, or > whatever. For example in pvdrivers.h: > > #define PVDRIVERS_EACH(name,num,string) \ > PVDRIVERS_ID_##name = num, > enum { > PVDRIVERS_LIST > }; > #undef PVDRIVERS_EACH > > and then in qemu: > > #define PVDRIVERS_EACH(name,num,string) \ > case PVDRIVERS_ID_##name: product = string; break; > > switch (id) { > PVDRIVERS_LIST > default: > sprintf blah blah > } > > #undef PVDRIVERS_EACH > > > A #define containing an array initialiser is the other obvious > alternative although of course the macro-based approaches I sketch > above can be used to define arrays but not vice versa. > > > Ian. > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel
Ian Jackson
2012-Oct-01 10:40 UTC
Re: [PATCH] Use new Xen public header for product numbers and names [and 1 more messages]
Paul Durrant writes ("RE: [Xen-devel] [PATCH] Use new Xen public header for
product numbers and names"):> I liked it so that''s what I did :-) I added a terminator entry for
> convenience when defining an array. Not needed when defining a
> switch statement but harmless since it''s a case that should never
be
> hit.
Very well.
Keir Fraser writes ("Re: [Xen-devel] [PATCH] Use new Xen public header for
product numbers and names"):> My usual way to do this would be to place the list in its own header file:
>
> pvdrivers_list.h:
> EACH(WINDOWS, 0x0001, "xensource-windows")
> EACH(...)
> ...
>
> Then e.g.,
> #define EACH(name,num,string) PVDRIVERS_ID_##name = num,
> enum {
> #include "pvdrivers_list.h"
> }
> #undef EACH
>
> Which is a bit more abstruse on the consuming side, but does avoid the list
> itself being an ugly multi-line macro monster.
This is fine by me too.
Thanks,
Ian.
Ian Jackson
2012-Oct-01 15:14 UTC
Re: [PATCH] Use new Xen public header for product numbers and names
Paul Durrant writes ("[Xen-devel] [PATCH] Use new Xen public header for
product numbers and names"):> xen/include/public/hvm/pvdrivers.h has been added as the
> register of product numbers used by the blacklisting protocol.
> Use the definitions therein rather then locally coded values.
...> +#define PRODUCT(_name, _nr) case _nr: product = _name; break;
> switch (product_nr) {
> - /*
> - * In qemu-xen-unstable, this is the master registry of product
> - * numbers. If you need a new product number allocating, please
> - * post to xen-devel@lists.xensource.com. You should NOT use
> - * an existing product number without allocating one.
> - *
> - * If you maintain a seaparate versioning and distribution path
> - * for PV drivers you should have a separate product number so
> - * that your drivers can be separated from others''.
> - *
> - * During development, you may use the product ID 0xffff to
> - * indicate a driver which is yet to be released.
> - */
> - case 1: product = "xensource-windows"; break; /* Citrix */
> - case 2: product = "gplpv-windows"; break; /* James
Harper */
> - case 0xffff: product = "experimental"; break;
> + PVDRIVERS_PRODUCT_LIST(PRODUCT)
As a case in point, this generates:
case 0: product = NULL; break;
and then passes the NULL to asprintf.
Ian.
Paul Durrant
2012-Oct-01 16:08 UTC
Re: [PATCH] Use new Xen public header for product numbers and names
> -----Original Message----- > From: Ian Jackson [mailto:Ian.Jackson@eu.citrix.com] > Sent: 01 October 2012 16:14 > To: Paul Durrant > Cc: xen-devel@lists.xen.org > Subject: Re: [Xen-devel] [PATCH] Use new Xen public header for product > numbers and names > > Paul Durrant writes ("[Xen-devel] [PATCH] Use new Xen public header for > product numbers and names"): > > xen/include/public/hvm/pvdrivers.h has been added as the register of > > product numbers used by the blacklisting protocol. > > Use the definitions therein rather then locally coded values. > ... > > +#define PRODUCT(_name, _nr) case _nr: product = _name; break; > > switch (product_nr) { > > - /* > > - * In qemu-xen-unstable, this is the master registry of product > > - * numbers. If you need a new product number allocating, please > > - * post to xen-devel@lists.xensource.com. You should NOT use > > - * an existing product number without allocating one. > > - * > > - * If you maintain a seaparate versioning and distribution path > > - * for PV drivers you should have a separate product number so > > - * that your drivers can be separated from others''. > > - * > > - * During development, you may use the product ID 0xffff to > > - * indicate a driver which is yet to be released. > > - */ > > - case 1: product = "xensource-windows"; break; /* Citrix */ > > - case 2: product = "gplpv-windows"; break; /* James Harper */ > > - case 0xffff: product = "experimental"; break; > > + PVDRIVERS_PRODUCT_LIST(PRODUCT) > > As a case in point, this generates: > case 0: product = NULL; break; > and then passes the NULL to asprintf. >Nothing should be using product number 0, so is this a problem? Paul
Ian Campbell
2012-Oct-02 09:25 UTC
Re: [PATCH] Use new Xen public header for product numbers and names
On Mon, 2012-10-01 at 17:08 +0100, Paul Durrant wrote:> > -----Original Message----- > > From: Ian Jackson [mailto:Ian.Jackson@eu.citrix.com] > > Sent: 01 October 2012 16:14 > > To: Paul Durrant > > Cc: xen-devel@lists.xen.org > > Subject: Re: [Xen-devel] [PATCH] Use new Xen public header for product > > numbers and names > > > > Paul Durrant writes ("[Xen-devel] [PATCH] Use new Xen public header for > > product numbers and names"): > > > xen/include/public/hvm/pvdrivers.h has been added as the register of > > > product numbers used by the blacklisting protocol. > > > Use the definitions therein rather then locally coded values. > > ... > > > +#define PRODUCT(_name, _nr) case _nr: product = _name; break; > > > switch (product_nr) { > > > - /* > > > - * In qemu-xen-unstable, this is the master registry of product > > > - * numbers. If you need a new product number allocating, please > > > - * post to xen-devel@lists.xensource.com. You should NOT use > > > - * an existing product number without allocating one. > > > - * > > > - * If you maintain a seaparate versioning and distribution path > > > - * for PV drivers you should have a separate product number so > > > - * that your drivers can be separated from others''. > > > - * > > > - * During development, you may use the product ID 0xffff to > > > - * indicate a driver which is yet to be released. > > > - */ > > > - case 1: product = "xensource-windows"; break; /* Citrix */ > > > - case 2: product = "gplpv-windows"; break; /* James Harper */ > > > - case 0xffff: product = "experimental"; break; > > > + PVDRIVERS_PRODUCT_LIST(PRODUCT) > > > > As a case in point, this generates: > > case 0: product = NULL; break; > > and then passes the NULL to asprintf. > > > > Nothing should be using product number 0, so is this a problem?In some circumstances (I think) the product number may come from the guest, which may be malicious. Ian.