Patchwork pass env to raise_exception if called outside of op_helper code

login
register
mail settings
Submitter Igor V. Kovalenko
Date Jan. 3, 2010, 12:09 p.m.
Message ID <20100103120926.29681.1917.stgit@skyserv>
Download mbox | patch
Permalink /patch/42036/
State New
Headers show

Comments

Igor V. Kovalenko - Jan. 3, 2010, 12:09 p.m.
From: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>

- this fixes stepping with gdb, where do_unassigned_access
  may be called from gdb handler, outside of generated code

Signed-off-by: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
---
 target-sparc/op_helper.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)
Blue Swirl - Jan. 3, 2010, 12:24 p.m.
Thanks, applied.


On Sun, Jan 3, 2010 at 12:09 PM, Igor V. Kovalenko
<igor.v.kovalenko@gmail.com> wrote:
> From: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
>
> - this fixes stepping with gdb, where do_unassigned_access
>  may be called from gdb handler, outside of generated code
>
> Signed-off-by: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
> ---
>  target-sparc/op_helper.c |    7 +++++--
>  1 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c
> index 4e0a0e3..bd01a5e 100644
> --- a/target-sparc/op_helper.c
> +++ b/target-sparc/op_helper.c
> @@ -3686,21 +3686,24 @@ void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
>  void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
>                           int is_asi, int size)
>  {
> -#ifdef DEBUG_UNASSIGNED
>     CPUState *saved_env;
>
>     /* XXX: hack to restore env in all cases, even if not called from
>        generated code */
>     saved_env = env;
>     env = cpu_single_env;
> +
> +#ifdef DEBUG_UNASSIGNED
>     printf("Unassigned mem access to " TARGET_FMT_plx " from " TARGET_FMT_lx
>            "\n", addr, env->pc);
> -    env = saved_env;
>  #endif
> +
>     if (is_exec)
>         raise_exception(TT_CODE_ACCESS);
>     else
>         raise_exception(TT_DATA_ACCESS);
> +
> +    env = saved_env;
>  }
>  #endif
>
>
>
>
>

Patch

diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c
index 4e0a0e3..bd01a5e 100644
--- a/target-sparc/op_helper.c
+++ b/target-sparc/op_helper.c
@@ -3686,21 +3686,24 @@  void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
 void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
                           int is_asi, int size)
 {
-#ifdef DEBUG_UNASSIGNED
     CPUState *saved_env;
 
     /* XXX: hack to restore env in all cases, even if not called from
        generated code */
     saved_env = env;
     env = cpu_single_env;
+
+#ifdef DEBUG_UNASSIGNED
     printf("Unassigned mem access to " TARGET_FMT_plx " from " TARGET_FMT_lx
            "\n", addr, env->pc);
-    env = saved_env;
 #endif
+
     if (is_exec)
         raise_exception(TT_CODE_ACCESS);
     else
         raise_exception(TT_DATA_ACCESS);
+
+    env = saved_env;
 }
 #endif