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