This is a preparatory change which allows to drop most of SYSENTER machinery
and make SYSENTER reuse SYSCALL code: we will be deleting entire
SYSENTER code block, including auditsys_entry_common and
auditsys_exit macros.

Signed-off-by: Denys Vlasenko <dvlas...@redhat.com>
CC: Ingo Molnar <mi...@kernel.org>
CC: Linus Torvalds <torva...@linux-foundation.org>
CC: Krzysztof A. Sobiecki <sob...@gmail.com>
CC: Steven Rostedt <rost...@goodmis.org>
CC: Borislav Petkov <b...@alien8.de>
CC: "H. Peter Anvin" <h...@zytor.com>
CC: Andy Lutomirski <l...@amacapital.net>
CC: Oleg Nesterov <o...@redhat.com>
CC: Frederic Weisbecker <fweis...@gmail.com>
CC: Alexei Starovoitov <a...@plumgrid.com>
CC: Will Drewry <w...@chromium.org>
CC: Kees Cook <keesc...@chromium.org>
CC: x...@kernel.org
CC: linux-kernel@vger.kernel.org
---
 arch/x86/entry/entry_64_compat.S | 57 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 53 insertions(+), 4 deletions(-)

diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S
index 9f9dfa5..df102e8 100644
--- a/arch/x86/entry/entry_64_compat.S
+++ b/arch/x86/entry/entry_64_compat.S
@@ -396,13 +396,62 @@ sysretl_from_sys_call:
 
 #ifdef CONFIG_AUDITSYSCALL
 cstar_auditsys:
-       movl    %r9d, R9(%rsp)          /* register to be clobbered by call */
-       auditsys_entry_common
-       movl    R9(%rsp), %r9d          /* reload 6th syscall arg */
+       movl    %r9d, R9(%rsp)          /* R9 is callee-clobbered, save it */
+       /*
+        * At this point, registers hold syscall args in the 32-bit syscall ABI:
+        * EAX is syscall number, the 6 args are in EBX,ECX,EDX,ESI,EDI,
+        * 6th arg is in R9.
+        *
+        * We want to pass them to __audit_syscall_entry(), which is a 64-bit
+        * C function with 5 parameters, so shuffle them to match what
+        * the function expects: RDI,RSI,RDX,RCX,R8.
+        */
+       movl    %esi, %r8d              /* arg5 (R8 ) <= 4th syscall arg (ESI) 
*/
+       xchg    %ecx, %edx              /* arg4 (RCX) <= 3rd syscall arg (EDX) 
*/
+                                       /* arg3 (RDX) <= 2nd syscall arg (ECX) 
*/
+       movl    %ebx, %esi              /* arg2 (RSI) <= 1st syscall arg (EBX) 
*/
+       movl    %eax, %edi              /* arg1 (RDI) <= syscall number  (EAX) 
*/
+       call    __audit_syscall_entry
+
+       /*
+        * We are going to jump back to the syscall dispatch code.
+        * Prepare syscall args as required by the 64-bit C ABI.
+        * Registers clobbered by __audit_syscall_entry() are
+        * loaded from pt_regs on stack:
+        */
+       movl    ORIG_RAX(%rsp), %eax    /* syscall number */
+       movl    %ebx, %edi              /* arg1 */
+       movl    RCX(%rsp), %esi         /* arg2 */
+       movl    RDX(%rsp), %edx         /* arg3 */
+       movl    RSI(%rsp), %ecx         /* arg4 */
+       movl    RDI(%rsp), %r8d         /* arg5 */
+       movl    R9(%rsp), %r9d          /* arg6 */
        jmp     cstar_dispatch
 
 sysretl_audit:
-       auditsys_exit sysretl_from_sys_call
+       TRACE_IRQS_ON
+       ENABLE_INTERRUPTS(CLBR_NONE)
+       testl   $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), 
ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS)
+       jnz     ia32_ret_from_sys_call
+       movl    %eax, %esi              /* second arg, syscall return value */
+       cmpl    $-MAX_ERRNO, %eax       /* is it an error ? */
+       jbe     1f
+       movslq  %eax, %rsi              /* if error sign extend to 64 bits */
+1:     setbe   %al                     /* 1 if error, 0 if not */
+       movzbl  %al, %edi               /* zero-extend that into %edi */
+       call    __audit_syscall_exit
+       movq    RAX(%rsp), %rax         /* reload syscall return value */
+       movl    $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), %edi
+       DISABLE_INTERRUPTS(CLBR_NONE)
+       TRACE_IRQS_OFF
+       testl   %edi, ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS)
+       jz      sysretl_from_sys_call
+       xorl    %eax, %eax              /* Do not leak kernel information */
+       movq    %rax, R11(%rsp)
+       movq    %rax, R10(%rsp)
+       movq    %rax, R9(%rsp)
+       movq    %rax, R8(%rsp)
+       jmp     int_ret_from_sys_call_irqs_off
 #endif
 
 cstar_tracesys:
-- 
1.8.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to