summaryrefslogtreecommitdiffstats
path: root/target-sparc/op_helper.c
diff options
context:
space:
mode:
authormalc2011-08-05 08:07:10 +0200
committermalc2011-08-05 08:07:10 +0200
commita67a47d2b559a7733c3f89aeb2d81b19d2c027e4 (patch)
tree146a7b6eebbee1367453fde501d4462ac6d9f8b4 /target-sparc/op_helper.c
parentMerge branch 'master' of git://git.qemu.org/qemu (diff)
parentMerge remote-tracking branch 'mst/for_anthony' into staging (diff)
downloadqemu-a67a47d2b559a7733c3f89aeb2d81b19d2c027e4.tar.gz
qemu-a67a47d2b559a7733c3f89aeb2d81b19d2c027e4.tar.xz
qemu-a67a47d2b559a7733c3f89aeb2d81b19d2c027e4.zip
Merge branch 'master' of git://git.qemu.org/qemu
Diffstat (limited to 'target-sparc/op_helper.c')
-rw-r--r--target-sparc/op_helper.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c
index 8962e38219..5aeca2b06d 100644
--- a/target-sparc/op_helper.c
+++ b/target-sparc/op_helper.c
@@ -1,8 +1,13 @@
-#include "exec.h"
+#include "cpu.h"
+#include "dyngen-exec.h"
#include "host-utils.h"
#include "helper.h"
#include "sysemu.h"
+#if !defined(CONFIG_USER_ONLY)
+#include "softmmu_exec.h"
+#endif
+
//#define DEBUG_MMU
//#define DEBUG_MXCC
//#define DEBUG_UNALIGNED
@@ -4247,13 +4252,8 @@ void tlb_fill(target_ulong addr, int is_write, int mmu_idx, void *retaddr)
static void do_unassigned_access(target_phys_addr_t addr, int is_write,
int is_exec, int is_asi, int size)
{
- CPUState *saved_env;
int fault_type;
- /* 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
if (is_asi)
printf("Unassigned mem %s access of %d byte%s to " TARGET_FMT_plx
@@ -4301,8 +4301,6 @@ static void do_unassigned_access(target_phys_addr_t addr, int is_write,
if (env->mmuregs[0] & MMU_NF) {
tlb_flush(env, 1);
}
-
- env = saved_env;
}
#endif
#else
@@ -4314,13 +4312,6 @@ static void do_unassigned_access(target_phys_addr_t addr, int is_write,
int is_exec, int is_asi, int size)
#endif
{
- 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);
@@ -4330,8 +4321,6 @@ static void do_unassigned_access(target_phys_addr_t addr, int is_write,
raise_exception(TT_CODE_ACCESS);
else
raise_exception(TT_DATA_ACCESS);
-
- env = saved_env;
}
#endif
@@ -4365,7 +4354,14 @@ void helper_tick_set_limit(void *opaque, uint64_t limit)
void cpu_unassigned_access(CPUState *env1, target_phys_addr_t addr,
int is_write, int is_exec, int is_asi, int size)
{
+ CPUState *saved_env;
+
+ saved_env = env;
env = env1;
- do_unassigned_access(addr, is_write, is_exec, is_asi, size);
+ /* Ignore unassigned accesses outside of CPU context */
+ if (env1) {
+ do_unassigned_access(addr, is_write, is_exec, is_asi, size);
+ }
+ env = saved_env;
}
#endif