Commit be53db6e4edd9dc013b21a929ad2b142dea8b9c0
Committed by
Linus Torvalds
1 parent
f2db633d30
Exists in
master
and in
20 other branches
alpha: take a bunch of syscalls into osf_sys.c
New helper: current_thread_info(). Allows to do a bunch of odd syscalls in C. While we are at it, there had never been a reason to do osf_getpriority() in assembler. We also get "namespace"-aware (read: consistent with getuid(2), etc.) behaviour from getx?id() syscalls now. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Michael Cree <mcree@orcon.net.nz> Acked-by: Matt Turner <mattst88@gmail.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 5 changed files with 54 additions and 120 deletions Side-by-side Diff
arch/alpha/include/asm/ptrace.h
... | ... | @@ -76,7 +76,10 @@ |
76 | 76 | #define task_pt_regs(task) \ |
77 | 77 | ((struct pt_regs *) (task_stack_page(task) + 2*PAGE_SIZE) - 1) |
78 | 78 | |
79 | -#define force_successful_syscall_return() (task_pt_regs(current)->r0 = 0) | |
79 | +#define current_pt_regs() \ | |
80 | + ((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1) | |
81 | + | |
82 | +#define force_successful_syscall_return() (current_pt_regs()->r0 = 0) | |
80 | 83 | |
81 | 84 | #endif |
82 | 85 |
arch/alpha/kernel/entry.S
... | ... | @@ -797,115 +797,6 @@ |
797 | 797 | .end sys_rt_sigreturn |
798 | 798 | |
799 | 799 | .align 4 |
800 | - .globl sys_sethae | |
801 | - .ent sys_sethae | |
802 | -sys_sethae: | |
803 | - .prologue 0 | |
804 | - stq $16, 152($sp) | |
805 | - ret | |
806 | -.end sys_sethae | |
807 | - | |
808 | - .align 4 | |
809 | - .globl osf_getpriority | |
810 | - .ent osf_getpriority | |
811 | -osf_getpriority: | |
812 | - lda $sp, -16($sp) | |
813 | - stq $26, 0($sp) | |
814 | - .prologue 0 | |
815 | - | |
816 | - jsr $26, sys_getpriority | |
817 | - | |
818 | - ldq $26, 0($sp) | |
819 | - blt $0, 1f | |
820 | - | |
821 | - /* Return value is the unbiased priority, i.e. 20 - prio. | |
822 | - This does result in negative return values, so signal | |
823 | - no error by writing into the R0 slot. */ | |
824 | - lda $1, 20 | |
825 | - stq $31, 16($sp) | |
826 | - subl $1, $0, $0 | |
827 | - unop | |
828 | - | |
829 | -1: lda $sp, 16($sp) | |
830 | - ret | |
831 | -.end osf_getpriority | |
832 | - | |
833 | - .align 4 | |
834 | - .globl sys_getxuid | |
835 | - .ent sys_getxuid | |
836 | -sys_getxuid: | |
837 | - .prologue 0 | |
838 | - ldq $2, TI_TASK($8) | |
839 | - ldq $3, TASK_CRED($2) | |
840 | - ldl $0, CRED_UID($3) | |
841 | - ldl $1, CRED_EUID($3) | |
842 | - stq $1, 80($sp) | |
843 | - ret | |
844 | -.end sys_getxuid | |
845 | - | |
846 | - .align 4 | |
847 | - .globl sys_getxgid | |
848 | - .ent sys_getxgid | |
849 | -sys_getxgid: | |
850 | - .prologue 0 | |
851 | - ldq $2, TI_TASK($8) | |
852 | - ldq $3, TASK_CRED($2) | |
853 | - ldl $0, CRED_GID($3) | |
854 | - ldl $1, CRED_EGID($3) | |
855 | - stq $1, 80($sp) | |
856 | - ret | |
857 | -.end sys_getxgid | |
858 | - | |
859 | - .align 4 | |
860 | - .globl sys_getxpid | |
861 | - .ent sys_getxpid | |
862 | -sys_getxpid: | |
863 | - .prologue 0 | |
864 | - ldq $2, TI_TASK($8) | |
865 | - | |
866 | - /* See linux/kernel/timer.c sys_getppid for discussion | |
867 | - about this loop. */ | |
868 | - ldq $3, TASK_GROUP_LEADER($2) | |
869 | - ldq $4, TASK_REAL_PARENT($3) | |
870 | - ldl $0, TASK_TGID($2) | |
871 | -1: ldl $1, TASK_TGID($4) | |
872 | -#ifdef CONFIG_SMP | |
873 | - mov $4, $5 | |
874 | - mb | |
875 | - ldq $3, TASK_GROUP_LEADER($2) | |
876 | - ldq $4, TASK_REAL_PARENT($3) | |
877 | - cmpeq $4, $5, $5 | |
878 | - beq $5, 1b | |
879 | -#endif | |
880 | - stq $1, 80($sp) | |
881 | - ret | |
882 | -.end sys_getxpid | |
883 | - | |
884 | - .align 4 | |
885 | - .globl sys_alpha_pipe | |
886 | - .ent sys_alpha_pipe | |
887 | -sys_alpha_pipe: | |
888 | - lda $sp, -16($sp) | |
889 | - stq $26, 0($sp) | |
890 | - .prologue 0 | |
891 | - | |
892 | - mov $31, $17 | |
893 | - lda $16, 8($sp) | |
894 | - jsr $26, do_pipe_flags | |
895 | - | |
896 | - ldq $26, 0($sp) | |
897 | - bne $0, 1f | |
898 | - | |
899 | - /* The return values are in $0 and $20. */ | |
900 | - ldl $1, 12($sp) | |
901 | - ldl $0, 8($sp) | |
902 | - | |
903 | - stq $1, 80+16($sp) | |
904 | -1: lda $sp, 16($sp) | |
905 | - ret | |
906 | -.end sys_alpha_pipe | |
907 | - | |
908 | - .align 4 | |
909 | 800 | .globl sys_execve |
910 | 801 | .ent sys_execve |
911 | 802 | sys_execve: |
arch/alpha/kernel/osf_sys.c
... | ... | @@ -1404,4 +1404,53 @@ |
1404 | 1404 | } |
1405 | 1405 | |
1406 | 1406 | #endif |
1407 | + | |
1408 | +SYSCALL_DEFINE2(osf_getpriority, int, which, int, who) | |
1409 | +{ | |
1410 | + int prio = sys_getpriority(which, who); | |
1411 | + if (prio >= 0) { | |
1412 | + /* Return value is the unbiased priority, i.e. 20 - prio. | |
1413 | + This does result in negative return values, so signal | |
1414 | + no error */ | |
1415 | + force_successful_syscall_return(); | |
1416 | + prio = 20 - prio; | |
1417 | + } | |
1418 | + return prio; | |
1419 | +} | |
1420 | + | |
1421 | +SYSCALL_DEFINE0(getxuid) | |
1422 | +{ | |
1423 | + current_pt_regs()->r20 = sys_geteuid(); | |
1424 | + return sys_getuid(); | |
1425 | +} | |
1426 | + | |
1427 | +SYSCALL_DEFINE0(getxgid) | |
1428 | +{ | |
1429 | + current_pt_regs()->r20 = sys_getegid(); | |
1430 | + return sys_getgid(); | |
1431 | +} | |
1432 | + | |
1433 | +SYSCALL_DEFINE0(getxpid) | |
1434 | +{ | |
1435 | + current_pt_regs()->r20 = sys_getppid(); | |
1436 | + return sys_getpid(); | |
1437 | +} | |
1438 | + | |
1439 | +SYSCALL_DEFINE0(alpha_pipe) | |
1440 | +{ | |
1441 | + int fd[2]; | |
1442 | + int res = do_pipe_flags(fd, 0); | |
1443 | + if (!res) { | |
1444 | + /* The return values are in $0 and $20. */ | |
1445 | + current_pt_regs()->r20 = fd[1]; | |
1446 | + res = fd[0]; | |
1447 | + } | |
1448 | + return res; | |
1449 | +} | |
1450 | + | |
1451 | +SYSCALL_DEFINE1(sethae, unsigned long, val) | |
1452 | +{ | |
1453 | + current_pt_regs()->hae = val; | |
1454 | + return 0; | |
1455 | +} |
arch/alpha/kernel/systbls.S
kernel/timer.c
... | ... | @@ -1407,13 +1407,6 @@ |
1407 | 1407 | |
1408 | 1408 | #endif |
1409 | 1409 | |
1410 | -#ifndef __alpha__ | |
1411 | - | |
1412 | -/* | |
1413 | - * The Alpha uses getxpid, getxuid, and getxgid instead. Maybe this | |
1414 | - * should be moved into arch/i386 instead? | |
1415 | - */ | |
1416 | - | |
1417 | 1410 | /** |
1418 | 1411 | * sys_getpid - return the thread group id of the current process |
1419 | 1412 | * |
... | ... | @@ -1468,8 +1461,6 @@ |
1468 | 1461 | /* Only we change this so SMP safe */ |
1469 | 1462 | return from_kgid_munged(current_user_ns(), current_egid()); |
1470 | 1463 | } |
1471 | - | |
1472 | -#endif | |
1473 | 1464 | |
1474 | 1465 | static void process_timeout(unsigned long __data) |
1475 | 1466 | { |