The PR_GET_ENDIAN and PR_SET_ENDIAN prctl() calls have been implemented to
allow to switch processes at runtime from big-endian to little-endian mode (and vice versa) on PowerPC processors. Since the other architectures don't support this feature, they currently will just fail and return -EINVAL. This patch adds just minimal overhead and implements the PR_GET_ENDIAN call for all other architectures by returning the native endianess of the architecture. Furthermore, calling prctl(PR_SET_ENDIAN) with the native endianess of the architecture will succeed, while trying to set another (not-supported) endianess, will fail. The patch can be tested with the following program: #include <stdio.h> #include <linux/prctl.h> int main(int argc, char **argv) { int endian, ret; ret = prctl(PR_GET_ENDIAN, &endian); if (ret) perror("prctl(PR_GET_ENDIAN) not implemented"); printf("current process/machine is running in %s endian mode (%d)\n", endian == PR_ENDIAN_LITTLE ? "little":"big", endian); /* setting native endianess should succeed */ ret = prctl(PR_SET_ENDIAN, endian); printf("prctl(PR_SET_ENDIAN,%d) should succeed: %s\n", endian, ret == 0 ? "OK":"FAIL"); /* setting foreign endianess should fail */ endian = (endian == PR_ENDIAN_LITTLE) ? PR_ENDIAN_BIG : PR_ENDIAN_LITTLE; ret = prctl(PR_SET_ENDIAN, endian); printf("prctl(PR_SET_ENDIAN,%d) should fail: %s\n", endian, ret == 0 ? "OK":"FAIL"); } Signed-off-by: Helge Deller <deller@gmx.de> Cc: Anton Blanchard <anton@samba.org> Cc: Paul Mackerras <paulus@samba.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Showing
Please register or sign in to comment