aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpu-exec.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/cpu-exec.c b/cpu-exec.c
index 5507c04..08ecea1 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -250,11 +250,7 @@ int cpu_exec(CPUState *env1)
pc = (uint8_t *)env->regs[15];
#elif defined(TARGET_SPARC)
flags = 0;
- cs_base = 0;
- if (env->npc) {
- env->pc = env->npc;
- env->npc = 0;
- }
+ cs_base = env->npc;
pc = (uint8_t *) env->pc;
#elif defined(TARGET_PPC)
flags = 0;
@@ -271,7 +267,7 @@ int cpu_exec(CPUState *env1)
tb = tb_alloc((unsigned long)pc);
if (!tb) {
/* flush must be done */
- tb_flush();
+ tb_flush(env);
/* cannot fail at this point */
tb = tb_alloc((unsigned long)pc);
/* don't forget to invalidate previous TB info */
@@ -410,7 +406,7 @@ void cpu_x86_load_seg(CPUX86State *s, int seg_reg, int selector)
cpu_x86_load_seg_cache(env, seg_reg, selector,
(uint8_t *)(selector << 4), 0xffff, 0);
} else {
- load_seg(seg_reg, selector, 0);
+ load_seg(seg_reg, selector);
}
env = saved_env;
}
@@ -519,7 +515,11 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address,
static inline int handle_cpu_signal(unsigned long pc, unsigned long address,
int is_write, sigset_t *old_set)
{
- return 0;
+ /* XXX: locking issue */
+ if (is_write && page_unprotect(address)) {
+ return 1;
+ }
+ return 0;
}
#elif defined (TARGET_PPC)
static inline int handle_cpu_signal(unsigned long pc, unsigned long address,