From nobody Wed Feb 11 08:39:56 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 1521846054773714.6865887407141; Fri, 23 Mar 2018 16:00:54 -0700 (PDT) Received: from localhost ([::1]:40160 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ezVg5-0006o5-Q4 for importer@patchew.org; Fri, 23 Mar 2018 19:00:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45635) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ezVdr-00057z-OU for qemu-devel@nongnu.org; Fri, 23 Mar 2018 18:58:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ezVdn-0000ru-67 for qemu-devel@nongnu.org; Fri, 23 Mar 2018 18:58:35 -0400 Received: from mout.kundenserver.de ([212.227.17.13]:55373) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ezVde-0000iT-Ch; Fri, 23 Mar 2018 18:58:22 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue103 [212.227.15.183]) with ESMTPSA (Nemesis) id 0Lxd6Z-1eXAzq0BBb-017IJY; Fri, 23 Mar 2018 23:58:09 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 23 Mar 2018 23:57:33 +0100 Message-Id: <20180323225739.17329-15-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180323225739.17329-1-laurent@vivier.eu> References: <20180323225739.17329-1-laurent@vivier.eu> X-Provags-ID: V03:K0:9dAR29dx1sQwWIfyOx/5+i//DO/UZX+t0HExgcyhDCPbETvXsts Bp9GfRyl1ckqPZiPMXlRqu1KjyXnPQRea4JvGP0fFIUp8aAmuMRxBjWLYuUEsS2jWK7tnFn 0Ri5qy+PyiGWKhMA4pytZU9CeB961jrZiHVpc6OILAPlmcM7EDunuljzA0xVDd1Hih4YV+F pCjE/aeBaEbJw/InkJv9A== X-UI-Out-Filterresults: notjunk:1;V01:K0:KhOtYK7CW9Y=:5pbdJOGk6jnrdJvTUly+4q i1mMeNm5L8AFYLrQBgQqYAR/MWK7eqf/lPxa2zMhO9sQB11g1u/97PhyVZXZVUhSDEzlTDkqq 2Ocr4sg2ApTQgGiePWDu61K6fNeKR9GSuOPOCbpA9Au3ElS6eZlKoFCTsM7EmZ28thXDS0p4E oSnOfD5NdSOSNd+rky9BiB3APA8FYFi0wPF2POslCX97qYy8kFLPSPIQpXY341zW31YHGRkVr pWq7OCVicMtq7foPMrgCLuWNhVAUvmqxfX6ymbtqhiMMlqZuGXQj3UoJomGu+0QBMkila5oAU vKA40M7svLuJ2m1ifyDz1e2DcoE+ZOaIg/MAkcML4ytTTM0F4s0HM+OhglE80NgvfrijOa+jD WZGaguSzi8irnoUDDOCMYL/TUQgiIyfSSAnn4xVOzp+eJS7WNPsGFLsJyseW1CKw5hckPXwBX c4fNumrT9oO2mql3KDlcYVVZv9HsJRl3zCPfPW4NcUnQH1zXEP+GzRPH1eijFcGnZmaqIpx+E jIcyIRSd8inHoMi9BfCJp+px16oEnGSmimM7BoORdzttmTEw8icGWPu08x9AbMoq9N5SJwtoZ qRxyrjJsrIepMl6ZlqTe2Qx4GNOV6bcMjuKUMRpkN8pOQjaPG6Ujd/nmcw1xX030k4l8z3xfa lSeSnIE59Sk96q349RCrGogrttDzP5Yxqh0Mf1ILsqDH0sKsbgb5ExL4VY+xqIo4x4iSswg4v k1kFa+aDOtJu7uAJSrWffX/MCa0M8PB/txQA/Q== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.13 Subject: [Qemu-devel] [PATCH for 2.13 v2 14/20] linux-user: move hppa signal.c parts to hppa 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: Peter Maydell , Cornelia Huck , Riku Voipio , Laurent Vivier , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-s390x@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" No code change, only move code from signal.c to hppa/signal.c, except adding includes and exporting setup_rt_frame(). Signed-off-by: Laurent Vivier Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- linux-user/hppa/signal.c | 192 ++++++++++++++++++++++++++++++++++++= ++++ linux-user/hppa/target_signal.h | 3 + linux-user/signal.c | 189 ------------------------------------= --- 3 files changed, 195 insertions(+), 189 deletions(-) diff --git a/linux-user/hppa/signal.c b/linux-user/hppa/signal.c index 02ca338b6c..585af3a37f 100644 --- a/linux-user/hppa/signal.c +++ b/linux-user/hppa/signal.c @@ -16,3 +16,195 @@ * 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 { + abi_ulong sc_flags; + abi_ulong sc_gr[32]; + uint64_t sc_fr[32]; + abi_ulong sc_iasq[2]; + abi_ulong sc_iaoq[2]; + abi_ulong sc_sar; +}; + +struct target_ucontext { + abi_uint tuc_flags; + abi_ulong tuc_link; + target_stack_t tuc_stack; + abi_uint pad[1]; + struct target_sigcontext tuc_mcontext; + target_sigset_t tuc_sigmask; +}; + +struct target_rt_sigframe { + abi_uint tramp[9]; + target_siginfo_t info; + struct target_ucontext uc; + /* hidden location of upper halves of pa2.0 64-bit gregs */ +}; + +static void setup_sigcontext(struct target_sigcontext *sc, CPUArchState *e= nv) +{ + int flags =3D 0; + int i; + + /* ??? if on_sig_stack, flags |=3D 1 (PARISC_SC_FLAG_ONSTACK). */ + + if (env->iaoq_f < TARGET_PAGE_SIZE) { + /* In the gateway page, executing a syscall. */ + flags |=3D 2; /* PARISC_SC_FLAG_IN_SYSCALL */ + __put_user(env->gr[31], &sc->sc_iaoq[0]); + __put_user(env->gr[31] + 4, &sc->sc_iaoq[1]); + } else { + __put_user(env->iaoq_f, &sc->sc_iaoq[0]); + __put_user(env->iaoq_b, &sc->sc_iaoq[1]); + } + __put_user(0, &sc->sc_iasq[0]); + __put_user(0, &sc->sc_iasq[1]); + __put_user(flags, &sc->sc_flags); + + __put_user(cpu_hppa_get_psw(env), &sc->sc_gr[0]); + for (i =3D 1; i < 32; ++i) { + __put_user(env->gr[i], &sc->sc_gr[i]); + } + + __put_user((uint64_t)env->fr0_shadow << 32, &sc->sc_fr[0]); + for (i =3D 1; i < 32; ++i) { + __put_user(env->fr[i], &sc->sc_fr[i]); + } + + __put_user(env->cr[CR_SAR], &sc->sc_sar); +} + +static void restore_sigcontext(CPUArchState *env, struct target_sigcontext= *sc) +{ + target_ulong psw; + int i; + + __get_user(psw, &sc->sc_gr[0]); + cpu_hppa_put_psw(env, psw); + + for (i =3D 1; i < 32; ++i) { + __get_user(env->gr[i], &sc->sc_gr[i]); + } + for (i =3D 0; i < 32; ++i) { + __get_user(env->fr[i], &sc->sc_fr[i]); + } + cpu_hppa_loaded_fr0(env); + + __get_user(env->iaoq_f, &sc->sc_iaoq[0]); + __get_user(env->iaoq_b, &sc->sc_iaoq[1]); + __get_user(env->cr[CR_SAR], &sc->sc_sar); +} + +/* No, this doesn't look right, but it's copied straight from the kernel. = */ +#define PARISC_RT_SIGFRAME_SIZE32 \ + ((sizeof(struct target_rt_sigframe) + 48 + 64) & -64) + +void setup_rt_frame(int sig, struct target_sigaction *ka, + target_siginfo_t *info, + target_sigset_t *set, CPUArchState *env) +{ + abi_ulong frame_addr, sp, haddr; + struct target_rt_sigframe *frame; + int i; + + sp =3D env->gr[30]; + if (ka->sa_flags & TARGET_SA_ONSTACK) { + if (sas_ss_flags(sp) =3D=3D 0) { + sp =3D (target_sigaltstack_used.ss_sp + 0x7f) & ~0x3f; + } + } + frame_addr =3D QEMU_ALIGN_UP(sp, 64); + sp =3D frame_addr + PARISC_RT_SIGFRAME_SIZE32; + + trace_user_setup_rt_frame(env, frame_addr); + + if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { + goto give_sigsegv; + } + + tswap_siginfo(&frame->info, info); + frame->uc.tuc_flags =3D 0; + frame->uc.tuc_link =3D 0; + + __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); + __put_user(sas_ss_flags(get_sp_from_cpustate(env)), + &frame->uc.tuc_stack.ss_flags); + __put_user(target_sigaltstack_used.ss_size, + &frame->uc.tuc_stack.ss_size); + + for (i =3D 0; i < TARGET_NSIG_WORDS; i++) { + __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); + } + + setup_sigcontext(&frame->uc.tuc_mcontext, env); + + __put_user(0x34190000, frame->tramp + 0); /* ldi 0,%r25 */ + __put_user(0x3414015a, frame->tramp + 1); /* ldi __NR_rt_sigreturn,%r2= 0 */ + __put_user(0xe4008200, frame->tramp + 2); /* be,l 0x100(%sr2,%r0) */ + __put_user(0x08000240, frame->tramp + 3); /* nop */ + + unlock_user_struct(frame, frame_addr, 1); + + env->gr[2] =3D h2g(frame->tramp); + env->gr[30] =3D sp; + env->gr[26] =3D sig; + env->gr[25] =3D h2g(&frame->info); + env->gr[24] =3D h2g(&frame->uc); + + haddr =3D ka->_sa_handler; + if (haddr & 2) { + /* Function descriptor. */ + target_ulong *fdesc, dest; + + haddr &=3D -4; + if (!lock_user_struct(VERIFY_READ, fdesc, haddr, 1)) { + goto give_sigsegv; + } + __get_user(dest, fdesc); + __get_user(env->gr[19], fdesc + 1); + unlock_user_struct(fdesc, haddr, 1); + haddr =3D dest; + } + env->iaoq_f =3D haddr; + env->iaoq_b =3D haddr + 4; + return; + + give_sigsegv: + force_sigsegv(sig); +} + +long do_rt_sigreturn(CPUArchState *env) +{ + abi_ulong frame_addr =3D env->gr[30] - PARISC_RT_SIGFRAME_SIZE32; + 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); + unlock_user_struct(frame, frame_addr, 0); + + if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe, + uc.tuc_stack), + 0, env->gr[30]) =3D=3D -EFAULT) { + goto badframe; + } + + unlock_user_struct(frame, frame_addr, 0); + return -TARGET_QEMU_ESIGRETURN; + + badframe: + force_sig(TARGET_SIGSEGV); + return -TARGET_QEMU_ESIGRETURN; +} diff --git a/linux-user/hppa/target_signal.h b/linux-user/hppa/target_signa= l.h index e115890b48..f19aed93dd 100644 --- a/linux-user/hppa/target_signal.h +++ b/linux-user/hppa/target_signal.h @@ -26,4 +26,7 @@ static inline abi_ulong get_sp_from_cpustate(CPUHPPAState= *state) return state->gr[30]; } =20 +void setup_rt_frame(int sig, struct target_sigaction *ka, + target_siginfo_t *info, + target_sigset_t *set, CPUArchState *env); #endif /* HPPA_TARGET_SIGNAL_H */ diff --git a/linux-user/signal.c b/linux-user/signal.c index cc5b7d1456..fc81ec87b6 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -3032,195 +3032,6 @@ sigsegv: return -TARGET_QEMU_ESIGRETURN; } =20 -#elif defined(TARGET_HPPA) - -struct target_sigcontext { - abi_ulong sc_flags; - abi_ulong sc_gr[32]; - uint64_t sc_fr[32]; - abi_ulong sc_iasq[2]; - abi_ulong sc_iaoq[2]; - abi_ulong sc_sar; -}; - -struct target_ucontext { - abi_uint tuc_flags; - abi_ulong tuc_link; - target_stack_t tuc_stack; - abi_uint pad[1]; - struct target_sigcontext tuc_mcontext; - target_sigset_t tuc_sigmask; -}; - -struct target_rt_sigframe { - abi_uint tramp[9]; - target_siginfo_t info; - struct target_ucontext uc; - /* hidden location of upper halves of pa2.0 64-bit gregs */ -}; - -static void setup_sigcontext(struct target_sigcontext *sc, CPUArchState *e= nv) -{ - int flags =3D 0; - int i; - - /* ??? if on_sig_stack, flags |=3D 1 (PARISC_SC_FLAG_ONSTACK). */ - - if (env->iaoq_f < TARGET_PAGE_SIZE) { - /* In the gateway page, executing a syscall. */ - flags |=3D 2; /* PARISC_SC_FLAG_IN_SYSCALL */ - __put_user(env->gr[31], &sc->sc_iaoq[0]); - __put_user(env->gr[31] + 4, &sc->sc_iaoq[1]); - } else { - __put_user(env->iaoq_f, &sc->sc_iaoq[0]); - __put_user(env->iaoq_b, &sc->sc_iaoq[1]); - } - __put_user(0, &sc->sc_iasq[0]); - __put_user(0, &sc->sc_iasq[1]); - __put_user(flags, &sc->sc_flags); - - __put_user(cpu_hppa_get_psw(env), &sc->sc_gr[0]); - for (i =3D 1; i < 32; ++i) { - __put_user(env->gr[i], &sc->sc_gr[i]); - } - - __put_user((uint64_t)env->fr0_shadow << 32, &sc->sc_fr[0]); - for (i =3D 1; i < 32; ++i) { - __put_user(env->fr[i], &sc->sc_fr[i]); - } - - __put_user(env->cr[CR_SAR], &sc->sc_sar); -} - -static void restore_sigcontext(CPUArchState *env, struct target_sigcontext= *sc) -{ - target_ulong psw; - int i; - - __get_user(psw, &sc->sc_gr[0]); - cpu_hppa_put_psw(env, psw); - - for (i =3D 1; i < 32; ++i) { - __get_user(env->gr[i], &sc->sc_gr[i]); - } - for (i =3D 0; i < 32; ++i) { - __get_user(env->fr[i], &sc->sc_fr[i]); - } - cpu_hppa_loaded_fr0(env); - - __get_user(env->iaoq_f, &sc->sc_iaoq[0]); - __get_user(env->iaoq_b, &sc->sc_iaoq[1]); - __get_user(env->cr[CR_SAR], &sc->sc_sar); -} - -/* No, this doesn't look right, but it's copied straight from the kernel. = */ -#define PARISC_RT_SIGFRAME_SIZE32 \ - ((sizeof(struct target_rt_sigframe) + 48 + 64) & -64) - -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, sp, haddr; - struct target_rt_sigframe *frame; - int i; - - sp =3D env->gr[30]; - if (ka->sa_flags & TARGET_SA_ONSTACK) { - if (sas_ss_flags(sp) =3D=3D 0) { - sp =3D (target_sigaltstack_used.ss_sp + 0x7f) & ~0x3f; - } - } - frame_addr =3D QEMU_ALIGN_UP(sp, 64); - sp =3D frame_addr + PARISC_RT_SIGFRAME_SIZE32; - - trace_user_setup_rt_frame(env, frame_addr); - - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { - goto give_sigsegv; - } - - tswap_siginfo(&frame->info, info); - frame->uc.tuc_flags =3D 0; - frame->uc.tuc_link =3D 0; - - __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); - - for (i =3D 0; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); - } - - setup_sigcontext(&frame->uc.tuc_mcontext, env); - - __put_user(0x34190000, frame->tramp + 0); /* ldi 0,%r25 */ - __put_user(0x3414015a, frame->tramp + 1); /* ldi __NR_rt_sigreturn,%r2= 0 */ - __put_user(0xe4008200, frame->tramp + 2); /* be,l 0x100(%sr2,%r0) */ - __put_user(0x08000240, frame->tramp + 3); /* nop */ - - unlock_user_struct(frame, frame_addr, 1); - - env->gr[2] =3D h2g(frame->tramp); - env->gr[30] =3D sp; - env->gr[26] =3D sig; - env->gr[25] =3D h2g(&frame->info); - env->gr[24] =3D h2g(&frame->uc); - - haddr =3D ka->_sa_handler; - if (haddr & 2) { - /* Function descriptor. */ - target_ulong *fdesc, dest; - - haddr &=3D -4; - if (!lock_user_struct(VERIFY_READ, fdesc, haddr, 1)) { - goto give_sigsegv; - } - __get_user(dest, fdesc); - __get_user(env->gr[19], fdesc + 1); - unlock_user_struct(fdesc, haddr, 1); - haddr =3D dest; - } - env->iaoq_f =3D haddr; - env->iaoq_b =3D haddr + 4; - return; - - give_sigsegv: - force_sigsegv(sig); -} - -long do_rt_sigreturn(CPUArchState *env) -{ - abi_ulong frame_addr =3D env->gr[30] - PARISC_RT_SIGFRAME_SIZE32; - 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); - unlock_user_struct(frame, frame_addr, 0); - - if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe, - uc.tuc_stack), - 0, env->gr[30]) =3D=3D -EFAULT) { - goto badframe; - } - - unlock_user_struct(frame, frame_addr, 0); - return -TARGET_QEMU_ESIGRETURN; - - badframe: - force_sig(TARGET_SIGSEGV); - return -TARGET_QEMU_ESIGRETURN; -} - #elif defined(TARGET_XTENSA) =20 struct target_sigcontext { --=20 2.14.3