From nobody Tue Feb 10 02:00:54 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525081174890653.015473597605; Mon, 30 Apr 2018 02:39:34 -0700 (PDT) Received: from localhost ([::1]:58693 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fD5HS-00057T-2r for importer@patchew.org; Mon, 30 Apr 2018 05:39:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33426) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fD4qa-0006r3-J3 for qemu-devel@nongnu.org; Mon, 30 Apr 2018 05:11:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fD4qR-0006c2-Lo for qemu-devel@nongnu.org; Mon, 30 Apr 2018 05:11:48 -0400 Received: from mout.kundenserver.de ([217.72.192.75]:45177) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fD4qD-0006O7-KT; Mon, 30 Apr 2018 05:11:26 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MeSdD-1f0bb11NfT-00QFN5; Mon, 30 Apr 2018 11:11:00 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Mon, 30 Apr 2018 11:10:09 +0200 Message-Id: <20180430091037.13878-15-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180430091037.13878-1-laurent@vivier.eu> References: <20180430091037.13878-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:ohia0v3G6JpAKuKCMA4M8RmlqNvLUJrMIO//G5NPJfy/xcSUER5 yiRegSL29unn9hLY2dnGHWhlRVcTx3I5AL4bxzSqnCKixrxBCppmYk2DnnvCGz0A61adjzZ NqqzhNTbDYLSdRqZ4cKXvNLvaOjMOUR/8g5ywxs0/4gyhSMmtInmbCt7TPAr1YeyiJVccW1 p8skZmnBxhJrSgsXKb63w== X-UI-Out-Filterresults: notjunk:1;V01:K0:9vgZzCJHdy0=:ywLO8hvOyqy8yMs45zp2Ej FQeT/nVRKr5nWMiVDQ1k21gk591g2iGxbfDnLdbGiO/d7H0dcgd+c3Kb5jr5+9xcSJMYGv8Wi MiLHqkg8zz7TsOm02oB4a+dOpDS4KgzarxbOlMXir14TZvVPT66vi3wg1N4yPdjt6kXEJFEdW 9o4+lFIT3MhqTZY4m7E1ZjhTgquBZ5haFM+iaekN70yr4OmH0DN1HNkz0+PPEjWIKRjuaKz/a AezS056v2feM+GsjgW2M/i50fb1yTZp0wxOpH+JUUc2MYMbzmPhJfX/BpnB3CzsXQaYPNhomm FMR7mhe0dq8QCSyu/V6+R5REkLijW6gw1GklmyQvTjGrjs8igpmpK9b5zi1w4QfO2uJgiqwRA u6XewEtSiGhHs9dsKlsdHGllPOM9b72VEXdwwZ+eOKAqpMTMMEccH1RuJ3IP8n9hgrKY08Ae9 BPBOjJRTETp2af+q6h8UYvw2KZPkPwJ8NvV92eHtTOvsNxN3x/OlY489ATjmUDGsKT1T0o6p+ 4zBbo4GFTFegrxaoITlTvVMGly+kc9VzDeEWINL4XxA8ISjoqr5VLEN7aWDtUg3OkY9Fknacq 6Z6YBokbqQuLJtmB4kg9CFyUEjeYATOcrFYF9ezNjta1yW2oY+j/XXGtCXa0jve6XL3hjpqZV 3sKvTg+Uo/pYUT7Pgsa7eJ9OzgIjHYvBokNJY/0bwO83vyvpnHzPXhLimhCgVFD4AbSjMw2NK L8ygXMmto7cvCJC3 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.75 Subject: [Qemu-devel] [PULL 14/42] linux-user: move tilegx signal.c parts to tilegx directory X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-s390x@nongnu.org, Riku Voipio , Laurent Vivier , Cornelia Huck Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 No code change, only move code from signal.c to tilegx/signal.c, except adding includes and exporting setup_rt_frame(). Signed-off-by: Laurent Vivier Reviewed-by: Alex Benn=C3=A9e Reviewed-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20180424192635.6027-13-laurent@vivier.eu> --- linux-user/signal.c | 165 ----------------------------------= --- linux-user/tilegx/signal.c | 168 ++++++++++++++++++++++++++++++++++= ++++ linux-user/tilegx/target_signal.h | 4 +- 3 files changed, 171 insertions(+), 166 deletions(-) diff --git a/linux-user/signal.c b/linux-user/signal.c index 7c2a963e7c..5a3e5bff5e 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -3032,171 +3032,6 @@ sigsegv: return -TARGET_QEMU_ESIGRETURN; } =20 -#elif defined(TARGET_TILEGX) - -struct target_sigcontext { - union { - /* General-purpose registers. */ - abi_ulong gregs[56]; - struct { - abi_ulong __gregs[53]; - abi_ulong tp; /* Aliases gregs[TREG_TP]. */ - abi_ulong sp; /* Aliases gregs[TREG_SP]. */ - abi_ulong lr; /* Aliases gregs[TREG_LR]. */ - }; - }; - abi_ulong pc; /* Program counter. */ - abi_ulong ics; /* In Interrupt Critical Section? */ - abi_ulong faultnum; /* Fault number. */ - abi_ulong pad[5]; -}; - -struct target_ucontext { - abi_ulong tuc_flags; - abi_ulong tuc_link; - target_stack_t tuc_stack; - struct target_sigcontext tuc_mcontext; - target_sigset_t tuc_sigmask; /* mask last for extensibility */ -}; - -struct target_rt_sigframe { - unsigned char save_area[16]; /* caller save area */ - struct target_siginfo info; - struct target_ucontext uc; - abi_ulong retcode[2]; -}; - -#define INSN_MOVELI_R10_139 0x00045fe551483000ULL /* { moveli r10, 139 } = */ -#define INSN_SWINT1 0x286b180051485000ULL /* { swint1 } */ - - -static void setup_sigcontext(struct target_sigcontext *sc, - CPUArchState *env, int signo) -{ - int i; - - for (i =3D 0; i < TILEGX_R_COUNT; ++i) { - __put_user(env->regs[i], &sc->gregs[i]); - } - - __put_user(env->pc, &sc->pc); - __put_user(0, &sc->ics); - __put_user(signo, &sc->faultnum); -} - -static void restore_sigcontext(CPUTLGState *env, struct target_sigcontext = *sc) -{ - int i; - - for (i =3D 0; i < TILEGX_R_COUNT; ++i) { - __get_user(env->regs[i], &sc->gregs[i]); - } - - __get_user(env->pc, &sc->pc); -} - -static abi_ulong get_sigframe(struct target_sigaction *ka, CPUArchState *e= nv, - size_t frame_size) -{ - unsigned long sp =3D env->regs[TILEGX_R_SP]; - - if (on_sig_stack(sp) && !likely(on_sig_stack(sp - frame_size))) { - return -1UL; - } - - if ((ka->sa_flags & SA_ONSTACK) && !sas_ss_flags(sp)) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } - - sp -=3D frame_size; - sp &=3D -16UL; - return sp; -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUArchState *env) -{ - abi_ulong frame_addr; - struct target_rt_sigframe *frame; - unsigned long restorer; - - frame_addr =3D get_sigframe(ka, env, sizeof(*frame)); - trace_user_setup_rt_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { - goto give_sigsegv; - } - - /* Always write at least the signal number for the stack backtracer. */ - if (ka->sa_flags & TARGET_SA_SIGINFO) { - /* At sigreturn time, restore the callee-save registers too. */ - tswap_siginfo(&frame->info, info); - /* regs->flags |=3D PT_FLAGS_RESTORE_REGS; FIXME: we can skip it? = */ - } else { - __put_user(info->si_signo, &frame->info.si_signo); - } - - /* Create the ucontext. */ - __put_user(0, &frame->uc.tuc_flags); - __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->regs[TILEGX_R_SP]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_si= ze); - setup_sigcontext(&frame->uc.tuc_mcontext, env, info->si_signo); - - if (ka->sa_flags & TARGET_SA_RESTORER) { - restorer =3D (unsigned long) ka->sa_restorer; - } else { - __put_user(INSN_MOVELI_R10_139, &frame->retcode[0]); - __put_user(INSN_SWINT1, &frame->retcode[1]); - restorer =3D frame_addr + offsetof(struct target_rt_sigframe, retc= ode); - } - env->pc =3D (unsigned long) ka->_sa_handler; - env->regs[TILEGX_R_SP] =3D (unsigned long) frame; - env->regs[TILEGX_R_LR] =3D restorer; - env->regs[0] =3D (unsigned long) sig; - env->regs[1] =3D (unsigned long) &frame->info; - env->regs[2] =3D (unsigned long) &frame->uc; - /* regs->flags |=3D PT_FLAGS_CALLER_SAVES; FIXME: we can skip it? */ - - unlock_user_struct(frame, frame_addr, 1); - return; - -give_sigsegv: - force_sigsegv(sig); -} - -long do_rt_sigreturn(CPUTLGState *env) -{ - abi_ulong frame_addr =3D env->regs[TILEGX_R_SP]; - struct target_rt_sigframe *frame; - sigset_t set; - - trace_user_do_rt_sigreturn(env, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) { - goto badframe; - } - target_to_host_sigset(&set, &frame->uc.tuc_sigmask); - set_sigmask(&set); - - restore_sigcontext(env, &frame->uc.tuc_mcontext); - if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe, - uc.tuc_stack), - 0, env->regs[TILEGX_R_SP]) =3D=3D -EFAULT) { - goto badframe; - } - - unlock_user_struct(frame, frame_addr, 0); - return -TARGET_QEMU_ESIGRETURN; - - - badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV); - return -TARGET_QEMU_ESIGRETURN; -} - #elif defined(TARGET_RISCV) =20 /* Signal handler invocation must be transparent for the code being diff --git a/linux-user/tilegx/signal.c b/linux-user/tilegx/signal.c index 02ca338b6c..8f54f54f95 100644 --- a/linux-user/tilegx/signal.c +++ b/linux-user/tilegx/signal.c @@ -16,3 +16,171 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ +#include "qemu/osdep.h" +#include "qemu.h" +#include "target_signal.h" +#include "signal-common.h" +#include "linux-user/trace.h" + +struct target_sigcontext { + union { + /* General-purpose registers. */ + abi_ulong gregs[56]; + struct { + abi_ulong __gregs[53]; + abi_ulong tp; /* Aliases gregs[TREG_TP]. */ + abi_ulong sp; /* Aliases gregs[TREG_SP]. */ + abi_ulong lr; /* Aliases gregs[TREG_LR]. */ + }; + }; + abi_ulong pc; /* Program counter. */ + abi_ulong ics; /* In Interrupt Critical Section? */ + abi_ulong faultnum; /* Fault number. */ + abi_ulong pad[5]; +}; + +struct target_ucontext { + abi_ulong tuc_flags; + abi_ulong tuc_link; + target_stack_t tuc_stack; + struct target_sigcontext tuc_mcontext; + target_sigset_t tuc_sigmask; /* mask last for extensibility */ +}; + +struct target_rt_sigframe { + unsigned char save_area[16]; /* caller save area */ + struct target_siginfo info; + struct target_ucontext uc; + abi_ulong retcode[2]; +}; + +#define INSN_MOVELI_R10_139 0x00045fe551483000ULL /* { moveli r10, 139 } = */ +#define INSN_SWINT1 0x286b180051485000ULL /* { swint1 } */ + + +static void setup_sigcontext(struct target_sigcontext *sc, + CPUArchState *env, int signo) +{ + int i; + + for (i =3D 0; i < TILEGX_R_COUNT; ++i) { + __put_user(env->regs[i], &sc->gregs[i]); + } + + __put_user(env->pc, &sc->pc); + __put_user(0, &sc->ics); + __put_user(signo, &sc->faultnum); +} + +static void restore_sigcontext(CPUTLGState *env, struct target_sigcontext = *sc) +{ + int i; + + for (i =3D 0; i < TILEGX_R_COUNT; ++i) { + __get_user(env->regs[i], &sc->gregs[i]); + } + + __get_user(env->pc, &sc->pc); +} + +static abi_ulong get_sigframe(struct target_sigaction *ka, CPUArchState *e= nv, + size_t frame_size) +{ + unsigned long sp =3D env->regs[TILEGX_R_SP]; + + if (on_sig_stack(sp) && !likely(on_sig_stack(sp - frame_size))) { + return -1UL; + } + + if ((ka->sa_flags & SA_ONSTACK) && !sas_ss_flags(sp)) { + sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; + } + + sp -=3D frame_size; + sp &=3D -16UL; + return sp; +} + +void setup_rt_frame(int sig, struct target_sigaction *ka, + target_siginfo_t *info, + target_sigset_t *set, CPUArchState *env) +{ + abi_ulong frame_addr; + struct target_rt_sigframe *frame; + unsigned long restorer; + + frame_addr =3D get_sigframe(ka, env, sizeof(*frame)); + trace_user_setup_rt_frame(env, frame_addr); + if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { + goto give_sigsegv; + } + + /* Always write at least the signal number for the stack backtracer. */ + if (ka->sa_flags & TARGET_SA_SIGINFO) { + /* At sigreturn time, restore the callee-save registers too. */ + tswap_siginfo(&frame->info, info); + /* regs->flags |=3D PT_FLAGS_RESTORE_REGS; FIXME: we can skip it? = */ + } else { + __put_user(info->si_signo, &frame->info.si_signo); + } + + /* Create the ucontext. */ + __put_user(0, &frame->uc.tuc_flags); + __put_user(0, &frame->uc.tuc_link); + __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); + __put_user(sas_ss_flags(env->regs[TILEGX_R_SP]), + &frame->uc.tuc_stack.ss_flags); + __put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_si= ze); + setup_sigcontext(&frame->uc.tuc_mcontext, env, info->si_signo); + + if (ka->sa_flags & TARGET_SA_RESTORER) { + restorer =3D (unsigned long) ka->sa_restorer; + } else { + __put_user(INSN_MOVELI_R10_139, &frame->retcode[0]); + __put_user(INSN_SWINT1, &frame->retcode[1]); + restorer =3D frame_addr + offsetof(struct target_rt_sigframe, retc= ode); + } + env->pc =3D (unsigned long) ka->_sa_handler; + env->regs[TILEGX_R_SP] =3D (unsigned long) frame; + env->regs[TILEGX_R_LR] =3D restorer; + env->regs[0] =3D (unsigned long) sig; + env->regs[1] =3D (unsigned long) &frame->info; + env->regs[2] =3D (unsigned long) &frame->uc; + /* regs->flags |=3D PT_FLAGS_CALLER_SAVES; FIXME: we can skip it? */ + + unlock_user_struct(frame, frame_addr, 1); + return; + +give_sigsegv: + force_sigsegv(sig); +} + +long do_rt_sigreturn(CPUTLGState *env) +{ + abi_ulong frame_addr =3D env->regs[TILEGX_R_SP]; + struct target_rt_sigframe *frame; + sigset_t set; + + trace_user_do_rt_sigreturn(env, frame_addr); + if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) { + goto badframe; + } + target_to_host_sigset(&set, &frame->uc.tuc_sigmask); + set_sigmask(&set); + + restore_sigcontext(env, &frame->uc.tuc_mcontext); + if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe, + uc.tuc_stack), + 0, env->regs[TILEGX_R_SP]) =3D=3D -EFAULT) { + goto badframe; + } + + unlock_user_struct(frame, frame_addr, 0); + return -TARGET_QEMU_ESIGRETURN; + + + badframe: + unlock_user_struct(frame, frame_addr, 0); + force_sig(TARGET_SIGSEGV); + return -TARGET_QEMU_ESIGRETURN; +} diff --git a/linux-user/tilegx/target_signal.h b/linux-user/tilegx/target_s= ignal.h index f64551a8cf..132d7781fe 100644 --- a/linux-user/tilegx/target_signal.h +++ b/linux-user/tilegx/target_signal.h @@ -25,5 +25,7 @@ static inline abi_ulong get_sp_from_cpustate(CPUTLGState = *state) return state->regs[TILEGX_R_SP]; } =20 - +void setup_rt_frame(int sig, struct target_sigaction *ka, + target_siginfo_t *info, + target_sigset_t *set, CPUArchState *env); #endif /* TILEGX_TARGET_SIGNAL_H */ --=20 2.14.3