On 15/01/15 15:25, Jan Beulich wrote:
> Now that we have two cases where patches against hvmloader got
> submitted needing to include the hypervisor's errno.h (for the host's
> system header not necessarily reflecting the correct numbers), take
> this as a strong sign that we need to make the error return values part
> of the hypervisor ABI (which de-fact they've always been).
>
> Signed-off-by: Jan Beulich <jbeul...@suse.com>

How do the non XEN_ prefixed E$FOO get generated with this?  All
"#define XEN_ERRNO(...)" tokenise XEN_## onto the name.

~Andrew

> ---
> v2: Drop TDB and hence RFC. Comment regarding origin of values. Add
>     comments to #ifdef __XEN__.
>
> --- a/xen/include/asm-arm/page.h
> +++ b/xen/include/asm-arm/page.h
> @@ -2,7 +2,6 @@
>  #define __ARM_PAGE_H__
>  
>  #include <xen/config.h>
> -#include <xen/errno.h>
>  #include <public/xen.h>
>  #include <asm/processor.h>
>  
> @@ -83,6 +82,7 @@
>  
>  #ifndef __ASSEMBLY__
>  
> +#include <xen/errno.h>
>  #include <xen/types.h>
>  #include <xen/lib.h>
>  
> --- a/xen/include/asm-x86/multicall.h
> +++ b/xen/include/asm-x86/multicall.h
> @@ -24,7 +24,7 @@
>              "    callq *%%rax; "                             \
>              "1:  movq  %%rax,%c4(%0)\n"                      \
>              ".section .fixup,\"ax\"\n"                       \
> -            "2:  movq  $-"STR(ENOSYS)",%%rax\n"              \
> +            "2:  movq  %5,%%rax\n"                           \
>              "    jmp   1b\n"                                 \
>              ".previous\n"                                    \
>              :                                                \
> @@ -32,7 +32,8 @@
>                "i" (offsetof(__typeof__(*_call), op)),        \
>                "i" (offsetof(__typeof__(*_call), args)),      \
>                "i" (sizeof(*(_call)->args)),                  \
> -              "i" (offsetof(__typeof__(*_call), result))     \
> +              "i" (offsetof(__typeof__(*_call), result)),    \
> +              "i" (-ENOSYS)                                  \
>                /* all the caller-saves registers */           \
>              : "rax", "rcx", "rdx", "rsi", "rdi",             \
>                "r8",  "r9",  "r10", "r11" );                  \
> @@ -54,7 +55,7 @@
>              "    callq *%%rax; "                             \
>              "1:  movl  %%eax,%c4(%0)\n"                      \
>              ".section .fixup,\"ax\"\n"                       \
> -            "2:  movl  $-"STR(ENOSYS)",%%eax\n"              \
> +            "2:  movl  %5,%%eax\n"                           \
>              "    jmp   1b\n"                                 \
>              ".previous\n"                                    \
>              :                                                \
> @@ -62,7 +63,8 @@
>                "i" (offsetof(__typeof__(*_call), op)),        \
>                "i" (offsetof(__typeof__(*_call), args)),      \
>                "i" (sizeof(*(_call)->args)),                  \
> -              "i" (offsetof(__typeof__(*_call), result))     \
> +              "i" (offsetof(__typeof__(*_call), result)),    \
> +              "i" (-ENOSYS)                                  \
>                /* all the caller-saves registers */           \
>              : "rax", "rcx", "rdx", "rsi", "rdi",             \
>                "r8",  "r9",  "r10", "r11" )                   \
> --- /dev/null
> +++ b/xen/include/public/errno.h
> @@ -0,0 +1,93 @@
> +#ifndef __XEN_PUBLIC_ERRNO_H__
> +
> +#ifndef __ASSEMBLY__
> +
> +#define XEN_ERRNO(name, value) XEN_##name = value,
> +enum xen_errno {
> +
> +#else /* !__ASSEMBLY__ */
> +
> +#define XEN_ERRNO(name, value) .equ XEN_##name, value
> +
> +#endif /* __ASSEMBLY__ */
> +
> +/* ` enum neg_errnoval {  [ -Efoo for each Efoo in the list below ]  } */
> +/* ` enum errnoval { */
> +
> +#endif /* __XEN_PUBLIC_ERRNO_H__ */
> +
> +#ifdef XEN_ERRNO
> +
> +/*
> + * Values originating from x86 Linux. Please consider using respective
> + * values when adding new definitions here.
> + */
> +
> +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__ /* Internal only, should never be exposed to the guest. */
> +XEN_ERRNO(EINTR,      4)     /* Interrupted system call */
> +#endif
> +XEN_ERRNO(EIO,                5)     /* I/O error */
> +XEN_ERRNO(ENXIO,      6)     /* No such device or address */
> +XEN_ERRNO(E2BIG,      7)     /* Arg list too long */
> +XEN_ERRNO(ENOEXEC,    8)     /* Exec format error */
> +XEN_ERRNO(EBADF,      9)     /* Bad file number */
> +XEN_ERRNO(ECHILD,    10)     /* No child processes */
> +XEN_ERRNO(EAGAIN,    11)     /* Try again */
> +XEN_ERRNO(ENOMEM,    12)     /* Out of memory */
> +XEN_ERRNO(EACCES,    13)     /* Permission denied */
> +XEN_ERRNO(EFAULT,    14)     /* Bad address */
> +XEN_ERRNO(EBUSY,     16)     /* Device or resource busy */
> +XEN_ERRNO(EEXIST,    17)     /* File exists */
> +XEN_ERRNO(EXDEV,     18)     /* Cross-device link */
> +XEN_ERRNO(ENODEV,    19)     /* No such device */
> +XEN_ERRNO(EINVAL,    22)     /* Invalid argument */
> +XEN_ERRNO(ENFILE,    23)     /* File table overflow */
> +XEN_ERRNO(EMFILE,    24)     /* Too many open files */
> +XEN_ERRNO(ENOSPC,    28)     /* No space left on device */
> +XEN_ERRNO(EMLINK,    31)     /* Too many links */
> +XEN_ERRNO(EDOM,              33)     /* Math argument out of domain of func 
> */
> +XEN_ERRNO(ERANGE,    34)     /* Math result not representable */
> +XEN_ERRNO(EDEADLK,   35)     /* Resource deadlock would occur */
> +XEN_ERRNO(ENAMETOOLONG,      36)     /* File name too long */
> +XEN_ERRNO(ENOLCK,    37)     /* No record locks available */
> +XEN_ERRNO(ENOSYS,    38)     /* Function not implemented */
> +XEN_ERRNO(EBADRQC,   56)     /* Invalid request code */
> +XEN_ERRNO(EBADSLT,   57)     /* Invalid slot */
> +XEN_ERRNO(ENODATA,   61)     /* No data available */
> +XEN_ERRNO(ETIME,     62)     /* Timer expired */
> +XEN_ERRNO(EBADMSG,   74)     /* Not a data message */
> +XEN_ERRNO(EOVERFLOW, 75)     /* Value too large for defined data type */
> +XEN_ERRNO(EILSEQ,    84)     /* Illegal byte sequence */
> +#ifdef __XEN__ /* Internal only, should never be exposed to the guest. */
> +XEN_ERRNO(ERESTART,  85)     /* Interrupted system call should be restarted 
> */
> +#endif
> +XEN_ERRNO(EUSERS,    87)     /* Too many users */
> +XEN_ERRNO(EOPNOTSUPP,        95)     /* Operation not supported on transport 
> endpoint */
> +XEN_ERRNO(EADDRINUSE,        98)     /* Address already in use */
> +XEN_ERRNO(EADDRNOTAVAIL, 99) /* Cannot assign requested address */
> +XEN_ERRNO(ENOBUFS,   105)    /* No buffer space available */
> +XEN_ERRNO(EISCONN,   106)    /* Transport endpoint is already connected */
> +XEN_ERRNO(ENOTCONN,  107)    /* Transport endpoint is not connected */
> +XEN_ERRNO(ESHUTDOWN, 108)    /* Cannot send after transport endpoint 
> shutdown */
> +XEN_ERRNO(ETOOMANYREFS,      109)    /* Too many references: cannot splice */
> +XEN_ERRNO(ETIMEDOUT, 110)    /* Connection timed out */
> +
> +#undef XEN_ERRNO
> +#endif /* XEN_ERRNO */
> +
> +#ifndef __XEN_PUBLIC_ERRNO_H__
> +#define __XEN_PUBLIC_ERRNO_H__
> +
> +/* ` } */
> +
> +#ifndef __ASSEMBLY__
> +};
> +#endif
> +
> +#define      XEN_EWOULDBLOCK XEN_EAGAIN      /* Operation would block */
> +#define      XEN_EDEADLOCK   XEN_EDEADLK     /* Resource deadlock would 
> occur */
> +
> +#endif /*  __XEN_PUBLIC_ERRNO_H__ */
> --- a/xen/include/xen/errno.h
> +++ b/xen/include/xen/errno.h
> @@ -1,137 +1,20 @@
> -#ifndef _I386_ERRNO_H
> -#define _I386_ERRNO_H
> +#ifndef __XEN_ERRNO_H__
> +#define __XEN_ERRNO_H__
>  
> -/* ` enum neg_errnoval {  [ -Efoo for each Efoo in the list below ]  } */
> -/* ` enum errnoval { */
> +#include <public/errno.h>
>  
> -#define      EPERM            1      /* Operation not permitted */
> -#define      ENOENT           2      /* No such file or directory */
> -#define      ESRCH            3      /* No such process */
> -#define      EINTR            4      /* Interrupted system call */
> -#define      EIO              5      /* I/O error */
> -#define      ENXIO            6      /* No such device or address */
> -#define      E2BIG            7      /* Arg list too long */
> -#define      ENOEXEC          8      /* Exec format error */
> -#define      EBADF            9      /* Bad file number */
> -#define      ECHILD          10      /* No child processes */
> -#define      EAGAIN          11      /* Try again */
> -#define      ENOMEM          12      /* Out of memory */
> -#define      EACCES          13      /* Permission denied */
> -#define      EFAULT          14      /* Bad address */
> -#define      ENOTBLK         15      /* Block device required */
> -#define      EBUSY           16      /* Device or resource busy */
> -#define      EEXIST          17      /* File exists */
> -#define      EXDEV           18      /* Cross-device link */
> -#define      ENODEV          19      /* No such device */
> -#define      ENOTDIR         20      /* Not a directory */
> -#define      EISDIR          21      /* Is a directory */
> -#define      EINVAL          22      /* Invalid argument */
> -#define      ENFILE          23      /* File table overflow */
> -#define      EMFILE          24      /* Too many open files */
> -#define      ENOTTY          25      /* Not a typewriter */
> -#define      ETXTBSY         26      /* Text file busy */
> -#define      EFBIG           27      /* File too large */
> -#define      ENOSPC          28      /* No space left on device */
> -#define      ESPIPE          29      /* Illegal seek */
> -#define      EROFS           30      /* Read-only file system */
> -#define      EMLINK          31      /* Too many links */
> -#define      EPIPE           32      /* Broken pipe */
> -#define      EDOM            33      /* Math argument out of domain of func 
> */
> -#define      ERANGE          34      /* Math result not representable */
> -#define      EDEADLK         35      /* Resource deadlock would occur */
> -#define      ENAMETOOLONG    36      /* File name too long */
> -#define      ENOLCK          37      /* No record locks available */
> -#define      ENOSYS          38      /* Function not implemented */
> -#define      ENOTEMPTY       39      /* Directory not empty */
> -#define      ELOOP           40      /* Too many symbolic links encountered 
> */
> -#define      EWOULDBLOCK     EAGAIN  /* Operation would block */
> -#define      ENOMSG          42      /* No message of desired type */
> -#define      EIDRM           43      /* Identifier removed */
> -#define      ECHRNG          44      /* Channel number out of range */
> -#define      EL2NSYNC        45      /* Level 2 not synchronized */
> -#define      EL3HLT          46      /* Level 3 halted */
> -#define      EL3RST          47      /* Level 3 reset */
> -#define      ELNRNG          48      /* Link number out of range */
> -#define      EUNATCH         49      /* Protocol driver not attached */
> -#define      ENOCSI          50      /* No CSI structure available */
> -#define      EL2HLT          51      /* Level 2 halted */
> -#define      EBADE           52      /* Invalid exchange */
> -#define      EBADR           53      /* Invalid request descriptor */
> -#define      EXFULL          54      /* Exchange full */
> -#define      ENOANO          55      /* No anode */
> -#define      EBADRQC         56      /* Invalid request code */
> -#define      EBADSLT         57      /* Invalid slot */
> -
> -#define      EDEADLOCK       EDEADLK
> -
> -#define      EBFONT          59      /* Bad font file format */
> -#define      ENOSTR          60      /* Device not a stream */
> -#define      ENODATA         61      /* No data available */
> -#define      ETIME           62      /* Timer expired */
> -#define      ENOSR           63      /* Out of streams resources */
> -#define      ENONET          64      /* Machine is not on the network */
> -#define      ENOPKG          65      /* Package not installed */
> -#define      EREMOTE         66      /* Object is remote */
> -#define      ENOLINK         67      /* Link has been severed */
> -#define      EADV            68      /* Advertise error */
> -#define      ESRMNT          69      /* Srmount error */
> -#define      ECOMM           70      /* Communication error on send */
> -#define      EPROTO          71      /* Protocol error */
> -#define      EMULTIHOP       72      /* Multihop attempted */
> -#define      EDOTDOT         73      /* RFS specific error */
> -#define      EBADMSG         74      /* Not a data message */
> -#define      EOVERFLOW       75      /* Value too large for defined data 
> type */
> -#define      ENOTUNIQ        76      /* Name not unique on network */
> -#define      EBADFD          77      /* File descriptor in bad state */
> -#define      EREMCHG         78      /* Remote address changed */
> -#define      ELIBACC         79      /* Can not access a needed shared 
> library */
> -#define      ELIBBAD         80      /* Accessing a corrupted shared library 
> */
> -#define      ELIBSCN         81      /* .lib section in a.out corrupted */
> -#define      ELIBMAX         82      /* Attempting to link in too many 
> shared libraries */
> -#define      ELIBEXEC        83      /* Cannot exec a shared library 
> directly */
> -#define      EILSEQ          84      /* Illegal byte sequence */
> -#define      ERESTART        85      /* Interrupted system call should be 
> restarted */
> -#define      ESTRPIPE        86      /* Streams pipe error */
> -#define      EUSERS          87      /* Too many users */
> -#define      ENOTSOCK        88      /* Socket operation on non-socket */
> -#define      EDESTADDRREQ    89      /* Destination address required */
> -#define      EMSGSIZE        90      /* Message too long */
> -#define      EPROTOTYPE      91      /* Protocol wrong type for socket */
> -#define      ENOPROTOOPT     92      /* Protocol not available */
> -#define      EPROTONOSUPPORT 93      /* Protocol not supported */
> -#define      ESOCKTNOSUPPORT 94      /* Socket type not supported */
> -#define      EOPNOTSUPP      95      /* Operation not supported on transport 
> endpoint */
> -#define      EPFNOSUPPORT    96      /* Protocol family not supported */
> -#define      EAFNOSUPPORT    97      /* Address family not supported by 
> protocol */
> -#define      EADDRINUSE      98      /* Address already in use */
> -#define      EADDRNOTAVAIL   99      /* Cannot assign requested address */
> -#define      ENETDOWN        100     /* Network is down */
> -#define      ENETUNREACH     101     /* Network is unreachable */
> -#define      ENETRESET       102     /* Network dropped connection because 
> of reset */
> -#define      ECONNABORTED    103     /* Software caused connection abort */
> -#define      ECONNRESET      104     /* Connection reset by peer */
> -#define      ENOBUFS         105     /* No buffer space available */
> -#define      EISCONN         106     /* Transport endpoint is already 
> connected */
> -#define      ENOTCONN        107     /* Transport endpoint is not connected 
> */
> -#define      ESHUTDOWN       108     /* Cannot send after transport endpoint 
> shutdown */
> -#define      ETOOMANYREFS    109     /* Too many references: cannot splice */
> -#define      ETIMEDOUT       110     /* Connection timed out */
> -#define      ECONNREFUSED    111     /* Connection refused */
> -#define      EHOSTDOWN       112     /* Host is down */
> -#define      EHOSTUNREACH    113     /* No route to host */
> -#define      EALREADY        114     /* Operation already in progress */
> -#define      EINPROGRESS     115     /* Operation now in progress */
> -#define      ESTALE          116     /* Stale NFS file handle */
> -#define      EUCLEAN         117     /* Structure needs cleaning */
> -#define      ENOTNAM         118     /* Not a XENIX named type file */
> -#define      ENAVAIL         119     /* No XENIX semaphores available */
> -#define      EISNAM          120     /* Is a named type file */
> -#define      EREMOTEIO       121     /* Remote I/O error */
> -#define      EDQUOT          122     /* Quota exceeded */
> +#ifndef __ASSEMBLY__
>  
> -#define      ENOMEDIUM       123     /* No medium found */
> -#define      EMEDIUMTYPE     124     /* Wrong medium type */
> +#define XEN_ERRNO(name, value) name = XEN_##name,
> +enum {
> +#include <public/errno.h>
> +};
>  
> -/* ` } */
> +#else /* !__ASSEMBLY__ */
>  
> -#endif
> +#define XEN_ERRNO(name, value) .equ name, XEN_##name
> +#include <public/errno.h>
> +
> +#endif /* __ASSEMBLY__ */
> +
> +#endif /*  __XEN_ERRNO_H__ */
>
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel

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

Reply via email to