From: Warner Losh <imp@bsdimp.com>
To: Richard Henderson <richard.henderson@linaro.org>
Cc: "Laurent Vivier" <laurent@vivier.eu>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
"QEMU Developers" <qemu-devel@nongnu.org>,
"Khem Raj" <raj.khem@gmail.com>
Subject: Re: [PATCH for-6.2 1/2] linux-user: Add host_signal_set_pc to set pc in mcontext
Date: Mon, 22 Nov 2021 08:02:53 -0700 [thread overview]
Message-ID: <CANCZdfqvnO2+EAOU2_z1fPZh2GLgzO34wGAWrrRW8PbLzoOaTw@mail.gmail.com> (raw)
In-Reply-To: <20211122131200.229286-2-richard.henderson@linaro.org>
[-- Attachment #1: Type: text/plain, Size: 7338 bytes --]
On Mon, Nov 22, 2021 at 6:12 AM Richard Henderson <
richard.henderson@linaro.org> wrote:
> From: Warner Losh <imp@bsdimp.com>
>
> Add a new function host_signal_set_pc to set the next pc in an
> mcontext. The caller should ensure this is a valid PC for execution.
>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> Message-Id: <20211113045603.60391-2-imp@bsdimp.com>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> linux-user/host/aarch64/host-signal.h | 5 +++++
> linux-user/host/alpha/host-signal.h | 5 +++++
> linux-user/host/arm/host-signal.h | 5 +++++
> linux-user/host/i386/host-signal.h | 5 +++++
> linux-user/host/mips/host-signal.h | 5 +++++
> linux-user/host/ppc/host-signal.h | 5 +++++
> linux-user/host/riscv/host-signal.h | 5 +++++
> linux-user/host/s390/host-signal.h | 5 +++++
> linux-user/host/sparc/host-signal.h | 9 +++++++++
> linux-user/host/x86_64/host-signal.h | 5 +++++
> 10 files changed, 54 insertions(+)
>
Reviewed-by: Warner Losh <imp@bsdimp.com>
This looks like what I submitted, and will work with the cleaned up other
half.
Warner
> diff --git a/linux-user/host/aarch64/host-signal.h
> b/linux-user/host/aarch64/host-signal.h
> index 0c0b08383a..9770b36dc1 100644
> --- a/linux-user/host/aarch64/host-signal.h
> +++ b/linux-user/host/aarch64/host-signal.h
> @@ -35,6 +35,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
> return uc->uc_mcontext.pc;
> }
>
> +static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
> +{
> + uc->uc_mcontext.pc = pc;
> +}
> +
> static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> {
> struct _aarch64_ctx *hdr;
> diff --git a/linux-user/host/alpha/host-signal.h
> b/linux-user/host/alpha/host-signal.h
> index e080be412f..f4c942948a 100644
> --- a/linux-user/host/alpha/host-signal.h
> +++ b/linux-user/host/alpha/host-signal.h
> @@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
> return uc->uc_mcontext.sc_pc;
> }
>
> +static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
> +{
> + uc->uc_mcontext.sc_pc = pc;
> +}
> +
> static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> {
> uint32_t *pc = (uint32_t *)host_signal_pc(uc);
> diff --git a/linux-user/host/arm/host-signal.h
> b/linux-user/host/arm/host-signal.h
> index efb165c0c5..6c095773c0 100644
> --- a/linux-user/host/arm/host-signal.h
> +++ b/linux-user/host/arm/host-signal.h
> @@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
> return uc->uc_mcontext.arm_pc;
> }
>
> +static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
> +{
> + uc->uc_mcontext.arm_pc = pc;
> +}
> +
> static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> {
> /*
> diff --git a/linux-user/host/i386/host-signal.h
> b/linux-user/host/i386/host-signal.h
> index 4c8eef99ce..abe1ece5c9 100644
> --- a/linux-user/host/i386/host-signal.h
> +++ b/linux-user/host/i386/host-signal.h
> @@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
> return uc->uc_mcontext.gregs[REG_EIP];
> }
>
> +static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
> +{
> + uc->uc_mcontext.gregs[REG_EIP] = pc;
> +}
> +
> static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> {
> return uc->uc_mcontext.gregs[REG_TRAPNO] == 0xe
> diff --git a/linux-user/host/mips/host-signal.h
> b/linux-user/host/mips/host-signal.h
> index ef341f7c20..c666ed8c3f 100644
> --- a/linux-user/host/mips/host-signal.h
> +++ b/linux-user/host/mips/host-signal.h
> @@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
> return uc->uc_mcontext.pc;
> }
>
> +static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
> +{
> + uc->uc_mcontext.pc = pc;
> +}
> +
> #if defined(__misp16) || defined(__mips_micromips)
> #error "Unsupported encoding"
> #endif
> diff --git a/linux-user/host/ppc/host-signal.h
> b/linux-user/host/ppc/host-signal.h
> index a491c413dc..1d8e658ff7 100644
> --- a/linux-user/host/ppc/host-signal.h
> +++ b/linux-user/host/ppc/host-signal.h
> @@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
> return uc->uc_mcontext.regs->nip;
> }
>
> +static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
> +{
> + uc->uc_mcontext.regs->nip = pc;
> +}
> +
> static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> {
> return uc->uc_mcontext.regs->trap != 0x400
> diff --git a/linux-user/host/riscv/host-signal.h
> b/linux-user/host/riscv/host-signal.h
> index 3b168cb58b..a4f170efb0 100644
> --- a/linux-user/host/riscv/host-signal.h
> +++ b/linux-user/host/riscv/host-signal.h
> @@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
> return uc->uc_mcontext.__gregs[REG_PC];
> }
>
> +static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
> +{
> + uc->uc_mcontext.__gregs[REG_PC] = pc;
> +}
> +
> static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> {
> /*
> diff --git a/linux-user/host/s390/host-signal.h
> b/linux-user/host/s390/host-signal.h
> index 26990e4893..a524f2ab00 100644
> --- a/linux-user/host/s390/host-signal.h
> +++ b/linux-user/host/s390/host-signal.h
> @@ -16,6 +16,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
> return uc->uc_mcontext.psw.addr;
> }
>
> +static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
> +{
> + uc->uc_mcontext.psw.addr = pc;
> +}
> +
> static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> {
> uint16_t *pinsn = (uint16_t *)host_signal_pc(uc);
> diff --git a/linux-user/host/sparc/host-signal.h
> b/linux-user/host/sparc/host-signal.h
> index 5e71d33f8e..7342936071 100644
> --- a/linux-user/host/sparc/host-signal.h
> +++ b/linux-user/host/sparc/host-signal.h
> @@ -20,6 +20,15 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
> #endif
> }
>
> +static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
> +{
> +#ifdef __arch64__
> + uc->uc_mcontext.mc_gregs[MC_PC] = pc;
> +#else
> + uc->uc_mcontext.gregs[REG_PC] = pc;
> +#endif
> +}
> +
> static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> {
> uint32_t insn = *(uint32_t *)host_signal_pc(uc);
> diff --git a/linux-user/host/x86_64/host-signal.h
> b/linux-user/host/x86_64/host-signal.h
> index 883d2fcf65..c71d597eb2 100644
> --- a/linux-user/host/x86_64/host-signal.h
> +++ b/linux-user/host/x86_64/host-signal.h
> @@ -15,6 +15,11 @@ static inline uintptr_t host_signal_pc(ucontext_t *uc)
> return uc->uc_mcontext.gregs[REG_RIP];
> }
>
> +static inline void host_signal_set_pc(ucontext_t *uc, uintptr_t pc)
> +{
> + uc->uc_mcontext.gregs[REG_RIP] = pc;
> +}
> +
> static inline bool host_signal_write(siginfo_t *info, ucontext_t *uc)
> {
> return uc->uc_mcontext.gregs[REG_TRAPNO] == 0xe
> --
> 2.25.1
>
>
[-- Attachment #2: Type: text/html, Size: 8885 bytes --]
next prev parent reply other threads:[~2021-11-22 15:05 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-22 13:11 [PATCH for-6.2 0/2] linux-user: Create a common rewind_if_in_safe_syscall Richard Henderson
2021-11-22 13:11 ` [PATCH for-6.2 1/2] linux-user: Add host_signal_set_pc to set pc in mcontext Richard Henderson
2021-11-22 15:02 ` Warner Losh [this message]
2021-11-22 13:12 ` [PATCH for-6.2 2/2] linux-user/signal.c: Create a common rewind_if_in_safe_syscall Richard Henderson
2021-11-22 15:01 ` Warner Losh
2021-11-22 15:43 ` [PATCH for-6.2 0/2] linux-user: " Laurent Vivier
2021-11-22 15:50 ` Richard Henderson
2021-11-22 16:08 ` Laurent Vivier
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=CANCZdfqvnO2+EAOU2_z1fPZh2GLgzO34wGAWrrRW8PbLzoOaTw@mail.gmail.com \
--to=imp@bsdimp.com \
--cc=f4bug@amsat.org \
--cc=laurent@vivier.eu \
--cc=qemu-devel@nongnu.org \
--cc=raj.khem@gmail.com \
--cc=richard.henderson@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).