[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


 


Rackspace

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