* [patch] sharing maximum errno symbol used in __syscall_return (i386)
@ 2006-06-20 9:40 Masatake YAMATO
2006-06-21 0:04 ` Randy.Dunlap
2006-06-21 4:21 ` H. Peter Anvin
0 siblings, 2 replies; 5+ messages in thread
From: Masatake YAMATO @ 2006-06-20 9:40 UTC (permalink / raw)
To: linux-kernel
Hi,
__syscall_return in unistd.h is maintained?
In the macro the value returned from system call is
compared with the maximum error number defined in a header file
to know the call is successful or not. However, the maximum error number
is hard-coded and is not updated.
Here is an example(i386):
/*
* user-visible error numbers are in the range -1 - -128: see
* <asm-i386/errno.h>
*/
#define __syscall_return(type, res) \
do { \
if ((unsigned long)(res) >= (unsigned long)(-(128 + 1))) { \
errno = -(res); \
res = -1; \
} \
The comment says the maximum errno is 128.
However, the actual C code says 128 + 1. What does "+ 1" mean?
Look at <asm-i386/errno.h>:
#ifndef _I386_ERRNO_H
#define _I386_ERRNO_H
#include <asm-generic/errno.h>
#endif
The look at <asm-generic/errno.h>:
#define EKEYREVOKED 128 /* Key has been revoked */
#define EKEYREJECTED 129 /* Key was rejected by service */
/* for robust mutexes */
#define EOWNERDEAD 130 /* Owner died */
#define ENOTRECOVERABLE 131 /* State not recoverable */
Here the maximum errno is 131.
In many architectures, <asm-foo/errno.h> just includes
<asm-generic/errno.h>. So I think <asm-generic/errno.h> should
exports the real maximum errno and the other headers can
use it. So in many cases, we can just maintain
the real maximum errno in <asm-generic/errno.h>.
Here is the patch for i386. If this patch is approved, I will write
patches for the other architectures. (However, it may be better to be
done by each architecture's maintainer.)
Signed-off-by: Masatake YAMATO <jet@gyve.org>
diff --git a/include/asm-generic/errno.h b/include/asm-generic/errno.h
index e8852c0..4e1238e 100644
--- a/include/asm-generic/errno.h
+++ b/include/asm-generic/errno.h
@@ -106,4 +106,8 @@ #define EKEYREJECTED 129 /* Key was reje
#define EOWNERDEAD 130 /* Owner died */
#define ENOTRECOVERABLE 131 /* State not recoverable */
+/*
+ * If you add a new error, Don't forget to update `GENERIC_ERRNO_MAX'
+ */
+#define GENERIC_ERRNO_MAX ENOTRECOVERABLE
#endif
diff --git a/include/asm-i386/errno.h b/include/asm-i386/errno.h
index 969b343..9892b2d 100644
--- a/include/asm-i386/errno.h
+++ b/include/asm-i386/errno.h
@@ -2,5 +2,5 @@ #ifndef _I386_ERRNO_H
#define _I386_ERRNO_H
#include <asm-generic/errno.h>
-
+#define i386_ERRNO_MAX GENERIC_ERRNO_MAX
#endif
diff --git a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h
index eb4b152..f52ec68 100644
--- a/include/asm-i386/unistd.h
+++ b/include/asm-i386/unistd.h
@@ -326,12 +326,13 @@ #define __NR_vmsplice 316
#define NR_syscalls 317
/*
- * user-visible error numbers are in the range -1 - -128: see
- * <asm-i386/errno.h>
+ * user-visible error numbers are in the range -1 - -i386_ERRNO_MAX
*/
+#include <asm-i386/errno.h>
+
#define __syscall_return(type, res) \
do { \
- if ((unsigned long)(res) >= (unsigned long)(-(128 + 1))) { \
+ if ((unsigned long)(res) >= (unsigned long)(-(i386_ERRNO_MAX))) { \
errno = -(res); \
res = -1; \
} \
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [patch] sharing maximum errno symbol used in __syscall_return (i386)
2006-06-20 9:40 [patch] sharing maximum errno symbol used in __syscall_return (i386) Masatake YAMATO
@ 2006-06-21 0:04 ` Randy.Dunlap
2006-06-21 4:21 ` H. Peter Anvin
1 sibling, 0 replies; 5+ messages in thread
From: Randy.Dunlap @ 2006-06-21 0:04 UTC (permalink / raw)
To: Masatake YAMATO; +Cc: linux-kernel
On Tue, 20 Jun 2006 18:40:10 +0900 (JST) Masatake YAMATO wrote:
> Hi,
>
> __syscall_return in unistd.h is maintained?
>
> In the macro the value returned from system call is
> compared with the maximum error number defined in a header file
> to know the call is successful or not. However, the maximum error number
> is hard-coded and is not updated.
Ack, this certainly needs some care & fixing.
> Here is an example(i386):
>
> /*
> * user-visible error numbers are in the range -1 - -128: see
> * <asm-i386/errno.h>
> */
> #define __syscall_return(type, res) \
> do { \
> if ((unsigned long)(res) >= (unsigned long)(-(128 + 1))) { \
> errno = -(res); \
> res = -1; \
> } \
>
> The comment says the maximum errno is 128.
> However, the actual C code says 128 + 1. What does "+ 1" mean?
I don't understand the -1 either. A few asm-*/unistd.h files
use that, but most of them do not.
> Look at <asm-i386/errno.h>:
>
> #ifndef _I386_ERRNO_H
> #define _I386_ERRNO_H
>
> #include <asm-generic/errno.h>
>
> #endif
>
> The look at <asm-generic/errno.h>:
>
> #define EKEYREVOKED 128 /* Key has been revoked */
> #define EKEYREJECTED 129 /* Key was rejected by service */
>
> /* for robust mutexes */
> #define EOWNERDEAD 130 /* Owner died */
> #define ENOTRECOVERABLE 131 /* State not recoverable */
>
> Here the maximum errno is 131.
>
>
> In many architectures, <asm-foo/errno.h> just includes
> <asm-generic/errno.h>. So I think <asm-generic/errno.h> should
> exports the real maximum errno and the other headers can
> use it. So in many cases, we can just maintain
> the real maximum errno in <asm-generic/errno.h>.
>
> Here is the patch for i386. If this patch is approved, I will write
> patches for the other architectures. (However, it may be better to be
> done by each architecture's maintainer.)
I like the patch.
> Signed-off-by: Masatake YAMATO <jet@gyve.org>
>
> diff --git a/include/asm-generic/errno.h b/include/asm-generic/errno.h
> index e8852c0..4e1238e 100644
> --- a/include/asm-generic/errno.h
> +++ b/include/asm-generic/errno.h
> @@ -106,4 +106,8 @@ #define EKEYREJECTED 129 /* Key was reje
> #define EOWNERDEAD 130 /* Owner died */
> #define ENOTRECOVERABLE 131 /* State not recoverable */
>
> +/*
> + * If you add a new error, Don't forget to update `GENERIC_ERRNO_MAX'
> + */
> +#define GENERIC_ERRNO_MAX ENOTRECOVERABLE
> #endif
> diff --git a/include/asm-i386/errno.h b/include/asm-i386/errno.h
> index 969b343..9892b2d 100644
> --- a/include/asm-i386/errno.h
> +++ b/include/asm-i386/errno.h
> @@ -2,5 +2,5 @@ #ifndef _I386_ERRNO_H
> #define _I386_ERRNO_H
>
> #include <asm-generic/errno.h>
> -
> +#define i386_ERRNO_MAX GENERIC_ERRNO_MAX
> #endif
> diff --git a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h
> index eb4b152..f52ec68 100644
> --- a/include/asm-i386/unistd.h
> +++ b/include/asm-i386/unistd.h
> @@ -326,12 +326,13 @@ #define __NR_vmsplice 316
> #define NR_syscalls 317
>
> /*
> - * user-visible error numbers are in the range -1 - -128: see
> - * <asm-i386/errno.h>
> + * user-visible error numbers are in the range -1 - -i386_ERRNO_MAX
> */
> +#include <asm-i386/errno.h>
> +
> #define __syscall_return(type, res) \
> do { \
> - if ((unsigned long)(res) >= (unsigned long)(-(128 + 1))) { \
> + if ((unsigned long)(res) >= (unsigned long)(-(i386_ERRNO_MAX))) { \
> errno = -(res); \
> res = -1; \
> } \
> -
Thanks.
---
~Randy
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [patch] sharing maximum errno symbol used in __syscall_return (i386)
2006-06-20 9:40 [patch] sharing maximum errno symbol used in __syscall_return (i386) Masatake YAMATO
2006-06-21 0:04 ` Randy.Dunlap
@ 2006-06-21 4:21 ` H. Peter Anvin
2006-06-21 6:02 ` Masatake YAMATO
1 sibling, 1 reply; 5+ messages in thread
From: H. Peter Anvin @ 2006-06-21 4:21 UTC (permalink / raw)
To: Masatake YAMATO; +Cc: linux-kernel
Masatake YAMATO wrote:
> Hi,
>
> __syscall_return in unistd.h is maintained?
>
> In the macro the value returned from system call is
> compared with the maximum error number defined in a header file
> to know the call is successful or not. However, the maximum error number
> is hard-coded and is not updated.
>
And it's wrong, anyway. It has long been agreed that the maximum errno
value, for any architecture, is 4095.
-hpa
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [patch] sharing maximum errno symbol used in __syscall_return (i386)
2006-06-21 4:21 ` H. Peter Anvin
@ 2006-06-21 6:02 ` Masatake YAMATO
2006-06-21 6:05 ` H. Peter Anvin
0 siblings, 1 reply; 5+ messages in thread
From: Masatake YAMATO @ 2006-06-21 6:02 UTC (permalink / raw)
To: hpa; +Cc: linux-kernel
> > Hi,
> >
> > __syscall_return in unistd.h is maintained?
> >
> > In the macro the value returned from system call is
> > compared with the maximum error number defined in a header file
> > to know the call is successful or not. However, the maximum error number
> > is hard-coded and is not updated.
> >
>
> And it's wrong, anyway. It has long been agreed that the maximum errno
> value, for any architecture, is 4095.
So we should do just:
#define GENERIC_ERRNO_MAX 4095
Here my patch is proved to be useful for maintaining __syscall_return:-P
Masatake YAMATO
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [patch] sharing maximum errno symbol used in __syscall_return (i386)
2006-06-21 6:02 ` Masatake YAMATO
@ 2006-06-21 6:05 ` H. Peter Anvin
0 siblings, 0 replies; 5+ messages in thread
From: H. Peter Anvin @ 2006-06-21 6:05 UTC (permalink / raw)
To: Masatake YAMATO; +Cc: linux-kernel
Masatake YAMATO wrote:
>>> Hi,
>>>
>>> __syscall_return in unistd.h is maintained?
>>>
>>> In the macro the value returned from system call is
>>> compared with the maximum error number defined in a header file
>>> to know the call is successful or not. However, the maximum error number
>>> is hard-coded and is not updated.
>>>
>> And it's wrong, anyway. It has long been agreed that the maximum errno
>> value, for any architecture, is 4095.
>
> So we should do just:
>
>
> #define GENERIC_ERRNO_MAX 4095
>
> Here my patch is proved to be useful for maintaining __syscall_return:-P
>
Well, most of the various macros in unistd.h really should go too, since
they're mostly underutilized and definitely ill-maintained.
The only one that I know of which is still used by the kernel itself is
execve. If so, perhaps we should just have an open-coded execve.
-hpa
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2006-06-21 6:05 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-20 9:40 [patch] sharing maximum errno symbol used in __syscall_return (i386) Masatake YAMATO
2006-06-21 0:04 ` Randy.Dunlap
2006-06-21 4:21 ` H. Peter Anvin
2006-06-21 6:02 ` Masatake YAMATO
2006-06-21 6:05 ` H. Peter Anvin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox