|
@@ -767,7 +767,6 @@ ENTRY(stub_execve)
|
|
|
PARTIAL_FRAME 0
|
|
|
SAVE_REST
|
|
|
FIXUP_TOP_OF_STACK %r11
|
|
|
- movq %rsp, %rcx
|
|
|
call sys_execve
|
|
|
RESTORE_TOP_OF_STACK %r11
|
|
|
movq %rax,RAX(%rsp)
|
|
@@ -817,8 +816,7 @@ ENTRY(stub_x32_execve)
|
|
|
PARTIAL_FRAME 0
|
|
|
SAVE_REST
|
|
|
FIXUP_TOP_OF_STACK %r11
|
|
|
- movq %rsp, %rcx
|
|
|
- call sys32_execve
|
|
|
+ call compat_sys_execve
|
|
|
RESTORE_TOP_OF_STACK %r11
|
|
|
movq %rax,RAX(%rsp)
|
|
|
RESTORE_REST
|
|
@@ -1216,36 +1214,19 @@ bad_gs:
|
|
|
jmp 2b
|
|
|
.previous
|
|
|
|
|
|
-/*
|
|
|
- * execve(). This function needs to use IRET, not SYSRET, to set up all state properly.
|
|
|
- *
|
|
|
- * C extern interface:
|
|
|
- * extern long execve(const char *name, char **argv, char **envp)
|
|
|
- *
|
|
|
- * asm input arguments:
|
|
|
- * rdi: name, rsi: argv, rdx: envp
|
|
|
- *
|
|
|
- * We want to fallback into:
|
|
|
- * extern long sys_execve(const char *name, char **argv,char **envp, struct pt_regs *regs)
|
|
|
- *
|
|
|
- * do_sys_execve asm fallback arguments:
|
|
|
- * rdi: name, rsi: argv, rdx: envp, rcx: fake frame on the stack
|
|
|
- */
|
|
|
-ENTRY(kernel_execve)
|
|
|
- CFI_STARTPROC
|
|
|
- FAKE_STACK_FRAME $0
|
|
|
- SAVE_ALL
|
|
|
- movq %rsp,%rcx
|
|
|
- call sys_execve
|
|
|
- movq %rax, RAX(%rsp)
|
|
|
- RESTORE_REST
|
|
|
- testq %rax,%rax
|
|
|
- je int_ret_from_sys_call
|
|
|
- RESTORE_ARGS
|
|
|
- UNFAKE_STACK_FRAME
|
|
|
- ret
|
|
|
- CFI_ENDPROC
|
|
|
-END(kernel_execve)
|
|
|
+ENTRY(ret_from_kernel_execve)
|
|
|
+ movq %rdi, %rsp
|
|
|
+ movl $0, RAX(%rsp)
|
|
|
+ // RESTORE_REST
|
|
|
+ movq 0*8(%rsp), %r15
|
|
|
+ movq 1*8(%rsp), %r14
|
|
|
+ movq 2*8(%rsp), %r13
|
|
|
+ movq 3*8(%rsp), %r12
|
|
|
+ movq 4*8(%rsp), %rbp
|
|
|
+ movq 5*8(%rsp), %rbx
|
|
|
+ addq $(6*8), %rsp
|
|
|
+ jmp int_ret_from_sys_call
|
|
|
+END(ret_from_kernel_execve)
|
|
|
|
|
|
/* Call softirq on interrupt stack. Interrupts are off. */
|
|
|
ENTRY(call_softirq)
|