[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH RFC] make error codes a formal part of the ABI



>>> On 14.01.15 at 11:28, <Ian.Campbell@xxxxxxxxxxxxx> wrote:
> On Wed, 2015-01-14 at 08:46 +0000, Jan Beulich wrote:
>> >>> On 13.01.15 at 17:35, <Ian.Campbell@xxxxxxxxxxxxx> wrote:
>> > On Tue, 2015-01-13 at 16:21 +0000, Jan Beulich wrote:
>> >> --- /dev/null
>> >> +++ b/xen/include/public/errno.h
>> >> @@ -0,0 +1,94 @@
>> >> +#ifndef __XEN_PUBLIC_ERRNO_H__
>> >> +
>> >> +#ifndef __ASSEMBLY__
>> >> +
>> >> +#define XEN_ERRNO(name, value) XEN_##name = value,
>> >> +enum xen_errno {
>> > 
>> > The switch to an enum doesn't seem related to the main purpose of the
>> > patch, unless I'm missing something?
>> 
>> No, this is an integral part of the change: A macro can't be used to
>> generate preprocessor directives (i.e. #define-s).
> 
> Oh right, yes.
> 
> Given the ABI pitfalls of enums (size etc) perhaps make it anonymous?

Could do, but no-one is required to use the enum as a type. I just
wanted to _allow_ people using it if they want.

>> >> +#else /* !__ASSEMBLY__ */
>> >> +
>> >> +#define XEN_ERRNO(name, value) .equ XEN_##name, value
>> > 
>> > So here public/errno.h defines it's own XEN_ERRNO for ASM vs none. But
>> > then later xen/errno.h also defines it before including the public
>> > version. Also the enum xen_errno seems to be similarly duplicated. (I
>> > suspect you changed your mind and forgot to save one or the other
>> > file?). I think the includer chooses the namespace approach makes most
>> > sense.
>> 
>> No, this again is intentional and - imo - necessary: A plain
>> #include <public/errno.h> ought to suffice to get all XEN_E*
>> definitions. That's not so much for Xen's internal purposes, but more
>> for actual consumers of the public headers. For Xen's internal
>> purposes, a plain #include <xen/errno.h> ought to suffice and
>> produce (at least) the non-XEN_-prefixed values. Hence xen/errno.h
>> has to double-include public/errno.h, once without overriding
>> XEN_ERRNO() and then a second time with doing so.
> 
> Oh I see now that you are relying on the multi-inclusion guard to also
> guard the definition of the default version of XEN_ERRNO macro, which is
> a bit tricksy (and wasn't obvious until I applied the patch and looked
> at the result).
> 
> Can you make this more explicit while leaving the guard with its usual
> semantics? e.g.
> 
> #ifndef XEN_ERRNO
> #if .. Asm ...
> #define ...
> #else
> #define ...
> #endif

I don't think that would work when including public/errno.h a second
time. Or maybe I'm not getting how you envision things to be...

> and in xen/errno.h:
> 
>         #include <public/errno.h>
>         
>         /* We explicitly want a second include with separate names. */
>         #undef __XEN_PUBLIC_ERRNO_H__
>         #if ... asm...
>         #define ...
>         #include <...>
>         #else
>         #define ...
>         enum {
>         #include <...>
>         }
>         #endif
> 
> If you don't like the #undef then perhaps move the value list into
> public/errno-values.h as a bare list which requires XEN_ERRNO to be
> defined by the includer and has no guard of its own, so it can be
> included from both the public and private errno.h with the correct
> context?

To be honest I prefer a solution with just a single new public header,
even if it ends up using some trickery (so long as it doesn't violate
any language requirements).

>> > I think keeping that away from
>> > guest API is a good idea, but if it's completely internal perhaps we
>> > should move it up into a region which we reserve for ourselves?
>> 
>> That would be at the risk of (later) creating conflicting definitions. I
>> specifically wanted to preserve the original values and ordering.
> 
> Good reason.
> 
> Perhaps
> #ifdef __XEN__ /* Internal only, should never be exposed to the guest */
> since there isn't so many of them to make that onerous.

Sure, easily added.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.