[PATCH] x86-64: Fix ENOSYS in system call tracing
[powerpc.git] / arch / x86_64 / kernel / entry.S
index 2802524..038dcf7 100644 (file)
@@ -315,6 +315,8 @@ tracesys:
        LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
        RESTORE_REST
        cmpq $__NR_syscall_max,%rax
+       movq $-ENOSYS,%rcx
+       cmova %rcx,%rax
        ja  1f
        movq %r10,%rcx  /* fixup for C */
        call *sys_call_table(,%rax,8)
@@ -535,6 +537,8 @@ END(stub_rt_sigreturn)
 1:     incl    %gs:pda_irqcount
        cmoveq %gs:pda_irqstackptr,%rsp
        push    %rbp                    # backlink for old unwinder
+       CFI_ADJUST_CFA_OFFSET 8
+       CFI_REL_OFFSET rbp,0
        /*
         * We entered an interrupt context - irqs are off:
         */
@@ -978,6 +982,11 @@ ENTRY(kernel_thread)
        call do_fork
        movq %rax,RAX(%rsp)
        xorl %edi,%edi
+       test %rax,%rax
+       jnz  1f
+       /* terminate stack in child */
+       movq %rdi,RIP(%rsp)
+1:
 
        /*
         * It isn't worth to check for reschedule here,
@@ -1023,7 +1032,7 @@ ENDPROC(child_rip)
  * do_sys_execve asm fallback arguments:
  *     rdi: name, rsi: argv, rdx: envp, fake frame on the stack
  */
-ENTRY(execve)
+ENTRY(kernel_execve)
        CFI_STARTPROC
        FAKE_STACK_FRAME $0
        SAVE_ALL        
@@ -1036,7 +1045,7 @@ ENTRY(execve)
        UNFAKE_STACK_FRAME
        ret
        CFI_ENDPROC
-ENDPROC(execve)
+ENDPROC(kernel_execve)
 
 KPROBE_ENTRY(page_fault)
        errorentry do_page_fault
@@ -1169,6 +1178,7 @@ ENTRY(call_softirq)
        incl %gs:pda_irqcount
        cmove %gs:pda_irqstackptr,%rsp
        push  %rbp                      # backlink for old unwinder
+       CFI_ADJUST_CFA_OFFSET    8
        call __do_softirq
        leaveq
        CFI_DEF_CFA_REGISTER    rsp