• Helge Deller's avatar
    The PR_GET_ENDIAN and PR_SET_ENDIAN prctl() calls have been implemented to · c21a779d
    Helge Deller authored
    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: default avatarHelge Deller <deller@gmx.de>
    Cc: Anton Blanchard <anton@samba.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    c21a779d
sys.c 38.3 KB