diff --git a/cr-restore.c b/cr-restore.c index bd49bf275..64815c90b 100644 --- a/cr-restore.c +++ b/cr-restore.c @@ -1530,6 +1530,7 @@ static void sigreturn_restore(pid_t pstree_pid, pid_t pid) task_args->pid = pid; task_args->fd_core = fd_core; task_args->fd_self_vmas = fd_self_vmas; + task_args->logfd = get_logfd(); cr_mutex_init(&task_args->rst_lock); @@ -1586,7 +1587,6 @@ static void sigreturn_restore(pid_t pstree_pid, pid_t pid) task_args->thread_args); close_safe(&fd_pstree); - fini_log(); /* * An indirect call to task_restore, note it never resturns diff --git a/include/restorer-log.h b/include/restorer-log.h new file mode 100644 index 000000000..f038dd03e --- /dev/null +++ b/include/restorer-log.h @@ -0,0 +1,11 @@ +#ifndef RESTORER_LOG_H__ +#define RESTORER_LOG_H__ +extern long vprint_num(char *buf, long num); + +extern void write_hex_n(unsigned long num); +extern void write_num_n(long num); +extern void write_num(long num); +extern void write_string_n(char *str); +extern void write_string(char *str); +extern void set_logfd(int fd); +#endif diff --git a/include/restorer.h b/include/restorer.h index a975b4143..56fa25865 100644 --- a/include/restorer.h +++ b/include/restorer.h @@ -67,6 +67,7 @@ struct task_restore_core_args { int fd_core; /* opened core file */ int fd_self_vmas; /* opened file with running VMAs to unmap */ char ns_last_pid_path[sizeof(LAST_PID_PATH) + 1]; + int logfd; bool restore_threads; /* if to restore threads */ u32 rst_lock; @@ -173,118 +174,6 @@ struct rt_sigframe { /* fp state follows here */ }; -#define add_ord(c) \ - do { \ - if (c < 10) \ - c += '0'; \ - else \ - c += 'a' - 10; \ - } while (0) - -static void always_inline write_char(char c) -{ - sys_write(STDERR_FILENO, &c, 1); -} - -static void always_inline write_string(char *str) -{ - int len = 0; - - while (str[len]) - len++; - - sys_write(STDERR_FILENO, str, len); -} - -static void always_inline write_string_n(char *str) -{ - char new_line = '\n'; - - write_string(str); - sys_write(STDERR_FILENO, &new_line, 1); -} - -static void always_inline write_num_n(long num) -{ - unsigned long d = 1000000000000000000; - unsigned int started = 0; - unsigned int minus = 0; - unsigned int c; - - if (num < 0) { - num = -num; - c = '-'; - sys_write(STDERR_FILENO, &c, 1); - } - - while (d) { - c = num / d; - num -= d * c; - d /= 10; - if (!c && !started) - continue; - if (!started) - started = 1; - add_ord(c); - sys_write(STDERR_FILENO, &c, 1); - - } - c = '\n'; - sys_write(STDERR_FILENO, &c, 1); -} - -static long always_inline vprint_num(char *buf, long num) -{ - unsigned long d = 1000000000000000000; - unsigned int started = 0; - unsigned int minus = 0; - unsigned int i = 0; - unsigned int c; - - if (num < 0) { - num = -num; - buf[i++] = '-'; - } - - while (d) { - c = num / d; - num -= d * c; - d /= 10; - if (!c && !started) - continue; - if (!started) - started = 1; - add_ord(c); - buf[i++] = c; - - } - - buf[i++] = 0; - - return i; -} - -static void always_inline write_hex_n(unsigned long num) -{ - unsigned char *s = (unsigned char *)# - unsigned char c; - int i; - - c = 'x'; - sys_write(STDERR_FILENO, &c, 1); - for (i = sizeof(long)/sizeof(char) - 1; i >= 0; i--) { - c = (s[i] & 0xf0) >> 4; - add_ord(c); - sys_write(STDERR_FILENO, &c, 1); - - c = (s[i] & 0x0f); - add_ord(c); - sys_write(STDERR_FILENO, &c, 1); - } - - c = '\n'; - sys_write(STDERR_FILENO, &c, 1); -} #define SHMEMS_SIZE 4096 diff --git a/restorer-log.c b/restorer-log.c new file mode 100644 index 000000000..858e36076 --- /dev/null +++ b/restorer-log.c @@ -0,0 +1,128 @@ +#include "restorer-log.h" +#include "syscall.h" + +static int logfd; + +void set_logfd(int fd) +{ + logfd = fd; +} + +#define add_ord(c) \ + do { \ + if (c < 10) \ + c += '0'; \ + else \ + c += 'a' - 10; \ + } while (0) + +static void always_inline write_char(char c) +{ + sys_write(logfd, &c, 1); +} + +void always_inline write_string(char *str) +{ + int len = 0; + + while (str[len]) + len++; + + sys_write(logfd, str, len); +} + +void always_inline write_string_n(char *str) +{ + char new_line = '\n'; + + write_string(str); + sys_write(logfd, &new_line, 1); +} + +void always_inline write_num(long num) +{ + unsigned long d = 1000000000000000000; + unsigned int started = 0; + unsigned int minus = 0; + unsigned int c; + + if (num < 0) { + num = -num; + c = '-'; + sys_write(logfd, &c, 1); + } + + while (d) { + c = num / d; + num -= d * c; + d /= 10; + if (!c && !started) + continue; + if (!started) + started = 1; + add_ord(c); + sys_write(logfd, &c, 1); + + } +} + +void always_inline write_num_n(long num) +{ + unsigned char c; + write_num(num); + c = '\n'; + sys_write(logfd, &c, sizeof(c)); +} + +long always_inline vprint_num(char *buf, long num) +{ + unsigned long d = 1000000000000000000; + unsigned int started = 0; + unsigned int minus = 0; + unsigned int i = 0; + unsigned int c; + + if (num < 0) { + num = -num; + buf[i++] = '-'; + } + + while (d) { + c = num / d; + num -= d * c; + d /= 10; + if (!c && !started) + continue; + if (!started) + started = 1; + add_ord(c); + buf[i++] = c; + + } + + buf[i++] = 0; + + return i; +} + +void always_inline write_hex_n(unsigned long num) +{ + unsigned char *s = (unsigned char *)# + unsigned char c; + int i; + + c = 'x'; + sys_write(logfd, &c, 1); + for (i = sizeof(long)/sizeof(char) - 1; i >= 0; i--) { + c = (s[i] & 0xf0) >> 4; + add_ord(c); + sys_write(logfd, &c, 1); + + c = (s[i] & 0x0f); + add_ord(c); + sys_write(logfd, &c, 1); + } + + c = '\n'; + sys_write(logfd, &c, 1); +} diff --git a/restorer.c b/restorer.c index a8898f463..8b39b7283 100644 --- a/restorer.c +++ b/restorer.c @@ -16,6 +16,7 @@ #include "image.h" #include "crtools.h" +#include "restorer-log.h" #include "lock.h" #include "restorer.h" @@ -131,6 +132,8 @@ long restore_task(struct task_restore_core_args *args) unsigned long new_sp, fsgs_base; pid_t my_pid = sys_getpid(); + set_logfd(args->logfd); + core_entry = first_on_heap(core_entry, args->mem_zone.heap); vma_entry = next_on_heap(vma_entry, core_entry); @@ -514,6 +517,8 @@ long restore_task(struct task_restore_core_args *args) goto core_restore_end; } + sys_close(args->logfd); + /* * Sigframe stack. */ @@ -540,3 +545,6 @@ core_restore_end: local_sleep(5); sys_exit(0); } + +/* FIXME Need link this .o with ld */ +#include "restorer-log.c"