[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |