[Qemu-devel] [PATCH] m68: fix exception stack frame for 68000

Pavel Dovgalyuk posted 1 patch 23 weeks ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20180413111245.28627.3415.stgit@pasha-VirtualBox
Test checkpatch passed
Test docker-build@min-glib passed
Test docker-mingw@fedora passed
Test s390x passed
target/m68k/op_helper.c |    7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

[Qemu-devel] [PATCH] m68: fix exception stack frame for 68000

Posted by Pavel Dovgalyuk 23 weeks ago
68000 CPUs do not save format in the exception stack frame.
This patch adds feature checking to prevent format saving for 68000.
m68k_ret() already includes this modification, this patch fixes
the exception processing function too.

Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
---
 target/m68k/op_helper.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
index 3a7f7f2..e367133 100644
--- a/target/m68k/op_helper.c
+++ b/target/m68k/op_helper.c
@@ -301,8 +301,11 @@ static inline void do_stack_frame(CPUM68KState *env, uint32_t *sp,
         cpu_stl_kernel(env, *sp, addr);
         break;
     }
-    *sp -= 2;
-    cpu_stw_kernel(env, *sp, (format << 12) + (cs->exception_index << 2));
+    if (m68k_feature(env, M68K_FEATURE_QUAD_MULDIV)) {
+        /*  all except 68000 */
+        *sp -= 2;
+        cpu_stw_kernel(env, *sp, (format << 12) + (cs->exception_index << 2));
+    }
     *sp -= 4;
     cpu_stl_kernel(env, *sp, retaddr);
     *sp -= 2;


Re: [Qemu-devel] [PATCH] m68: fix exception stack frame for 68000

Posted by Laurent Vivier 23 weeks ago
Le 13/04/2018 à 13:12, Pavel Dovgalyuk a écrit :
> 68000 CPUs do not save format in the exception stack frame.
> This patch adds feature checking to prevent format saving for 68000.
> m68k_ret() already includes this modification, this patch fixes
> the exception processing function too.
> 
> Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
> ---
>  target/m68k/op_helper.c |    7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
> index 3a7f7f2..e367133 100644
> --- a/target/m68k/op_helper.c
> +++ b/target/m68k/op_helper.c
> @@ -301,8 +301,11 @@ static inline void do_stack_frame(CPUM68KState *env, uint32_t *sp,
>          cpu_stl_kernel(env, *sp, addr);
>          break;
>      }
> -    *sp -= 2;
> -    cpu_stw_kernel(env, *sp, (format << 12) + (cs->exception_index << 2));
> +    if (m68k_feature(env, M68K_FEATURE_QUAD_MULDIV)) {
> +        /*  all except 68000 */
> +        *sp -= 2;
> +        cpu_stw_kernel(env, *sp, (format << 12) + (cs->exception_index << 2));
> +    }
>      *sp -= 4;
>      cpu_stl_kernel(env, *sp, retaddr);
>      *sp -= 2;
> 

To be the exact counterpart of m68k_rte(), I think you should include
the "switch () { }" into the "if () { }".

Thanks,
Laurent

Re: [Qemu-devel] [PATCH] m68: fix exception stack frame for 68000

Posted by Pavel Dovgalyuk 23 weeks ago
> From: Laurent Vivier [mailto:laurent@vivier.eu]
> Le 13/04/2018 à 13:12, Pavel Dovgalyuk a écrit :
> > 68000 CPUs do not save format in the exception stack frame.
> > This patch adds feature checking to prevent format saving for 68000.
> > m68k_ret() already includes this modification, this patch fixes
> > the exception processing function too.
> >
> > Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
> > ---
> >  target/m68k/op_helper.c |    7 +++++--
> >  1 file changed, 5 insertions(+), 2 deletions(-)
> >
> > diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
> > index 3a7f7f2..e367133 100644
> > --- a/target/m68k/op_helper.c
> > +++ b/target/m68k/op_helper.c
> > @@ -301,8 +301,11 @@ static inline void do_stack_frame(CPUM68KState *env, uint32_t *sp,
> >          cpu_stl_kernel(env, *sp, addr);
> >          break;
> >      }
> > -    *sp -= 2;
> > -    cpu_stw_kernel(env, *sp, (format << 12) + (cs->exception_index << 2));
> > +    if (m68k_feature(env, M68K_FEATURE_QUAD_MULDIV)) {
> > +        /*  all except 68000 */
> > +        *sp -= 2;
> > +        cpu_stw_kernel(env, *sp, (format << 12) + (cs->exception_index << 2));
> > +    }
> >      *sp -= 4;
> >      cpu_stl_kernel(env, *sp, retaddr);
> >      *sp -= 2;
> >
> 
> To be the exact counterpart of m68k_rte(), I think you should include
> the "switch () { }" into the "if () { }".

That's right, thank you.


Pavel Dovgalyuk