PATCH: uid16 cleanup for 64 bit architectures
Subsystems (6)
The NGROUPS patch exposed me to a lot of duplicated code in some of the 64 bit architectures (stemming from CONFIG_UID16).
So a few months back, I worked up a solution. It seems that things have changed some. Architectures that used to not define CONFIG_UID16 (sparc64, s390, x86_64) now do. But they don't take advantage of the uid16.c code.
This (totally experimental, untestable by me) patch removes the offending code. In short:
* pry apart highuid.h and uid16.c
* build uid16.o iff CONFIG_UID16_SYSCALLS
* anywhere that defines CONFIG_UID16 adds CONFIG_UID16_SYSCALLS
* add CONFIG_UID16_SYSCALLS for any arch that wants to use uid16.c without converting everywhere else highuid.h is used
* strip out lots of code that was copied from uid16.c
This may all be totally worthless. That's up to the arch people to decide, I guess. I just said I would look into the mess. :)
Signature · 4 lines
Tim Hockin Sun Microsystems, Linux Software Engineering [email protected] All opinions are my own, not Sun's
arch/arm/Kconfig +4 -0
@@ -50,6 +50,10 @@ bool default y +config UID16_SYSCALLS + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y
arch/arm26/Kconfig +4 -0
@@ -38,6 +38,10 @@ bool default y +config UID16_SYSCALLS + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y
arch/cris/Kconfig +4 -0
@@ -13,6 +13,10 @@ bool default y +config UID16_SYSCALLS + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y
arch/h8300/Kconfig +4 -0
@@ -25,6 +25,10 @@ bool default y +config UID16_SYSCALLS + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y
arch/i386/Kconfig +4 -0
@@ -25,6 +25,10 @@ bool default y +config UID16_SYSCALLS + bool + default y + config GENERIC_ISA_DMA bool default y
arch/ia64/ia32/ia32_entry.S +2 -2
@@ -288,8 +288,8 @@ data8 compat_sys_getrusage data8 sys32_gettimeofday data8 sys32_settimeofday - data8 sys32_getgroups16 /* 80 */ - data8 sys32_setgroups16 + data8 sys_getgroups16 /* 80 */ + data8 sys_setgroups16 data8 sys32_old_select data8 sys_symlink data8 sys_ni_syscall
arch/ia64/ia32/sys_ia32.c +0 -81
87 lines not on this page · raw message
arch/ia64/Kconfig +5 -0
@@ -385,6 +385,11 @@ depends on IA32_SUPPORT default y +config UID16_SYSCALLS + bool + depends on IA32_SUPPORT + default y + config PERFMON bool "Performance monitor support" help
arch/m68k/Kconfig +4 -0
@@ -14,6 +14,10 @@ bool default y +config UID16_SYSCALLS + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y
arch/m68knommu/Kconfig +4 -0
@@ -17,6 +17,10 @@ bool default y +config UID16_SYSCALLS + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y
arch/s390/Kconfig +5 -0
@@ -28,6 +28,11 @@ default y depends on ARCH_S390X = 'n' +config UID16_SYSCALLS + bool + default y + depends on ARCH_S390X = 'n' + source "init/Kconfig" menu "Base setup"
arch/s390/kernel/compat_linux.c +0 -204
221 lines not on this page · raw message
arch/s390/kernel/compat_wrapper.S +15 -15
@@ -84,7 +84,7 @@ llgtr %r2,%r2 # const char * llgfr %r3,%r3 # __kernel_old_uid_emu31_t llgfr %r4,%r4 # __kernel_old_uid_emu31_t - jg sys32_lchown16 # branch to system call + jg sys_lchown16 # branch to system call .globl sys32_lseek_wrapper sys32_lseek_wrapper:
@@ -112,7 +112,7 @@ .globl sys32_setuid16_wrapper sys32_setuid16_wrapper: llgfr %r2,%r2 # __kernel_old_uid_emu31_t - jg sys32_setuid16 # branch to system call + jg sys_setuid16 # branch to system call #sys32_getuid16_wrapper # void
@@ -196,7 +196,7 @@ .globl sys32_setgid16_wrapper sys32_setgid16_wrapper: llgfr %r2,%r2 # __kernel_old_gid_emu31_t - jg sys32_setgid16 # branch to system call + jg sys_setgid16 # branch to system call #sys32_getgid16_wrapper # void
@@ -279,13 +279,13 @@ sys32_setreuid16_wrapper: llgfr %r2,%r2 # __kernel_old_uid_emu31_t llgfr %r3,%r3 # __kernel_old_uid_emu31_t - jg sys32_setreuid16 # branch to system call + jg sys_setreuid16 # branch to system call .globl sys32_setregid16_wrapper sys32_setregid16_wrapper: llgfr %r2,%r2 # __kernel_old_gid_emu31_t llgfr %r3,%r3 # __kernel_old_gid_emu31_t - jg sys32_setregid16 # branch to system call + jg sys_setregid16 # branch to system call #sys32_sigsuspend_wrapper # done in sigsuspend_glue
@@ -345,13 +345,13 @@ sys32_getgroups16_wrapper: lgfr %r2,%r2 # int llgtr %r3,%r3 # __kernel_old_gid_emu31_t * - jg sys32_getgroups16 # branch to system call + jg sys_getgroups16 # branch to system call .globl sys32_setgroups16_wrapper sys32_setgroups16_wrapper: lgfr %r2,%r2 # int llgtr %r3,%r3 # __kernel_old_gid_emu31_t * - jg sys32_setgroups16 # branch to system call + jg sys_setgroups16 # branch to system call .globl sys32_symlink_wrapper sys32_symlink_wrapper:
@@ -426,7 +426,7 @@ llgfr %r2,%r2 # unsigned int llgtr %r3,%r3 # __kernel_old_uid_emu31_t * llgtr %r4,%r4 # __kernel_old_gid_emu31_t * - jg sys32_fchown16 # branch to system call + jg sys_fchown16 # branch to system call .globl sys32_getpriority_wrapper sys32_getpriority_wrapper:
@@ -615,12 +615,12 @@ .globl sys32_setfsuid16_wrapper sys32_setfsuid16_wrapper: llgfr %r2,%r2 # __kernel_old_uid_emu31_t - jg sys32_setfsuid16 # branch to system call + jg sys_setfsuid16 # branch to system call .globl sys32_setfsgid16_wrapper sys32_setfsgid16_wrapper: llgfr %r2,%r2 # __kernel_old_gid_emu31_t - jg sys32_setfsgid16 # branch to system call + jg sys_setfsgid16 # branch to system call .globl sys32_llseek_wrapper sys32_llseek_wrapper:
@@ -767,14 +767,14 @@ llgfr %r2,%r2 # __kernel_old_uid_emu31_t llgfr %r3,%r3 # __kernel_old_uid_emu31_t llgfr %r4,%r4 # __kernel_old_uid_emu31_t - jg sys32_setresuid16 # branch to system call + jg sys_setresuid16 # branch to system call .globl sys32_getresuid16_wrapper sys32_getresuid16_wrapper: llgtr %r2,%r2 # __kernel_old_uid_emu31_t * llgtr %r3,%r3 # __kernel_old_uid_emu31_t * llgtr %r4,%r4 # __kernel_old_uid_emu31_t * - jg sys32_getresuid16 # branch to system call + jg sys_getresuid16 # branch to system call .globl sys32_poll_wrapper sys32_poll_wrapper:
@@ -795,14 +795,14 @@ llgfr %r2,%r2 # __kernel_old_gid_emu31_t llgfr %r3,%r3 # __kernel_old_gid_emu31_t llgfr %r4,%r4 # __kernel_old_gid_emu31_t - jg sys32_setresgid16 # branch to system call + jg sys_setresgid16 # branch to system call .globl sys32_getresgid16_wrapper sys32_getresgid16_wrapper: llgtr %r2,%r2 # __kernel_old_gid_emu31_t * llgtr %r3,%r3 # __kernel_old_gid_emu31_t * llgtr %r4,%r4 # __kernel_old_gid_emu31_t * - jg sys32_getresgid16 # branch to system call + jg sys_getresgid16 # branch to system call .globl sys32_prctl_wrapper sys32_prctl_wrapper:
@@ -876,7 +876,7 @@ llgtr %r2,%r2 # const char * llgfr %r3,%r3 # __kernel_old_uid_emu31_t llgfr %r4,%r4 # __kernel_old_gid_emu31_t - jg sys32_chown16 # branch to system call + jg sys_chown16 # branch to system call .globl sys32_getcwd_wrapper sys32_getcwd_wrapper:
arch/s390/kernel/syscalls.S +5 -5
@@ -32,7 +32,7 @@ SYSCALL(sys_mount,sys_mount,sys32_mount_wrapper) SYSCALL(sys_oldumount,sys_oldumount,sys32_oldumount_wrapper) SYSCALL(sys_setuid16,sys_ni_syscall,sys32_setuid16_wrapper) /* old setuid16 syscall*/ -SYSCALL(sys_getuid16,sys_ni_syscall,sys32_getuid16) /* old getuid16 syscall*/ +SYSCALL(sys_getuid16,sys_ni_syscall,sys_getuid16) /* old getuid16 syscall*/ SYSCALL(sys_stime,sys_ni_syscall,sys32_stime_wrapper) /* 25 old stime syscall */ SYSCALL(sys_ptrace,sys_ptrace,sys32_ptrace_wrapper) SYSCALL(sys_alarm,sys_alarm,sys32_alarm_wrapper)
@@ -54,11 +54,11 @@ SYSCALL(sys_times,sys_times,compat_sys_times_wrapper) NI_SYSCALL /* old prof syscall */ SYSCALL(sys_brk,sys_brk,sys32_brk_wrapper) /* 45 */ -SYSCALL(sys_setgid16,sys_ni_syscall,sys32_setgid16) /* old setgid16 syscall*/ -SYSCALL(sys_getgid16,sys_ni_syscall,sys32_getgid16) /* old getgid16 syscall*/ +SYSCALL(sys_setgid16,sys_ni_syscall,sys_setgid16) /* old setgid16 syscall*/ +SYSCALL(sys_getgid16,sys_ni_syscall,sys_getgid16) /* old getgid16 syscall*/ SYSCALL(sys_signal,sys_signal,sys32_signal_wrapper) -SYSCALL(sys_geteuid16,sys_ni_syscall,sys32_geteuid16) /* old geteuid16 syscall */ -SYSCALL(sys_getegid16,sys_ni_syscall,sys32_getegid16) /* 50 old getegid16 syscall */ +SYSCALL(sys_geteuid16,sys_ni_syscall,sys_geteuid16) /* old geteuid16 syscall */ +SYSCALL(sys_getegid16,sys_ni_syscall,sys_getegid16) /* 50 old getegid16 syscall */ SYSCALL(sys_acct,sys_acct,sys32_acct_wrapper) SYSCALL(sys_umount,sys_umount,sys32_umount_wrapper) NI_SYSCALL /* old lock syscall */
arch/sh/Kconfig +4 -0
@@ -18,6 +18,10 @@ bool default y +config UID16_SYSCALLS + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y
arch/sparc/Kconfig +4 -0
@@ -13,6 +13,10 @@ bool default y +config UID16_SYSCALLS + bool + default y + config HIGHMEM bool default y
arch/sparc64/Kconfig +5 -0
@@ -381,6 +381,11 @@ depends on SPARC32_COMPAT default y +config UID16_SYSCALLS + bool + depends on SPARC32_COMPAT + default y + config BINFMT_ELF32 tristate "Kernel support for 32-bit ELF binaries" depends on SPARC32_COMPAT
arch/sparc64/kernel/entry.S +4 -4
@@ -1475,9 +1475,9 @@ /* SunOS getuid() returns uid in %o0 and euid in %o1 */ .globl sunos_getuid sunos_getuid: - call sys32_geteuid16 + call sys_geteuid16 nop - call sys32_getuid16 + call sys_getuid16 stx %o0, [%sp + PTREGS_OFF + PT_V9_I1] b,pt %xcc, ret_sys_call stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
@@ -1485,9 +1485,9 @@ /* SunOS getgid() returns gid in %o0 and egid in %o1 */ .globl sunos_getgid sunos_getgid: - call sys32_getegid16 + call sys_getegid16 nop - call sys32_getgid16 + call sys_getgid16 stx %o0, [%sp + PTREGS_OFF + PT_V9_I1] b,pt %xcc, ret_sys_call stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
arch/sparc64/kernel/sys_sparc32.c +0 -188
194 lines not on this page · raw message
arch/sparc64/kernel/systbls.S +16 -16
@@ -21,21 +21,21 @@ sys_call_table32: /*0*/ .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write /*5*/ .word sparc32_open, sys_close, compat_sys_wait4, sys_creat, sys_link -/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys32_chown16, sys32_mknod -/*15*/ .word sys32_chmod, sys32_lchown16, sparc_brk, sys_perfctr, sys32_lseek -/*20*/ .word sys_getpid, sys_capget, sys_capset, sys32_setuid16, sys32_getuid16 +/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod +/*15*/ .word sys32_chmod, sys_lchown16, sparc_brk, sys_perfctr, sys32_lseek +/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16 /*25*/ .word sys_time, sys_ptrace, sys_alarm, sys32_sigaltstack, sys32_pause /*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice .word sys_chown, sys_sync, sys_kill, compat_sys_newstat, sys32_sendfile /*40*/ .word compat_sys_newlstat, sys_dup, sys_pipe, compat_sys_times, sys_getuid - .word sys_umount, sys32_setgid16, sys32_getgid16, sys_signal, sys32_geteuid16 -/*50*/ .word sys32_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl + .word sys_umount, sys_setgid16, sys_getgid16, sys_signal, sys_geteuid16 +/*50*/ .word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl .word sys_reboot, sys32_mmap2, sys_symlink, sys_readlink, sys32_execve /*60*/ .word sys_umask, sys_chroot, compat_sys_newfstat, sys_fstat64, sys_getpagesize .word sys_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid /*70*/ .word sys_getegid, sys32_mmap, sys_setreuid, sys_munmap, sys_mprotect - .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys32_getgroups16 -/*80*/ .word sys32_setgroups16, sys_getpgrp, sys_setgroups, compat_sys_setitimer, sys32_ftruncate64 + .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys_getgroups16 +/*80*/ .word sys_setgroups16, sys_getpgrp, sys_setgroups, compat_sys_setitimer, sys32_ftruncate64 .word sys_swapon, compat_sys_getitimer, sys_setuid, sys_sethostname, sys_setgid /*90*/ .word sys_dup2, sys_setfsuid, compat_sys_fcntl, sys32_select, sys_setfsgid .word sys_fsync, sys_setpriority32, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
@@ -43,8 +43,8 @@ .word sys32_rt_sigtimedwait, sys32_rt_sigqueueinfo, sys32_rt_sigsuspend, sys_setresuid, sys_getresuid /*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall .word sys_getgroups, sys32_gettimeofday, compat_sys_getrusage, sys_nis_syscall, sys_getcwd -/*120*/ .word sys32_readv, sys32_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod - .word sys_nis_syscall, sys32_setreuid16, sys32_setregid16, sys_rename, sys_truncate +/*120*/ .word sys32_readv, sys32_writev, sys32_settimeofday, sys_fchown16, sys_fchmod + .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys_truncate /*130*/ .word sys_ftruncate, sys_flock, sys_lstat64, sys_nis_syscall, sys_nis_syscall .word sys_nis_syscall, sys_mkdir, sys_rmdir, sys32_utimes, sys_stat64 /*140*/ .word sys32_sendfile64, sys_nis_syscall, compat_sys_futex, sys_gettid, compat_sys_getrlimit
@@ -64,7 +64,7 @@ /*210*/ .word sys32_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys32_sysinfo .word sys32_ipc, sys32_sigreturn, sys_clone, sys_nis_syscall, sys32_adjtimex /*220*/ .word compat_sys_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys_getpgid - .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys32_setfsuid16, sys32_setfsgid16 + .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16 /*230*/ .word sys32_select, sys_time, sys_nis_syscall, sys_stime, compat_statfs64 .word compat_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall /*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler
@@ -149,7 +149,7 @@ .word sys_close, sunos_wait4, sys_creat .word sys_link, sys_unlink, sunos_execv .word sys_chdir, sunos_nosys, sys32_mknod - .word sys32_chmod, sys32_lchown16, sunos_brk + .word sys32_chmod, sys_lchown16, sunos_brk .word sunos_nosys, sys32_lseek, sunos_getpid .word sunos_nosys, sunos_nosys, sunos_nosys .word sunos_getuid, sunos_nosys, sys_ptrace
@@ -170,8 +170,8 @@ .word sunos_nosys, sunos_sbrk, sunos_sstk .word sunos_mmap, sunos_vadvise, sys_munmap .word sys_mprotect, sys_madvise, sys_vhangup - .word sunos_nosys, sys_mincore, sys32_getgroups16 - .word sys32_setgroups16, sys_getpgrp, sunos_setpgrp + .word sunos_nosys, sys_mincore, sys_getgroups16 + .word sys_setgroups16, sys_getpgrp, sunos_setpgrp .word compat_sys_setitimer, sunos_nosys, sys_swapon .word compat_sys_getitimer, sys_gethostname, sys_sethostname .word sunos_getdtablesize, sys_dup2, sunos_nop
@@ -185,9 +185,9 @@ .word sys32_sigstack, compat_sys_recvmsg, compat_sys_sendmsg .word sunos_nosys, sys32_gettimeofday, compat_sys_getrusage .word sunos_getsockopt, sunos_nosys, sunos_readv - .word sunos_writev, sys32_settimeofday, sys32_fchown16 - .word sys_fchmod, sys32_recvfrom, sys32_setreuid16 - .word sys32_setregid16, sys_rename, sys_truncate + .word sunos_writev, sys32_settimeofday, sys_fchown16 + .word sys_fchmod, sys32_recvfrom, sys_setreuid16 + .word sys_setregid16, sys_rename, sys_truncate .word sys_ftruncate, sys_flock, sunos_nosys .word sys32_sendto, sys_shutdown, sys_socketpair .word sys_mkdir, sys_rmdir, sys32_utimes
arch/um/Kconfig +4 -0
@@ -22,6 +22,10 @@ bool default y +config UID16_SYSCALLS + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y
arch/x86_64/Kconfig +5 -0
@@ -368,6 +368,11 @@ depends on IA32_EMULATION default y +config UID16_SYSCALLS + bool + depends on IA32_EMULATION + default y + endmenu source drivers/Kconfig
kernel/Makefile +1 -1
@@ -11,7 +11,7 @@ obj-$(CONFIG_FUTEX) += futex.o obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o obj-$(CONFIG_SMP) += cpu.o -obj-$(CONFIG_UID16) += uid16.o +obj-$(CONFIG_UID16_SYSCALLS) += uid16.o obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_KALLSYMS) += kallsyms.o obj-$(CONFIG_PM) += power/
kernel/uid16.c +29 -21
153 lines not on this page · raw message