aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorDavid Drysdale <drysdale@google.com>2014-12-12 19:57:33 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-12-13 15:42:51 -0500
commit27d6ec7ad6f7a2a131ff8e9f77bcc6547e178d2c (patch)
treea9d56ffca09d414656cac5a57c9b55c4b226cbea /arch/x86/kernel
parent51f39a1f0cea1cacf8c787f652f26dfee9611874 (diff)
x86: hook up execveat system call
Hook up x86-64, i386 and x32 ABIs. Signed-off-by: David Drysdale <drysdale@google.com> Cc: Meredydd Luff <meredydd@senatehouse.org> Cc: Shuah Khan <shuah.kh@samsung.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Kees Cook <keescook@chromium.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Rich Felker <dalias@aerifal.cx> Cc: Christoph Hellwig <hch@infradead.org> Cc: Michael Kerrisk <mtk.manpages@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/audit_64.c1
-rw-r--r--arch/x86/kernel/entry_64.S28
2 files changed, 29 insertions, 0 deletions
diff --git a/arch/x86/kernel/audit_64.c b/arch/x86/kernel/audit_64.c
index 06d3e5a14d9d..f3672508b249 100644
--- a/arch/x86/kernel/audit_64.c
+++ b/arch/x86/kernel/audit_64.c
@@ -50,6 +50,7 @@ int audit_classify_syscall(int abi, unsigned syscall)
50 case __NR_openat: 50 case __NR_openat:
51 return 3; 51 return 3;
52 case __NR_execve: 52 case __NR_execve:
53 case __NR_execveat:
53 return 5; 54 return 5;
54 default: 55 default:
55 return 0; 56 return 0;
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index c0226ab54106..90878aa38dbd 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -652,6 +652,20 @@ ENTRY(stub_execve)
652 CFI_ENDPROC 652 CFI_ENDPROC
653END(stub_execve) 653END(stub_execve)
654 654
655ENTRY(stub_execveat)
656 CFI_STARTPROC
657 addq $8, %rsp
658 PARTIAL_FRAME 0
659 SAVE_REST
660 FIXUP_TOP_OF_STACK %r11
661 call sys_execveat
662 RESTORE_TOP_OF_STACK %r11
663 movq %rax,RAX(%rsp)
664 RESTORE_REST
665 jmp int_ret_from_sys_call
666 CFI_ENDPROC
667END(stub_execveat)
668
655/* 669/*
656 * sigreturn is special because it needs to restore all registers on return. 670 * sigreturn is special because it needs to restore all registers on return.
657 * This cannot be done with SYSRET, so use the IRET return path instead. 671 * This cannot be done with SYSRET, so use the IRET return path instead.
@@ -697,6 +711,20 @@ ENTRY(stub_x32_execve)
697 CFI_ENDPROC 711 CFI_ENDPROC
698END(stub_x32_execve) 712END(stub_x32_execve)
699 713
714ENTRY(stub_x32_execveat)
715 CFI_STARTPROC
716 addq $8, %rsp
717 PARTIAL_FRAME 0
718 SAVE_REST
719 FIXUP_TOP_OF_STACK %r11
720 call compat_sys_execveat
721 RESTORE_TOP_OF_STACK %r11
722 movq %rax,RAX(%rsp)
723 RESTORE_REST
724 jmp int_ret_from_sys_call
725 CFI_ENDPROC
726END(stub_x32_execveat)
727
700#endif 728#endif
701 729
702/* 730/*