aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sys.c
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2006-06-07 02:10:19 -0400
committerPaul Mackerras <paulus@samba.org>2006-06-09 07:24:13 -0400
commit651d765d0b2c72d33430487c8b6ef64c60cd2134 (patch)
tree3a7253dc0b80585a03ddd581e0c00fc0f8bda7a0 /kernel/sys.c
parent3b5e905ee3bd23e9311951890aba57a0dbc81ca4 (diff)
[PATCH] Add a prctl to change the endianness of a process.
This new prctl is intended for changing the execution mode of the processor, on processors that support both a little-endian mode and a big-endian mode. It is intended for use by programs such as instruction set emulators (for example an x86 emulator on PowerPC), which may find it convenient to use the processor in an alternate endianness mode when executing translated instructions. Note that this does not imply the existence of a fully-fledged ABI for both endiannesses, or of compatibility code for converting system calls done in the non-native endianness mode. The program is expected to arrange for all of its system call arguments to be presented in the native endianness. Switching between big and little-endian mode will require some care in constructing the instruction sequence for the switch. Generally the instructions up to the instruction that invokes the prctl system call will have to be in the old endianness, and subsequent instructions will have to be in the new endianness. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'kernel/sys.c')
-rw-r--r--kernel/sys.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/kernel/sys.c b/kernel/sys.c
index 0b6ec0e7936f..12d2d753dc3b 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -57,6 +57,12 @@
57#ifndef GET_FPEXC_CTL 57#ifndef GET_FPEXC_CTL
58# define GET_FPEXC_CTL(a,b) (-EINVAL) 58# define GET_FPEXC_CTL(a,b) (-EINVAL)
59#endif 59#endif
60#ifndef GET_ENDIAN
61# define GET_ENDIAN(a,b) (-EINVAL)
62#endif
63#ifndef SET_ENDIAN
64# define SET_ENDIAN(a,b) (-EINVAL)
65#endif
60 66
61/* 67/*
62 * this is where the system-wide overflow UID and GID are defined, for 68 * this is where the system-wide overflow UID and GID are defined, for
@@ -2057,6 +2063,13 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
2057 return -EFAULT; 2063 return -EFAULT;
2058 return 0; 2064 return 0;
2059 } 2065 }
2066 case PR_GET_ENDIAN:
2067 error = GET_ENDIAN(current, arg2);
2068 break;
2069 case PR_SET_ENDIAN:
2070 error = SET_ENDIAN(current, arg2);
2071 break;
2072
2060 default: 2073 default:
2061 error = -EINVAL; 2074 error = -EINVAL;
2062 break; 2075 break;