• Dmitry Safonov's avatar
    compel: kill self-unmap in parasite · d4c02f2e
    Dmitry Safonov authored
    Why should we have self-unmapping code in parasite?
    It looks like, we can drop this code using simple sys_unmap()
    injection (like that I did for `criu exec` action and for cases where we
    failed to insert parasite by some reason, but still need to unmap remotes).
    
    It's an RFC, so just a suggestion - maybe I miss something you have in
    mind - please, describe that/those things.
    
    My motivation is:
    - less code, defined commands for PIE, one BUG() less, one jump to PIE less
    - I'm making one 64-bit parasite on x86 instead of two 32 and 64 bit.
      It works (branch 32-one-parasite) with long-jump in the beginning to
      64-bit code from 32-bit task.
      On parasite curing it sig-returns from 64-bit parasite to 32-bit task,
      this point we're trapping in CRIU. After that we command parasite to
      unmap itself, so it long-jumps again to parasite 64-bit code, unmaps,
      we caught task after sys_unmap and the task is with 64-bit CS.
      We can't set 32-bit registers after this - kernel checks that
      registers set is the same on PTRACE_SETREGSET:
    > > static int ptrace_regset(struct task_struct *task, int req, unsigned int type,
    > >                        struct iovec *kiov)
    ...
    > >       if (!regset || (kiov->iov_len % regset->size) != 0)
    > >               return -EINVAL;
      So, to return again to 32-bit task I need sigreturn() again or add
      long-jump with 32-bit CS.
      I've disable that for 32-bit testing with (in compel_cure_remote):
    -       if (ctl->addr_cmd) {
    +       if (ctl->addr_cmd && user_regs_native(&ctl->orig.regs)) {
      And it works. It also works for native tasks, so why should we keep it?
    
    travis-ci: success for compel: kill self-unmap in parasite
    Cc: Cyrill Gorcunov <gorcunov@openvz.org>
    Cc: Pavel Emelyanov <xemul@virtuozzo.com>
    Cc: Andrei Vagin <avagin@virtuozzo.com>
    Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
    Acked-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
    Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
    Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
    d4c02f2e
Name
Last commit
Last update
Documentation Loading commit data...
compel Loading commit data...
contrib Loading commit data...
coredump Loading commit data...
crit Loading commit data...
criu Loading commit data...
images Loading commit data...
include/common Loading commit data...
lib Loading commit data...
scripts Loading commit data...
soccr Loading commit data...
test Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
.travis.yml Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
INSTALL.md Loading commit data...
Makefile Loading commit data...
Makefile.compel Loading commit data...
Makefile.config Loading commit data...
Makefile.install Loading commit data...
Makefile.versions Loading commit data...
README.md Loading commit data...