From b7907fa83d9f069baaf7624bde03ab55da0c0db3 Mon Sep 17 00:00:00 2001 From: Isaku Yamahata Date: Sat, 19 Jan 2019 09:16:44 -0800 Subject: [PATCH] [LibOS] Make clone ABI match kernel and update glibc patch glibc: remove unnecessary pushq/popq so that shim_clone can run without segv. This is a preparation for later patch to clean up shim_clone() to remove glibc modification. libos: Currently child thread ret ip is taken from new child stack. But it can be retrieved from parent's thread context, so such a hack isn't needed. Now the modification to clone.S is not needed anymore. So remove it. --- LibOS/glibc-2.19.patch | 30 ++---------------------------- LibOS/shim/src/sys/shim_clone.c | 4 ++-- 2 files changed, 4 insertions(+), 30 deletions(-) diff --git a/LibOS/glibc-2.19.patch b/LibOS/glibc-2.19.patch index 4a2c9dac..005e59e3 100644 --- a/LibOS/glibc-2.19.patch +++ b/LibOS/glibc-2.19.patch @@ -1368,36 +1368,14 @@ diff --git a/sysdeps/unix/sysv/linux/x86_64/clone.S b/sysdeps/unix/sysv/linux/x8 index 0508730..e1b35ec 100644 --- a/sysdeps/unix/sysv/linux/x86_64/clone.S +++ b/sysdeps/unix/sysv/linux/x86_64/clone.S -@@ -59,11 +59,15 @@ ENTRY (__clone) - jz SYSCALL_ERROR_LABEL - - /* Insert the argument onto the new stack. */ -- subq $16,%rsi -- movq %rcx,8(%rsi) -+ subq $24,%rsi -+ movq %rcx,16(%rsi) - - /* Save the function pointer. It will be popped off in the - child in the ebx frobbing below. */ -+ movq %rdi,8(%rsi) -+ -+ /* Push an additional pointer as return address into the stack */ -+ leaq L(clone_return)(%rip),%rdi - movq %rdi,0(%rsi) - - /* Do the system call. */ -@@ -76,8 +80,9 @@ ENTRY (__clone) +@@ -76,5 +80,5 @@ ENTRY (__clone) /* End FDE now, because in the child the unwind info will be wrong. */ cfi_endproc; - syscall + SYSCALLDB -+L(clone_return): - testq %rax,%rax - jl SYSCALL_ERROR_LABEL - jz L(thread_start) -@@ -99,13 +104,14 @@ L(thread_start): +@@ -99,10 +104,10 @@ L(thread_start): movl $-1, %eax jne 2f movl $SYS_ify(getpid), %eax @@ -1409,10 +1387,6 @@ index 0508730..e1b35ec 100644 #endif /* Set up arguments for the function call. */ -+ addq $8,%rsp /* Skip the return address */ - popq %rax /* Function to call. */ - popq %rdi /* Argument. */ - call *%rax diff --git a/sysdeps/unix/sysv/linux/x86_64/getcontext.S b/sysdeps/unix/sysv/linux/x86_64/getcontext.S index 140db03..6967f10 100644 --- a/sysdeps/unix/sysv/linux/x86_64/getcontext.S diff --git a/LibOS/shim/src/sys/shim_clone.c b/LibOS/shim/src/sys/shim_clone.c index a5a6d646..dfb543c6 100644 --- a/LibOS/shim/src/sys/shim_clone.c +++ b/LibOS/shim/src/sys/shim_clone.c @@ -270,7 +270,7 @@ int shim_do_clone (int flags, void * user_stack_addr, int * parent_tidptr, thread->stack_top = vma.addr + vma.length; thread->stack_red = thread->stack = vma.addr; tcb->shim_tcb.context.sp = user_stack_addr; - tcb->shim_tcb.context.ret_ip = *(void **) user_stack_addr; + tcb->shim_tcb.context.ret_ip = shim_get_tls()->context.ret_ip; } thread->is_alive = true; @@ -318,7 +318,7 @@ int shim_do_clone (int flags, void * user_stack_addr, int * parent_tidptr, new_args.thread = thread; new_args.parent = self; new_args.stack = user_stack_addr; - new_args.return_pc = *(void **) user_stack_addr; + new_args.return_pc = shim_get_tls()->context.ret_ip; // Invoke DkThreadCreate to spawn off a child process using the actual // "clone" system call. DkThreadCreate allocates a stack for the child