[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 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? > >> +#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 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? > > (I suppose someone needs to patch libxc et al to actually use this) > > The primary consumer, as said in the description, is meant to be > hvmloader. But yes, other tools parts may also want to follow > that. /me wonders how libxc has been getting away with out this until now, especially on non-Linux platforms. Fixing libxc to correctly disambiguate xen errno's from genuine syscalls ones is going to suck... Oh well, not your problem at least, lucky you ;-) > > >> + > >> +#endif /* __ASSEMBLY__ */ > >> + > >> +/* ` enum neg_errnoval { [ -Efoo for each Efoo in the list below ] } */ > >> +/* ` enum errnoval { */ > >> + > >> +#endif /* __XEN_PUBLIC_ERRNO_H__ */ > >> + > >> +#ifdef XEN_ERRNO > >> + > >> +XEN_ERRNO(EPERM, 1) /* Operation not permitted */ > >> +XEN_ERRNO(ENOENT, 2) /* No such file or directory */ > >> +XEN_ERRNO(ESRCH, 3) /* No such process */ > >> +#ifdef __XEN__ > >> +XEN_ERRNO(EINTR, 4) /* Interrupted system call */ > >> +#endif > > > > I take it this is because something prevents this value ever getting > > exposes to userspace? (Continuations?). > > Yes. The thus framed values are supposed to never reach the caller > of a hypercall. > > > 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. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |