From ed6067b73d7bdd92b38afa628254600febd44113 Mon Sep 17 00:00:00 2001 From: Hajime Tazaki Date: Wed, 11 Dec 2024 15:23:06 +0900 Subject: [PATCH] fix sigreturn etc --- arch/um/kernel/signal.c | 3 +++ arch/x86/um/nommu/entry_64.S | 12 ++++++++++++ arch/x86/um/nommu/os-Linux/mcontext.c | 2 ++ arch/x86/um/nommu/signal.c | 4 ++++ 4 files changed, 21 insertions(+) diff --git a/arch/um/kernel/signal.c b/arch/um/kernel/signal.c index a56b44522766fe..74cb02e76a8468 100644 --- a/arch/um/kernel/signal.c +++ b/arch/um/kernel/signal.c @@ -97,6 +97,9 @@ void do_signal(struct pt_regs *regs) struct ksignal ksig; int handled_sig = 0; + if (regs->regs.gp[15] == 58) + return; + while (get_signal(&ksig)) { handled_sig = 1; /* Whee! Actually deliver the signal. */ diff --git a/arch/x86/um/nommu/entry_64.S b/arch/x86/um/nommu/entry_64.S index cb0642172e0084..e10df55af3c955 100644 --- a/arch/x86/um/nommu/entry_64.S +++ b/arch/x86/um/nommu/entry_64.S @@ -76,6 +76,9 @@ ENTRY(__kernel_vsyscall) POP_REGS + cmpq $15, (%rsp) + je sigret + addq $8, %rsp /* skip orig_ax */ addq $8, %rsp /* skip ip */ addq $8, %rsp /* skip cs */ @@ -83,6 +86,15 @@ ENTRY(__kernel_vsyscall) popq %rsp ret +sigret: + addq $8, %rsp /* skip orig_ax */ + popq %r11 /* ip */ + addq $8, %rsp /* skip cs */ + addq $8, %rsp /* skip flags */ + popq %rsp + //jmpq *%r11 + pushq %r11 + ret END(__kernel_vsyscall) diff --git a/arch/x86/um/nommu/os-Linux/mcontext.c b/arch/x86/um/nommu/os-Linux/mcontext.c index 2d5148848f88db..85f4f66ec564c9 100644 --- a/arch/x86/um/nommu/os-Linux/mcontext.c +++ b/arch/x86/um/nommu/os-Linux/mcontext.c @@ -6,10 +6,12 @@ #include #include +extern void userspace(struct uml_pt_regs *regs); static void userspace_sigreturn(void) { __asm__ volatile("movq $15, %rax"); __asm__ volatile("call *%0" : : "r"(__kernel_vsyscall) :); +// __asm__ volatile("call *%0" : : "r"(userspace) :); } void mc_set_regs_ip_relay(mcontext_t *mc) diff --git a/arch/x86/um/nommu/signal.c b/arch/x86/um/nommu/signal.c index a94e9b86273afe..b661a5981661a5 100644 --- a/arch/x86/um/nommu/signal.c +++ b/arch/x86/um/nommu/signal.c @@ -11,6 +11,10 @@ int arch_setup_signal_stack_si(struct rt_sigframe __user **frame, { int err = 0; + if (sigismember(&ksig->ka.sa.sa_mask, ksig->sig)) { + pr_warn("signal masked"); + return 0; + } /* * we need to push handler address at top of stack, as * __kernel_vsyscall, called after this returns with ret with