diff mbox

prctl: implement PR_GET_ENDIAN for all architectures

Message ID 20170128111310.GA13389@ls3530.fritz.box (mailing list archive)
State Rejected, archived
Headers show

Commit Message

Helge Deller Jan. 28, 2017, 11:13 a.m. UTC
The prctl(PR_GET_ENDIAN) syscall was added to Kernel 2.6.18, but
implemented for PowerPC only.
This trivial patch adds support for this syscall for all other architectures.

Signed-off-by: Helge Deller <deller@gmx.de>

--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Andrew Morton Feb. 1, 2017, 12:26 a.m. UTC | #1
On Sat, 28 Jan 2017 12:13:10 +0100 Helge Deller <deller@gmx.de> wrote:

> The prctl(PR_GET_ENDIAN) syscall was added to Kernel 2.6.18, but
> implemented for PowerPC only.
> This trivial patch adds support for this syscall for all other architectures.

Seems reasonable.  I guess.  Why is this needed?

The man page will need updating.  It says "PowerPC only".

> 
> diff --git a/kernel/sys.c b/kernel/sys.c
> index 842914e..5818e5e 100644
> --- a/kernel/sys.c
> +++ b/kernel/sys.c
> @@ -79,9 +79,6 @@
>  #ifndef GET_FPEXC_CTL
>  # define GET_FPEXC_CTL(a, b)	(-EINVAL)
>  #endif
> -#ifndef GET_ENDIAN
> -# define GET_ENDIAN(a, b)	(-EINVAL)
> -#endif
>  #ifndef SET_ENDIAN
>  # define SET_ENDIAN(a, b)	(-EINVAL)
>  #endif
> @@ -2136,7 +2133,13 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
>  			return -EFAULT;
>  		break;
>  	case PR_GET_ENDIAN:
> +#ifdef GET_ENDIAN
>  		error = GET_ENDIAN(me, arg2);
> +#elif defined(__BIG_ENDIAN)
> +		error = put_user(PR_ENDIAN_BIG, (unsigned int __user *)arg2);
> +#else
> +		error = put_user(PR_ENDIAN_LITTLE, (unsigned int __user *)arg2);
> +#endif
>  		break;
>  	case PR_SET_ENDIAN:
>  		error = SET_ENDIAN(me, arg2);
--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Helge Deller Feb. 1, 2017, 7:47 p.m. UTC | #2
Hi Andrew,

On 01.02.2017 01:26, Andrew Morton wrote:
> On Sat, 28 Jan 2017 12:13:10 +0100 Helge Deller <deller@gmx.de> wrote:
> 
>> The prctl(PR_GET_ENDIAN) syscall was added to Kernel 2.6.18, but
>> implemented for PowerPC only.
>> This trivial patch adds support for this syscall for all other architectures.
> 
> Seems reasonable.  I guess.

Heck, I did forgot but I submitted a similar patch 8 years ago:
http://www.serverphorums.com/read.php?12,51902

> Why is this needed?

It's not actually needed beside the trivial reason of providing an interface
not just for one single architecture.

After reading the discussion from 2009 again, I'm fine if 
you would simply drop the patch. The decision up to you.

> The man page will need updating.  It says "PowerPC only".

In case you would include the patch I'd send patches to update
the manpage.

Thanks,
Helge

>> diff --git a/kernel/sys.c b/kernel/sys.c
>> index 842914e..5818e5e 100644
>> --- a/kernel/sys.c
>> +++ b/kernel/sys.c
>> @@ -79,9 +79,6 @@
>>  #ifndef GET_FPEXC_CTL
>>  # define GET_FPEXC_CTL(a, b)	(-EINVAL)
>>  #endif
>> -#ifndef GET_ENDIAN
>> -# define GET_ENDIAN(a, b)	(-EINVAL)
>> -#endif
>>  #ifndef SET_ENDIAN
>>  # define SET_ENDIAN(a, b)	(-EINVAL)
>>  #endif
>> @@ -2136,7 +2133,13 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
>>  			return -EFAULT;
>>  		break;
>>  	case PR_GET_ENDIAN:
>> +#ifdef GET_ENDIAN
>>  		error = GET_ENDIAN(me, arg2);
>> +#elif defined(__BIG_ENDIAN)
>> +		error = put_user(PR_ENDIAN_BIG, (unsigned int __user *)arg2);
>> +#else
>> +		error = put_user(PR_ENDIAN_LITTLE, (unsigned int __user *)arg2);
>> +#endif
>>  		break;
>>  	case PR_SET_ENDIAN:
>>  		error = SET_ENDIAN(me, arg2);

--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Andrew Morton Feb. 1, 2017, 10:03 p.m. UTC | #3
On Wed, 1 Feb 2017 20:47:06 +0100 Helge Deller <deller@gmx.de> wrote:

> Hi Andrew,
> 
> On 01.02.2017 01:26, Andrew Morton wrote:
> > On Sat, 28 Jan 2017 12:13:10 +0100 Helge Deller <deller@gmx.de> wrote:
> > 
> >> The prctl(PR_GET_ENDIAN) syscall was added to Kernel 2.6.18, but
> >> implemented for PowerPC only.
> >> This trivial patch adds support for this syscall for all other architectures.
> > 
> > Seems reasonable.  I guess.
> 
> Heck, I did forgot but I submitted a similar patch 8 years ago:
> http://www.serverphorums.com/read.php?12,51902
> 
> > Why is this needed?
> 
> It's not actually needed beside the trivial reason of providing an interface
> not just for one single architecture.
> 
> After reading the discussion from 2009 again, I'm fine if 
> you would simply drop the patch. The decision up to you.

Can't decide.  I guess that moving it into the kernel will, over time,
eliminate some irritating ifdefs from userspace code.

The implementation itself is a bit half-assed.  The put_user() in
arch/powerpc/kernel/process.c:get_endian() should be moved into
kernel/sys.c.  So the arch code only does the "what endianness am I"
function and common code copies that out to userspace.


--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
James Bottomley Feb. 1, 2017, 11:12 p.m. UTC | #4
On Tue, 2017-01-31 at 16:26 -0800, Andrew Morton wrote:
> On Sat, 28 Jan 2017 12:13:10 +0100 Helge Deller <deller@gmx.de>
> wrote:
> 
> > The prctl(PR_GET_ENDIAN) syscall was added to Kernel 2.6.18, but
> > implemented for PowerPC only. This trivial patch adds support for 
> > this syscall for all other architectures.
> 
> Seems reasonable.  I guess.  Why is this needed?

I don't think it is other than for PPC.  If you're not variable endian
(which is only PPC to date), then you should know a priori what endian
you are from the #defines in userspace.

James

--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Andy Lutomirski Feb. 2, 2017, 5:08 a.m. UTC | #5
On Wed, Feb 1, 2017 at 3:12 PM, James Bottomley
<James.Bottomley@hansenpartnership.com> wrote:
> On Tue, 2017-01-31 at 16:26 -0800, Andrew Morton wrote:
>> On Sat, 28 Jan 2017 12:13:10 +0100 Helge Deller <deller@gmx.de>
>> wrote:
>>
>> > The prctl(PR_GET_ENDIAN) syscall was added to Kernel 2.6.18, but
>> > implemented for PowerPC only. This trivial patch adds support for
>> > this syscall for all other architectures.
>>
>> Seems reasonable.  I guess.  Why is this needed?
>
> I don't think it is other than for PPC.  If you're not variable endian
> (which is only PPC to date), then you should know a priori what endian
> you are from the #defines in userspace.

I find it vaguely odd even on PPC.  Surely you can tell what your
endianness is directly.  (An API to query the endianness of another
task would be useful, though.)
--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Matt Turner Feb. 5, 2017, 11:48 a.m. UTC | #6
On Thu, Feb 2, 2017 at 12:12 AM, James Bottomley
<James.Bottomley@hansenpartnership.com> wrote:
> On Tue, 2017-01-31 at 16:26 -0800, Andrew Morton wrote:
>> On Sat, 28 Jan 2017 12:13:10 +0100 Helge Deller <deller@gmx.de>
>> wrote:
>>
>> > The prctl(PR_GET_ENDIAN) syscall was added to Kernel 2.6.18, but
>> > implemented for PowerPC only. This trivial patch adds support for
>> > this syscall for all other architectures.
>>
>> Seems reasonable.  I guess.  Why is this needed?
>
> I don't think it is other than for PPC.  If you're not variable endian
> (which is only PPC to date), then you should know a priori what endian
> you are from the #defines in userspace.

MIPS as well, but it seems strange to require the kernel to tell you
your endianness, when you can easily determine it yourself. Unless
there's something about this I don't understand.
--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Maciej W. Rozycki Feb. 5, 2017, 1:15 p.m. UTC | #7
On Sun, 5 Feb 2017, Matt Turner wrote:

> > I don't think it is other than for PPC.  If you're not variable endian
> > (which is only PPC to date), then you should know a priori what endian
> > you are from the #defines in userspace.
> 
> MIPS as well, but it seems strange to require the kernel to tell you
> your endianness, when you can easily determine it yourself. Unless
> there's something about this I don't understand.

 Many MIPS processors do have a reverse-endian control bit, which allows a 
user process to execute in the endianness opposite to the endianness the 
kernel runs in.  The feature has been around since 1991 and the R4000 CPU, 
however support is unlikely to be ever added to the MIPS/Linux port, due 
to the complexity required for byte-swapping all the data structures 
passed in memory between the kernel and the userland.  Does the PPC/Linux 
port actually implement this swapping?

  Maciej
--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Michael Ellerman Feb. 15, 2017, 5:20 a.m. UTC | #8
"Maciej W. Rozycki" <macro@linux-mips.org> writes:

> On Sun, 5 Feb 2017, Matt Turner wrote:
>
>> > I don't think it is other than for PPC.  If you're not variable endian
>> > (which is only PPC to date), then you should know a priori what endian
>> > you are from the #defines in userspace.
>> 
>> MIPS as well, but it seems strange to require the kernel to tell you
>> your endianness, when you can easily determine it yourself. Unless
>> there's something about this I don't understand.
>
>  Many MIPS processors do have a reverse-endian control bit, which allows a 
> user process to execute in the endianness opposite to the endianness the 
> kernel runs in.  The feature has been around since 1991 and the R4000 CPU, 
> however support is unlikely to be ever added to the MIPS/Linux port, due 
> to the complexity required for byte-swapping all the data structures 
> passed in memory between the kernel and the userland.  Does the PPC/Linux 
> port actually implement this swapping?

No. Userspace can change endian, but it has to cope with the kernel
being in the original endian.

cheers
--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/kernel/sys.c b/kernel/sys.c
index 842914e..5818e5e 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -79,9 +79,6 @@ 
 #ifndef GET_FPEXC_CTL
 # define GET_FPEXC_CTL(a, b)	(-EINVAL)
 #endif
-#ifndef GET_ENDIAN
-# define GET_ENDIAN(a, b)	(-EINVAL)
-#endif
 #ifndef SET_ENDIAN
 # define SET_ENDIAN(a, b)	(-EINVAL)
 #endif
@@ -2136,7 +2133,13 @@  SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
 			return -EFAULT;
 		break;
 	case PR_GET_ENDIAN:
+#ifdef GET_ENDIAN
 		error = GET_ENDIAN(me, arg2);
+#elif defined(__BIG_ENDIAN)
+		error = put_user(PR_ENDIAN_BIG, (unsigned int __user *)arg2);
+#else
+		error = put_user(PR_ENDIAN_LITTLE, (unsigned int __user *)arg2);
+#endif
 		break;
 	case PR_SET_ENDIAN:
 		error = SET_ENDIAN(me, arg2);