diff --git a/arch/x86/um/nommu/entry_64.S b/arch/x86/um/nommu/entry_64.S index cb0642172e0084..caca024b22f29c 100644 --- a/arch/x86/um/nommu/entry_64.S +++ b/arch/x86/um/nommu/entry_64.S @@ -77,19 +77,20 @@ ENTRY(__kernel_vsyscall) POP_REGS addq $8, %rsp /* skip orig_ax */ - addq $8, %rsp /* skip ip */ + popq %rcx /* pt_regs->ip */ addq $8, %rsp /* skip cs */ addq $8, %rsp /* skip flags */ popq %rsp - ret + //popq %rcx + jmp %rcx END(__kernel_vsyscall) // void userspace(struct uml_pt_regs *regs) ENTRY(userspace) /* fixup stack for vfork syscall*/ - call arch_fixup_stack + //call arch_fixup_stack /* align the stack for x86_64 ABI */ and $-0x10, %rsp diff --git a/arch/x86/um/nommu/os-Linux/mcontext.c b/arch/x86/um/nommu/os-Linux/mcontext.c index 2d5148848f88db..5afe5b26bfab08 100644 --- a/arch/x86/um/nommu/os-Linux/mcontext.c +++ b/arch/x86/um/nommu/os-Linux/mcontext.c @@ -8,8 +8,9 @@ static void userspace_sigreturn(void) { - __asm__ volatile("movq $15, %rax"); - __asm__ volatile("call *%0" : : "r"(__kernel_vsyscall) :); + /* XXX: dummy syscall */ + //__asm__ volatile("movq $15, %rax"); + __asm__ volatile("call *%0" : : "r"(__kernel_vsyscall), "a"(39) :); } void mc_set_regs_ip_relay(mcontext_t *mc) @@ -19,8 +20,8 @@ void mc_set_regs_ip_relay(mcontext_t *mc) void mc_set_sigsys_hook(mcontext_t *mc) { - mc->gregs[REG_RSP] -= sizeof(unsigned long); - *((unsigned long *) (mc->gregs[REG_RSP])) = mc->gregs[REG_RIP]; + //mc->gregs[REG_RSP] -= sizeof(unsigned long); + //*((unsigned long *) (mc->gregs[REG_RSP])) = mc->gregs[REG_RIP]; mc->gregs[REG_RCX] = mc->gregs[REG_RIP]; mc->gregs[REG_RIP] = (unsigned long) __kernel_vsyscall; } diff --git a/arch/x86/um/nommu/signal.c b/arch/x86/um/nommu/signal.c index a94e9b86273afe..f509657ff04dfd 100644 --- a/arch/x86/um/nommu/signal.c +++ b/arch/x86/um/nommu/signal.c @@ -6,10 +6,17 @@ #include +/* XXX: this makes pthread_cancel, cancel_handler loops endlessly.... +if this skips, cancel works + */ +/* XXX: without this doesn't work with SIGSEGV */ int arch_setup_signal_stack_si(struct rt_sigframe __user **frame, struct ksignal *ksig) { int err = 0; + return 0; + if (ksig->sig != SIGSEGV) + return 0; /* * we need to push handler address at top of stack, as diff --git a/arch/x86/um/nommu/zpoline.c b/arch/x86/um/nommu/zpoline.c index 2e30ee7193625e..64b9dec1a80192 100644 --- a/arch/x86/um/nommu/zpoline.c +++ b/arch/x86/um/nommu/zpoline.c @@ -209,11 +209,8 @@ static int __init setup_zpoline_trampoline(void) * pretending to be syscall instruction by putting return * address in %rcx. */ - /* 48 8b 0c 24 mov (%rsp),%rcx */ - __zpoline_start[ptr++] = 0x48; - __zpoline_start[ptr++] = 0x8b; - __zpoline_start[ptr++] = 0x0c; - __zpoline_start[ptr++] = 0x24; + /* 59 pop %rcx */ + __zpoline_start[ptr++] = 0x59; /* 41 ff e3 jmp *%r11 */ __zpoline_start[ptr++] = 0x41; diff --git a/arch/x86/um/signal.c b/arch/x86/um/signal.c index 8d4cf7cc7c2919..4f3d6834034e92 100644 --- a/arch/x86/um/signal.c +++ b/arch/x86/um/signal.c @@ -427,7 +427,7 @@ int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig, return err; /* fixup rt_sigframe for nommu */ - err |= arch_setup_signal_stack_si(&frame, ksig); + //err |= arch_setup_signal_stack_si(&frame, ksig); if (err) return err; @@ -457,7 +457,7 @@ SYSCALL_DEFINE0(rt_sigreturn) sigset_t set; /* fixup rt_sigframe for nommu */ - frame = arch_setup_rt_sigreturn(frame); + //frame = arch_setup_rt_sigreturn(frame); uc = &frame->uc; if (copy_from_user(&set, &uc->uc_sigmask, sizeof(set)))