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 <[email protected]>
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
> [email protected]
> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel