Commit 9af67702 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

restore: set up correct sa_restorer for SIGCHLD handler (v3)

Alexander, could you help me with ARM? I found in glibc sources, that
sa_restoer should look like this:

ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S
....
ENTRY(__cr_restore_rt)
        CFI
        mov     r7, $SYS_ify(rt_sigreturn)
        swi     0x0
        .fnend
END(__cr_restore_rt)

v2: Move architecture-dependent code in the proper place
v3: Don't add a separate handler for collecting zombies

Cc: Alexander Kartashov <alekskartashov@parallels.com>
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent f5e8e1c7
...@@ -99,6 +99,8 @@ static inline void ksigfillset(k_rtsigset_t *set) ...@@ -99,6 +99,8 @@ static inline void ksigfillset(k_rtsigset_t *set)
set->sig[i] = (unsigned long)-1; set->sig[i] = (unsigned long)-1;
} }
#define SA_RESTORER 0x04000000
typedef struct { typedef struct {
rt_sighandler_t rt_sa_handler; rt_sighandler_t rt_sa_handler;
unsigned long rt_sa_flags; unsigned long rt_sa_flags;
......
...@@ -108,6 +108,8 @@ static inline void ksigfillset(k_rtsigset_t *set) ...@@ -108,6 +108,8 @@ static inline void ksigfillset(k_rtsigset_t *set)
set->sig[i] = (unsigned long)-1; set->sig[i] = (unsigned long)-1;
} }
#define SA_RESTORER 0x04000000
typedef struct { typedef struct {
rt_sighandler_t rt_sa_handler; rt_sighandler_t rt_sa_handler;
unsigned long rt_sa_flags; unsigned long rt_sa_flags;
......
...@@ -14,3 +14,8 @@ ENTRY(__syscall_common) ...@@ -14,3 +14,8 @@ ENTRY(__syscall_common)
syscall syscall
ret ret
END(__syscall_common) END(__syscall_common)
ENTRY(__cr_restore_rt)
movq $__NR_rt_sigreturn, %rax
syscall
END(__cr_restore_rt)
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <unistd.h> #include <unistd.h>
#include <sched.h> #include <sched.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <signal.h>
#include "compiler.h" #include "compiler.h"
#include "asm/types.h" #include "asm/types.h"
...@@ -39,6 +40,9 @@ ...@@ -39,6 +40,9 @@
static struct task_entries *task_entries; static struct task_entries *task_entries;
static futex_t thread_inprogress; static futex_t thread_inprogress;
extern void cr_restore_rt (void) asm ("__cr_restore_rt")
__attribute__ ((visibility ("hidden")));
static void sigchld_handler(int signal, siginfo_t *siginfo, void *data) static void sigchld_handler(int signal, siginfo_t *siginfo, void *data)
{ {
char *r; char *r;
...@@ -433,8 +437,11 @@ long __export_restore_task(struct task_restore_core_args *args) ...@@ -433,8 +437,11 @@ long __export_restore_task(struct task_restore_core_args *args)
rt_sigaction_t act; rt_sigaction_t act;
task_entries = args->task_entries; task_entries = args->task_entries;
sys_sigaction(SIGCHLD, NULL, &act, sizeof(k_rtsigset_t));
ksigfillset(&act.rt_sa_mask);
act.rt_sa_handler = sigchld_handler; act.rt_sa_handler = sigchld_handler;
act.rt_sa_flags = SA_SIGINFO | SA_RESTORER | SA_RESTART;
act.rt_sa_restorer = cr_restore_rt;
sys_sigaction(SIGCHLD, &act, NULL, sizeof(k_rtsigset_t)); sys_sigaction(SIGCHLD, &act, NULL, sizeof(k_rtsigset_t));
log_set_fd(args->logfd); log_set_fd(args->logfd);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment