public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [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