Message ID | 20200925083307.13761-1-kele.hwang@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | [v3,1/1] accel/tcg: Fix computing of is_write for MIPS | expand |
Cc'ing TCG MIPS maintainers *again*. On 9/25/20 10:33 AM, Kele Huang wrote: > Detect all MIPS store instructions in cpu_signal_handler for all available > MIPS versions, and set is_write if encountering such store instructions. > > This fixed the error while dealing with self-modified code for MIPS. > > Signed-off-by: Kele Huang <kele.hwang@gmail.com> > Signed-off-by: Xu Zou <iwatchnima@gmail.com> > --- > accel/tcg/user-exec.c | 38 +++++++++++++++++++++++++++++++++++++- > 1 file changed, 37 insertions(+), 1 deletion(-) > > diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c > index bb039eb32d..c4494c93e7 100644 > --- a/accel/tcg/user-exec.c > +++ b/accel/tcg/user-exec.c > @@ -702,6 +702,10 @@ int cpu_signal_handler(int host_signum, void *pinfo, > > #elif defined(__mips__) > > +#if defined(__misp16) || defined(__mips_micromips) > +#error "Unsupported encoding" > +#endif > + > int cpu_signal_handler(int host_signum, void *pinfo, > void *puc) > { > @@ -709,9 +713,41 @@ int cpu_signal_handler(int host_signum, void *pinfo, > ucontext_t *uc = puc; > greg_t pc = uc->uc_mcontext.pc; > int is_write; > + uint32_t insn; > > - /* XXX: compute is_write */ > + /* Detect all store instructions at program counter. */ > is_write = 0; > + insn = *(uint32_t *)pc; > + switch((insn >> 26) & 077) { > + case 050: /* SB */ > + case 051: /* SH */ > + case 052: /* SWL */ > + case 053: /* SW */ > + case 054: /* SDL */ > + case 055: /* SDR */ > + case 056: /* SWR */ > + case 070: /* SC */ > + case 071: /* SWC1 */ > + case 074: /* SCD */ > + case 075: /* SDC1 */ > + case 077: /* SD */ > +#if !defined(__mips_isa_rev) || __mips_isa_rev < 6 > + case 072: /* SWC2 */ > + case 076: /* SDC2 */ > +#endif > + is_write = 1; > + break; > + case 023: /* COP1X */ > + /* Required in all versions of MIPS64 since > + MIPS64r1 and subsequent versions of MIPS32. */ > + switch (insn & 077) { > + case 010: /* SWXC1 */ > + case 011: /* SDXC1 */ > + is_write = 1; > + } > + break; > + } > + > return handle_cpu_signal(pc, info, is_write, &uc->uc_sigmask); > } > >
On 9/25/20 1:33 AM, Kele Huang wrote: > Detect all MIPS store instructions in cpu_signal_handler for all available > MIPS versions, and set is_write if encountering such store instructions. > > This fixed the error while dealing with self-modified code for MIPS. > > Signed-off-by: Kele Huang <kele.hwang@gmail.com> > Signed-off-by: Xu Zou <iwatchnima@gmail.com> > --- > accel/tcg/user-exec.c | 38 +++++++++++++++++++++++++++++++++++++- > 1 file changed, 37 insertions(+), 1 deletion(-) > > diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c > index bb039eb32d..c4494c93e7 100644 > --- a/accel/tcg/user-exec.c > +++ b/accel/tcg/user-exec.c > @@ -702,6 +702,10 @@ int cpu_signal_handler(int host_signum, void *pinfo, > > #elif defined(__mips__) > > +#if defined(__misp16) || defined(__mips_micromips) > +#error "Unsupported encoding" > +#endif > + > int cpu_signal_handler(int host_signum, void *pinfo, > void *puc) > { > @@ -709,9 +713,41 @@ int cpu_signal_handler(int host_signum, void *pinfo, > ucontext_t *uc = puc; > greg_t pc = uc->uc_mcontext.pc; > int is_write; > + uint32_t insn; > > - /* XXX: compute is_write */ > + /* Detect all store instructions at program counter. */ > is_write = 0; > + insn = *(uint32_t *)pc; > + switch((insn >> 26) & 077) { > + case 050: /* SB */ > + case 051: /* SH */ > + case 052: /* SWL */ > + case 053: /* SW */ > + case 054: /* SDL */ > + case 055: /* SDR */ > + case 056: /* SWR */ > + case 070: /* SC */ > + case 071: /* SWC1 */ > + case 074: /* SCD */ > + case 075: /* SDC1 */ > + case 077: /* SD */ > +#if !defined(__mips_isa_rev) || __mips_isa_rev < 6 > + case 072: /* SWC2 */ > + case 076: /* SDC2 */ > +#endif > + is_write = 1; > + break; > + case 023: /* COP1X */ > + /* Required in all versions of MIPS64 since > + MIPS64r1 and subsequent versions of MIPS32. */ > + switch (insn & 077) { > + case 010: /* SWXC1 */ > + case 011: /* SDXC1 */ > + is_write = 1; Much better. I just noticed you're missing SUXC1 (COP1X minor 015). With that fixed, Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
Fixed! I have resent a v4 patch which contains SUXC1. Thank you! On Fri, 25 Sep 2020 at 22:58, Richard Henderson < richard.henderson@linaro.org> wrote: > On 9/25/20 1:33 AM, Kele Huang wrote: > > Detect all MIPS store instructions in cpu_signal_handler for all > available > > MIPS versions, and set is_write if encountering such store instructions. > > > > This fixed the error while dealing with self-modified code for MIPS. > > > > Signed-off-by: Kele Huang <kele.hwang@gmail.com> > > Signed-off-by: Xu Zou <iwatchnima@gmail.com> > > --- > > accel/tcg/user-exec.c | 38 +++++++++++++++++++++++++++++++++++++- > > 1 file changed, 37 insertions(+), 1 deletion(-) > > > > diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c > > index bb039eb32d..c4494c93e7 100644 > > --- a/accel/tcg/user-exec.c > > +++ b/accel/tcg/user-exec.c > > @@ -702,6 +702,10 @@ int cpu_signal_handler(int host_signum, void *pinfo, > > > > #elif defined(__mips__) > > > > +#if defined(__misp16) || defined(__mips_micromips) > > +#error "Unsupported encoding" > > +#endif > > + > > int cpu_signal_handler(int host_signum, void *pinfo, > > void *puc) > > { > > @@ -709,9 +713,41 @@ int cpu_signal_handler(int host_signum, void *pinfo, > > ucontext_t *uc = puc; > > greg_t pc = uc->uc_mcontext.pc; > > int is_write; > > + uint32_t insn; > > > > - /* XXX: compute is_write */ > > + /* Detect all store instructions at program counter. */ > > is_write = 0; > > + insn = *(uint32_t *)pc; > > + switch((insn >> 26) & 077) { > > + case 050: /* SB */ > > + case 051: /* SH */ > > + case 052: /* SWL */ > > + case 053: /* SW */ > > + case 054: /* SDL */ > > + case 055: /* SDR */ > > + case 056: /* SWR */ > > + case 070: /* SC */ > > + case 071: /* SWC1 */ > > + case 074: /* SCD */ > > + case 075: /* SDC1 */ > > + case 077: /* SD */ > > +#if !defined(__mips_isa_rev) || __mips_isa_rev < 6 > > + case 072: /* SWC2 */ > > + case 076: /* SDC2 */ > > +#endif > > + is_write = 1; > > + break; > > + case 023: /* COP1X */ > > + /* Required in all versions of MIPS64 since > > + MIPS64r1 and subsequent versions of MIPS32. */ > > + switch (insn & 077) { > > + case 010: /* SWXC1 */ > > + case 011: /* SDXC1 */ > > + is_write = 1; > > Much better. I just noticed you're missing SUXC1 (COP1X minor 015). With > that > fixed, > > Reviewed-by: Richard Henderson <richard.henderson@linaro.org> > > r~ > <div dir="ltr">Fixed! I have resent a v4 patch which contains SUXC1.<div>Thank you!</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 25 Sep 2020 at 22:58, Richard Henderson <<a href="mailto:richard.henderson@linaro.org">richard.henderson@linaro.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 9/25/20 1:33 AM, Kele Huang wrote:<br> > Detect all MIPS store instructions in cpu_signal_handler for all available<br> > MIPS versions, and set is_write if encountering such store instructions.<br> > <br> > This fixed the error while dealing with self-modified code for MIPS.<br> > <br> > Signed-off-by: Kele Huang <<a href="mailto:kele.hwang@gmail.com" target="_blank">kele.hwang@gmail.com</a>><br> > Signed-off-by: Xu Zou <<a href="mailto:iwatchnima@gmail.com" target="_blank">iwatchnima@gmail.com</a>><br> > ---<br> > accel/tcg/user-exec.c | 38 +++++++++++++++++++++++++++++++++++++-<br> > 1 file changed, 37 insertions(+), 1 deletion(-)<br> > <br> > diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c<br> > index bb039eb32d..c4494c93e7 100644<br> > --- a/accel/tcg/user-exec.c<br> > +++ b/accel/tcg/user-exec.c<br> > @@ -702,6 +702,10 @@ int cpu_signal_handler(int host_signum, void *pinfo,<br> > <br> > #elif defined(__mips__)<br> > <br> > +#if defined(__misp16) || defined(__mips_micromips)<br> > +#error "Unsupported encoding"<br> > +#endif<br> > +<br> > int cpu_signal_handler(int host_signum, void *pinfo,<br> > void *puc)<br> > {<br> > @@ -709,9 +713,41 @@ int cpu_signal_handler(int host_signum, void *pinfo,<br> > ucontext_t *uc = puc;<br> > greg_t pc = uc->uc_mcontext.pc;<br> > int is_write;<br> > + uint32_t insn;<br> > <br> > - /* XXX: compute is_write */<br> > + /* Detect all store instructions at program counter. */<br> > is_write = 0;<br> > + insn = *(uint32_t *)pc;<br> > + switch((insn >> 26) & 077) {<br> > + case 050: /* SB */<br> > + case 051: /* SH */<br> > + case 052: /* SWL */<br> > + case 053: /* SW */<br> > + case 054: /* SDL */<br> > + case 055: /* SDR */<br> > + case 056: /* SWR */<br> > + case 070: /* SC */<br> > + case 071: /* SWC1 */<br> > + case 074: /* SCD */<br> > + case 075: /* SDC1 */<br> > + case 077: /* SD */<br> > +#if !defined(__mips_isa_rev) || __mips_isa_rev < 6<br> > + case 072: /* SWC2 */<br> > + case 076: /* SDC2 */<br> > +#endif<br> > + is_write = 1;<br> > + break;<br> > + case 023: /* COP1X */<br> > + /* Required in all versions of MIPS64 since <br> > + MIPS64r1 and subsequent versions of MIPS32. */<br> > + switch (insn & 077) {<br> > + case 010: /* SWXC1 */<br> > + case 011: /* SDXC1 */<br> > + is_write = 1;<br> <br> Much better. I just noticed you're missing SUXC1 (COP1X minor 015). With that<br> fixed,<br> <br> Reviewed-by: Richard Henderson <<a href="mailto:richard.henderson@linaro.org" target="_blank">richard.henderson@linaro.org</a>><br> <br> r~<br> </blockquote></div>
diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c index bb039eb32d..c4494c93e7 100644 --- a/accel/tcg/user-exec.c +++ b/accel/tcg/user-exec.c @@ -702,6 +702,10 @@ int cpu_signal_handler(int host_signum, void *pinfo, #elif defined(__mips__) +#if defined(__misp16) || defined(__mips_micromips) +#error "Unsupported encoding" +#endif + int cpu_signal_handler(int host_signum, void *pinfo, void *puc) { @@ -709,9 +713,41 @@ int cpu_signal_handler(int host_signum, void *pinfo, ucontext_t *uc = puc; greg_t pc = uc->uc_mcontext.pc; int is_write; + uint32_t insn; - /* XXX: compute is_write */ + /* Detect all store instructions at program counter. */ is_write = 0; + insn = *(uint32_t *)pc; + switch((insn >> 26) & 077) { + case 050: /* SB */ + case 051: /* SH */ + case 052: /* SWL */ + case 053: /* SW */ + case 054: /* SDL */ + case 055: /* SDR */ + case 056: /* SWR */ + case 070: /* SC */ + case 071: /* SWC1 */ + case 074: /* SCD */ + case 075: /* SDC1 */ + case 077: /* SD */ +#if !defined(__mips_isa_rev) || __mips_isa_rev < 6 + case 072: /* SWC2 */ + case 076: /* SDC2 */ +#endif + is_write = 1; + break; + case 023: /* COP1X */ + /* Required in all versions of MIPS64 since + MIPS64r1 and subsequent versions of MIPS32. */ + switch (insn & 077) { + case 010: /* SWXC1 */ + case 011: /* SDXC1 */ + is_write = 1; + } + break; + } + return handle_cpu_signal(pc, info, is_write, &uc->uc_sigmask); }