diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-08-27 10:15:30 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-08-27 10:15:30 -0400 |
| commit | a7bdf7fa33127bf08eb0810698bca607a9462df4 (patch) | |
| tree | 2f4be686e49710d10cc4f5ebc2d5f06ae030b9bd /arch/alpha/kernel | |
| parent | 7fda953ffed1b94aa68f80c6c3ab312328aedcb3 (diff) | |
| parent | fea7a08acb13524b47711625eebea40a0ede69a0 (diff) | |
Merge v3.6-rc3 into usb-next
This picks up fixes that we need in this branch for testing.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/alpha/kernel')
| -rw-r--r-- | arch/alpha/kernel/alpha_ksyms.c | 3 | ||||
| -rw-r--r-- | arch/alpha/kernel/entry.S | 161 | ||||
| -rw-r--r-- | arch/alpha/kernel/osf_sys.c | 49 | ||||
| -rw-r--r-- | arch/alpha/kernel/process.c | 19 | ||||
| -rw-r--r-- | arch/alpha/kernel/systbls.S | 4 |
5 files changed, 71 insertions, 165 deletions
diff --git a/arch/alpha/kernel/alpha_ksyms.c b/arch/alpha/kernel/alpha_ksyms.c index d96e742d4dc2..15fa821d09cd 100644 --- a/arch/alpha/kernel/alpha_ksyms.c +++ b/arch/alpha/kernel/alpha_ksyms.c | |||
| @@ -52,7 +52,6 @@ EXPORT_SYMBOL(alpha_write_fp_reg_s); | |||
| 52 | 52 | ||
| 53 | /* entry.S */ | 53 | /* entry.S */ |
| 54 | EXPORT_SYMBOL(kernel_thread); | 54 | EXPORT_SYMBOL(kernel_thread); |
| 55 | EXPORT_SYMBOL(kernel_execve); | ||
| 56 | 55 | ||
| 57 | /* Networking helper routines. */ | 56 | /* Networking helper routines. */ |
| 58 | EXPORT_SYMBOL(csum_tcpudp_magic); | 57 | EXPORT_SYMBOL(csum_tcpudp_magic); |
| @@ -74,8 +73,6 @@ EXPORT_SYMBOL(alpha_fp_emul); | |||
| 74 | */ | 73 | */ |
| 75 | EXPORT_SYMBOL(__copy_user); | 74 | EXPORT_SYMBOL(__copy_user); |
| 76 | EXPORT_SYMBOL(__do_clear_user); | 75 | EXPORT_SYMBOL(__do_clear_user); |
| 77 | EXPORT_SYMBOL(__strncpy_from_user); | ||
| 78 | EXPORT_SYMBOL(__strnlen_user); | ||
| 79 | 76 | ||
| 80 | /* | 77 | /* |
| 81 | * SMP-specific symbols. | 78 | * SMP-specific symbols. |
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index 6d159cee5f2f..ec0da0567ab5 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S | |||
| @@ -663,58 +663,6 @@ kernel_thread: | |||
| 663 | br ret_to_kernel | 663 | br ret_to_kernel |
| 664 | .end kernel_thread | 664 | .end kernel_thread |
| 665 | 665 | ||
| 666 | /* | ||
| 667 | * kernel_execve(path, argv, envp) | ||
| 668 | */ | ||
| 669 | .align 4 | ||
| 670 | .globl kernel_execve | ||
| 671 | .ent kernel_execve | ||
| 672 | kernel_execve: | ||
| 673 | /* We can be called from a module. */ | ||
| 674 | ldgp $gp, 0($27) | ||
| 675 | lda $sp, -(32+SIZEOF_PT_REGS+8)($sp) | ||
| 676 | .frame $sp, 32+SIZEOF_PT_REGS+8, $26, 0 | ||
| 677 | stq $26, 0($sp) | ||
| 678 | stq $16, 8($sp) | ||
| 679 | stq $17, 16($sp) | ||
| 680 | stq $18, 24($sp) | ||
| 681 | .prologue 1 | ||
| 682 | |||
| 683 | lda $16, 32($sp) | ||
| 684 | lda $17, 0 | ||
| 685 | lda $18, SIZEOF_PT_REGS | ||
| 686 | bsr $26, memset !samegp | ||
| 687 | |||
| 688 | /* Avoid the HAE being gratuitously wrong, which would cause us | ||
| 689 | to do the whole turn off interrupts thing and restore it. */ | ||
| 690 | ldq $2, alpha_mv+HAE_CACHE | ||
| 691 | stq $2, 152+32($sp) | ||
| 692 | |||
| 693 | ldq $16, 8($sp) | ||
| 694 | ldq $17, 16($sp) | ||
| 695 | ldq $18, 24($sp) | ||
| 696 | lda $19, 32($sp) | ||
| 697 | bsr $26, do_execve !samegp | ||
| 698 | |||
| 699 | ldq $26, 0($sp) | ||
| 700 | bne $0, 1f /* error! */ | ||
| 701 | |||
| 702 | /* Move the temporary pt_regs struct from its current location | ||
| 703 | to the top of the kernel stack frame. See copy_thread for | ||
| 704 | details for a normal process. */ | ||
| 705 | lda $16, 0x4000 - SIZEOF_PT_REGS($8) | ||
| 706 | lda $17, 32($sp) | ||
| 707 | lda $18, SIZEOF_PT_REGS | ||
| 708 | bsr $26, memmove !samegp | ||
| 709 | |||
| 710 | /* Take that over as our new stack frame and visit userland! */ | ||
| 711 | lda $sp, 0x4000 - SIZEOF_PT_REGS($8) | ||
| 712 | br $31, ret_from_sys_call | ||
| 713 | |||
| 714 | 1: lda $sp, 32+SIZEOF_PT_REGS+8($sp) | ||
| 715 | ret | ||
| 716 | .end kernel_execve | ||
| 717 | |||
| 718 | 666 | ||
| 719 | /* | 667 | /* |
| 720 | * Special system calls. Most of these are special in that they either | 668 | * Special system calls. Most of these are special in that they either |
| @@ -797,115 +745,6 @@ sys_rt_sigreturn: | |||
| 797 | .end sys_rt_sigreturn | 745 | .end sys_rt_sigreturn |
| 798 | 746 | ||
| 799 | .align 4 | 747 | .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 | .globl sys_execve | 748 | .globl sys_execve |
| 910 | .ent sys_execve | 749 | .ent sys_execve |
| 911 | sys_execve: | 750 | sys_execve: |
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 98a103621af6..bc1acdda7a5e 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c | |||
| @@ -1404,3 +1404,52 @@ SYSCALL_DEFINE3(osf_writev, unsigned long, fd, | |||
| 1404 | } | 1404 | } |
| 1405 | 1405 | ||
| 1406 | #endif | 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 | } | ||
diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index 153d3fce3e8e..d6fde98b74b3 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c | |||
| @@ -455,3 +455,22 @@ get_wchan(struct task_struct *p) | |||
| 455 | } | 455 | } |
| 456 | return pc; | 456 | return pc; |
| 457 | } | 457 | } |
| 458 | |||
| 459 | int kernel_execve(const char *path, const char *const argv[], const char *const envp[]) | ||
| 460 | { | ||
| 461 | /* Avoid the HAE being gratuitously wrong, which would cause us | ||
| 462 | to do the whole turn off interrupts thing and restore it. */ | ||
| 463 | struct pt_regs regs = {.hae = alpha_mv.hae_cache}; | ||
| 464 | int err = do_execve(path, argv, envp, ®s); | ||
| 465 | if (!err) { | ||
| 466 | struct pt_regs *p = current_pt_regs(); | ||
| 467 | /* copy regs to normal position and off to userland we go... */ | ||
| 468 | *p = regs; | ||
| 469 | __asm__ __volatile__ ( | ||
| 470 | "mov %0, $sp;" | ||
| 471 | "br $31, ret_from_sys_call" | ||
| 472 | : : "r"(p)); | ||
| 473 | } | ||
| 474 | return err; | ||
| 475 | } | ||
| 476 | EXPORT_SYMBOL(kernel_execve); | ||
diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S index 87835235f114..2ac6b45c3e00 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S | |||
| @@ -111,7 +111,7 @@ sys_call_table: | |||
| 111 | .quad sys_socket | 111 | .quad sys_socket |
| 112 | .quad sys_connect | 112 | .quad sys_connect |
| 113 | .quad sys_accept | 113 | .quad sys_accept |
| 114 | .quad osf_getpriority /* 100 */ | 114 | .quad sys_osf_getpriority /* 100 */ |
| 115 | .quad sys_send | 115 | .quad sys_send |
| 116 | .quad sys_recv | 116 | .quad sys_recv |
| 117 | .quad sys_sigreturn | 117 | .quad sys_sigreturn |
| @@ -522,6 +522,8 @@ sys_call_table: | |||
| 522 | .quad sys_setns | 522 | .quad sys_setns |
| 523 | .quad sys_accept4 | 523 | .quad sys_accept4 |
| 524 | .quad sys_sendmmsg | 524 | .quad sys_sendmmsg |
| 525 | .quad sys_process_vm_readv | ||
| 526 | .quad sys_process_vm_writev /* 505 */ | ||
| 525 | 527 | ||
| 526 | .size sys_call_table, . - sys_call_table | 528 | .size sys_call_table, . - sys_call_table |
| 527 | .type sys_call_table, @object | 529 | .type sys_call_table, @object |
