All of lore.kernel.org
 help / color / mirror / Atom feed
From: Warner Losh <imp@bsdimp.com>
To: qemu-devel@nongnu.org
Cc: Stacey Son <sson@FreeBSD.org>,
	qemu-trivial@nongnu.org, Michael Tokarev <mjt@tls.msk.ru>,
	Richard Henderson <richard.henderson@linaro.org>,
	Philippe Mathieu-Daude <f4bug@amsat.org>,
	Laurent Vivier <laurent@vivier.eu>,
	Kyle Evans <kevans@FreeBSD.org>, Warner Losh <imp@bsdimp.com>
Subject: [PATCH v4 33/36] bsd-user/arm/target_arch_signal.c: arm set_mcontext
Date: Thu,  4 Nov 2021 21:19:14 -0600	[thread overview]
Message-ID: <20211105031917.87837-34-imp@bsdimp.com> (raw)
In-Reply-To: <20211105031917.87837-1-imp@bsdimp.com>

Move the machine context to the CPU state.

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/arm/signal.c             | 79 +++++++++++++++++++++++++++++++
 bsd-user/arm/target_arch_signal.h |  1 +
 2 files changed, 80 insertions(+)

diff --git a/bsd-user/arm/signal.c b/bsd-user/arm/signal.c
index 93c9bfc0d3..d32e3b4560 100644
--- a/bsd-user/arm/signal.c
+++ b/bsd-user/arm/signal.c
@@ -109,3 +109,82 @@ abi_long get_mcontext(CPUARMState *env, target_mcontext_t *mcp, int flags)
     }
     return err;
 }
+
+/* Compare to arm/arm/exec_machdep.c set_mcontext() */
+abi_long set_mcontext(CPUARMState *env, target_mcontext_t *mcp, int srflag)
+{
+    int err = 0;
+    const uint32_t *gr = mcp->__gregs;
+    uint32_t cpsr, ccpsr = cpsr_read(env);
+    uint32_t fpscr, mask;
+
+    cpsr = tswap32(gr[TARGET_REG_CPSR]);
+    /*
+     * Only allow certain bits to change, reject attempted changes to non-user
+     * bits. In addition, make sure we're headed for user mode and none of the
+     * interrupt bits are set.
+     */
+    if ((ccpsr & ~CPSR_USER) != (cpsr & ~CPSR_USER)) {
+        return -TARGET_EINVAL;
+    }
+    if ((cpsr & CPSR_M) != ARM_CPU_MODE_USR ||
+        (cpsr & (CPSR_I | CPSR_F)) != 0) {
+        return -TARGET_EINVAL;
+    }
+    mask = cpsr & CPSR_T ? 0x1 : 0x3;
+
+    /*
+     * Make sure that we either have no vfp, or it's the correct size.
+     * FreeBSD just ignores it, though, so maybe we'll need to adjust
+     * things below instead.
+     */
+    if (mcp->mc_vfp_size != 0 && mcp->mc_vfp_size != sizeof(target_mcontext_vfp_t)) {
+        return -TARGET_EINVAL;
+    }
+    /*
+     * Make sure T mode matches the PC's notion of thumb mode, although
+     * FreeBSD lets the processor sort this out, so we may need remove
+     * this check, or generate a signal...
+     */
+    if (!!(tswap32(gr[TARGET_REG_PC]) & 1) != !!(cpsr & CPSR_T)) {
+        return -TARGET_EINVAL;
+    }
+
+    env->regs[0] = tswap32(gr[TARGET_REG_R0]);
+    env->regs[1] = tswap32(gr[TARGET_REG_R1]);
+    env->regs[2] = tswap32(gr[TARGET_REG_R2]);
+    env->regs[3] = tswap32(gr[TARGET_REG_R3]);
+    env->regs[4] = tswap32(gr[TARGET_REG_R4]);
+    env->regs[5] = tswap32(gr[TARGET_REG_R5]);
+    env->regs[6] = tswap32(gr[TARGET_REG_R6]);
+    env->regs[7] = tswap32(gr[TARGET_REG_R7]);
+    env->regs[8] = tswap32(gr[TARGET_REG_R8]);
+    env->regs[9] = tswap32(gr[TARGET_REG_R9]);
+    env->regs[10] = tswap32(gr[TARGET_REG_R10]);
+    env->regs[11] = tswap32(gr[TARGET_REG_R11]);
+    env->regs[12] = tswap32(gr[TARGET_REG_R12]);
+
+    env->regs[13] = tswap32(gr[TARGET_REG_SP]);
+    env->regs[14] = tswap32(gr[TARGET_REG_LR]);
+    env->regs[15] = tswap32(gr[TARGET_REG_PC] & mask);
+    if (mcp->mc_vfp_size != 0 && mcp->mc_vfp_ptr != 0) {
+        /* see set_vfpcontext in sys/arm/arm/exec_machdep.c */
+        target_mcontext_vfp_t *vfp;
+
+        vfp = lock_user(VERIFY_READ, mcp->mc_vfp_ptr, sizeof(*vfp), 1);
+        for (int i = 0; i < 32; i++) {
+            __get_user(*aa32_vfp_dreg(env, i), &vfp->mcv_reg[i]);
+        }
+        __get_user(fpscr, &vfp->mcv_fpscr);
+        vfp_set_fpscr(env, fpscr);
+        unlock_user(vfp, mcp->mc_vfp_ptr, sizeof(target_ucontext_t));
+
+        /*
+         * linux-user sets fpexc, fpinst and fpinst2, but these aren't in
+         * FreeBSD's mcontext, what to do?
+         */
+    }
+    cpsr_write(env, cpsr, CPSR_USER | CPSR_EXEC, CPSRWriteByInstr);
+
+    return err;
+}
diff --git a/bsd-user/arm/target_arch_signal.h b/bsd-user/arm/target_arch_signal.h
index 429843c70f..83ecfaafef 100644
--- a/bsd-user/arm/target_arch_signal.h
+++ b/bsd-user/arm/target_arch_signal.h
@@ -90,5 +90,6 @@ abi_long set_sigtramp_args(CPUARMState *regs, int sig,
                            abi_ulong frame_addr,
                            struct target_sigaction *ka);
 abi_long get_mcontext(CPUARMState *regs, target_mcontext_t *mcp, int flags);
+abi_long set_mcontext(CPUARMState *regs, target_mcontext_t *mcp, int srflag);
 
 #endif /* !_TARGET_ARCH_SIGNAL_H_ */
-- 
2.33.0



  parent reply	other threads:[~2021-11-05  4:09 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-05  3:18 [PATCH v4 00/36] bsd-user: arm (32-bit) support Warner Losh
2021-11-05  3:18 ` [PATCH v4 01/36] bsd-user/mips*: Remove Warner Losh
2021-11-05 15:52   ` Richard Henderson
2021-11-05 15:53     ` Kyle Evans
2021-11-05 16:01     ` Warner Losh
2021-11-05  3:18 ` [PATCH v4 02/36] bsd-user/freebsd: Create common target_os_ucontext.h file Warner Losh
2021-11-05 16:01   ` Richard Henderson
2021-11-05  3:18 ` [PATCH v4 03/36] bsd-user: create a per-arch signal.c file Warner Losh
2021-11-05 16:05   ` Richard Henderson
2021-11-05  3:18 ` [PATCH v4 04/36] bsd-user/i386/target_arch_signal.h: Remove target_sigcontext Warner Losh
2021-11-05  3:18 ` [PATCH v4 05/36] bsd-user/i386/target_arch_signal.h: use new target_os_ucontext.h Warner Losh
2021-11-05  3:18 ` [PATCH v4 06/36] bsd-user/i386/target_arch_signal.h: Update mcontext_t to match FreeBSD Warner Losh
2021-11-05 16:15   ` Richard Henderson
2021-11-05  3:18 ` [PATCH v4 07/36] bsd-user/i386: Move the inlines into signal.c Warner Losh
2021-11-05 16:21   ` Richard Henderson
2021-11-05 16:45     ` Warner Losh
2021-11-05 16:55       ` Warner Losh
2021-11-05  3:18 ` [PATCH v4 08/36] bsd-user/x86_64/target_arch_signal.h: Remove target_sigcontext Warner Losh
2021-11-05  3:18 ` [PATCH v4 09/36] bsd-user/x86_64/target_arch_signal.h: use new target_os_ucontext.h Warner Losh
2021-11-05  3:18 ` [PATCH v4 10/36] bsd-user/x86_64/target_arch_signal.h: Fill in mcontext_t Warner Losh
2021-11-05 16:23   ` Richard Henderson
2021-11-05  3:18 ` [PATCH v4 11/36] bsd-user/x86_64: Move functions into signal.c Warner Losh
2021-11-05 16:25   ` Richard Henderson
2021-11-05 17:08     ` Warner Losh
2021-11-05  3:18 ` [PATCH v4 12/36] bsd-user/arm/target_arch_sysarch.h: Use consistent include guards Warner Losh
2021-11-05  3:18 ` [PATCH v4 13/36] bsd-user/arm/target_syscall.h: Add copyright and update name Warner Losh
2021-11-05  3:18 ` [PATCH v4 14/36] bsd-user/arm/target_arch_cpu.c: Target specific TLS routines Warner Losh
2021-11-05  3:18 ` [PATCH v4 15/36] bsd-user/arm/target_arch_cpu.h: CPU Loop definitions Warner Losh
2021-11-05  3:18 ` [PATCH v4 16/36] bsd-user/arm/target_arch_cpu.h: Implement target_cpu_clone_regs Warner Losh
2021-11-05  3:18 ` [PATCH v4 17/36] bsd-user/arm/target_arch_cpu.h: Dummy target_cpu_loop implementation Warner Losh
2021-11-05  3:18 ` [PATCH v4 18/36] bsd-user/arm/target_arch_cpu.h: Implement trivial EXCP exceptions Warner Losh
2021-11-05  3:19 ` [PATCH v4 19/36] bsd-user/arm/target_arch_cpu.h: Implement data abort exceptions Warner Losh
2021-11-05  3:19 ` [PATCH v4 20/36] bsd-user/arm/target_arch_cpu.h: Implement system call dispatch Warner Losh
2021-11-05  3:19 ` [PATCH v4 21/36] bsd-user/arm/target_arch_reg.h: Implement core dump register copying Warner Losh
2021-11-05  3:19 ` [PATCH v4 22/36] bsd-user/arm/target_arch_vmparam.h: Parameters for arm address space Warner Losh
2021-11-05  3:19 ` [PATCH v4 23/36] bsd-user/arm/target_arch_sigtramp.h: Signal Trampoline for arm Warner Losh
2021-11-05  3:19 ` [PATCH v4 24/36] bsd-user/arm/target_arch_thread.h: Routines to create and switch to a thread Warner Losh
2021-11-05  3:19 ` [PATCH v4 25/36] bsd-user/arm/target_arch_elf.h: arm defines for ELF Warner Losh
2021-11-05  3:19 ` [PATCH v4 26/36] bsd-user/arm/target_arch_elf.h: arm get hwcap Warner Losh
2021-11-05  3:19 ` [PATCH v4 27/36] bsd-user/arm/target_arch_elf.h: arm get_hwcap2 impl Warner Losh
2021-11-05  3:19 ` [PATCH v4 28/36] bsd-user/arm/target_arch_signal.h: arm specific signal registers and stack Warner Losh
2021-11-05  3:19 ` [PATCH v4 29/36] bsd-user/arm/target_arch_signal.h: arm machine context and trapframe for signals Warner Losh
2021-11-05 16:31   ` Richard Henderson
2021-11-05  3:19 ` [PATCH v4 30/36] bsd-user/arm/target_arch_signal.h: Define size of *context_t Warner Losh
2021-11-05 16:31   ` Richard Henderson
2021-11-05  3:19 ` [PATCH v4 31/36] bsd-user/arm/target_arch_signal.c: arm set_sigtramp_args Warner Losh
2021-11-05  3:19 ` [PATCH v4 32/36] bsd-user/arm/target_arch_signal.c: arm get_mcontext Warner Losh
2021-11-05 16:36   ` Richard Henderson
2021-11-05  3:19 ` Warner Losh [this message]
2021-11-05 16:44   ` [PATCH v4 33/36] bsd-user/arm/target_arch_signal.c: arm set_mcontext Richard Henderson
2021-11-05 17:41     ` Warner Losh
2021-11-05  3:19 ` [PATCH v4 34/36] bsd-user/arm/target_arch_signal.c: arm get_ucontext_sigreturn Warner Losh
2021-11-05  3:19 ` [PATCH v4 35/36] bsd-user/freebsd/target_os_ucontext.h: Require TARGET_*CONTEXT_SIZE Warner Losh
2021-11-05 16:45   ` Richard Henderson
2021-11-05  3:19 ` [PATCH v4 36/36] bsd-user: add arm target build Warner Losh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211105031917.87837-34-imp@bsdimp.com \
    --to=imp@bsdimp.com \
    --cc=f4bug@amsat.org \
    --cc=kevans@FreeBSD.org \
    --cc=laurent@vivier.eu \
    --cc=mjt@tls.msk.ru \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-trivial@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=sson@FreeBSD.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.