44 |
44 |
int is_user, int is_softmmu)
|
45 |
45 |
{
|
46 |
46 |
env->mmuregs[4] = address;
|
47 |
|
env->exception_index = 0; /* XXX: must be incorrect */
|
48 |
|
env->error_code = -2; /* XXX: is it really used ! */
|
|
47 |
if (rw & 2)
|
|
48 |
env->exception_index = TT_TFAULT;
|
|
49 |
else
|
|
50 |
env->exception_index = TT_DFAULT;
|
49 |
51 |
return 1;
|
50 |
52 |
}
|
51 |
53 |
|
... | ... | |
95 |
97 |
cpu_restore_state(tb, env, pc, NULL);
|
96 |
98 |
}
|
97 |
99 |
}
|
98 |
|
raise_exception(ret);
|
|
100 |
cpu_loop_exit();
|
99 |
101 |
}
|
100 |
102 |
env = saved_env;
|
101 |
103 |
}
|
... | ... | |
229 |
231 |
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
230 |
232 |
int is_user, int is_softmmu)
|
231 |
233 |
{
|
232 |
|
int exception = 0;
|
233 |
234 |
target_ulong virt_addr;
|
234 |
235 |
target_phys_addr_t paddr;
|
235 |
236 |
unsigned long vaddr;
|
... | ... | |
248 |
249 |
env->mmuregs[3] |= (access_index << 5) | (error_code << 2) | 2;
|
249 |
250 |
env->mmuregs[4] = address; /* Fault address register */
|
250 |
251 |
|
251 |
|
if (env->mmuregs[0] & MMU_NF || env->psret == 0) // No fault
|
252 |
|
return 0;
|
253 |
|
env->exception_index = exception;
|
254 |
|
env->error_code = error_code;
|
255 |
|
return error_code;
|
|
252 |
if ((env->mmuregs[0] & MMU_NF) || env->psret == 0) {
|
|
253 |
// No fault
|
|
254 |
cpu_abort(env, "Unsupported MMU no fault case");
|
|
255 |
}
|
|
256 |
if (rw & 2)
|
|
257 |
env->exception_index = TT_TFAULT;
|
|
258 |
else
|
|
259 |
env->exception_index = TT_DFAULT;
|
|
260 |
return 1;
|
256 |
261 |
}
|
257 |
262 |
#endif
|
258 |
263 |
|
... | ... | |
289 |
294 |
env = saved_env;
|
290 |
295 |
}
|
291 |
296 |
|
292 |
|
void do_interrupt(int intno, int error_code)
|
|
297 |
void do_interrupt(int intno)
|
293 |
298 |
{
|
294 |
299 |
int cwp;
|
295 |
300 |
|
296 |
301 |
#ifdef DEBUG_PCALL
|
297 |
302 |
if (loglevel & CPU_LOG_INT) {
|
298 |
303 |
static int count;
|
299 |
|
fprintf(logfile, "%6d: v=%02x e=%04x pc=%08x npc=%08x SP=%08x\n",
|
300 |
|
count, intno, error_code,
|
|
304 |
fprintf(logfile, "%6d: v=%02x pc=%08x npc=%08x SP=%08x\n",
|
|
305 |
count, intno,
|
301 |
306 |
env->pc,
|
302 |
307 |
env->npc, env->regwptr[6]);
|
303 |
308 |
#if 1
|
... | ... | |
319 |
324 |
#endif
|
320 |
325 |
#if !defined(CONFIG_USER_ONLY)
|
321 |
326 |
if (env->psret == 0) {
|
322 |
|
cpu_abort(cpu_single_env, "Trap while interrupts disabled, Error state");
|
|
327 |
cpu_abort(cpu_single_env, "Trap 0x%02x while interrupts disabled, Error state", env->exception_index);
|
323 |
328 |
return;
|
324 |
329 |
}
|
325 |
330 |
#endif
|
326 |
331 |
env->psret = 0;
|
327 |
332 |
cwp = (env->cwp - 1) & (NWINDOWS - 1);
|
328 |
333 |
set_cwp(cwp);
|
329 |
|
if (intno & 0x80) {
|
330 |
|
env->regwptr[9] = env->pc;
|
331 |
|
env->regwptr[10] = env->npc;
|
332 |
|
} else {
|
333 |
|
/* XXX: this code is clearly incorrect - npc should have the
|
334 |
|
incorrect value */
|
335 |
|
env->regwptr[9] = env->pc - 4; // XXX?
|
336 |
|
env->regwptr[10] = env->pc;
|
337 |
|
}
|
|
334 |
env->regwptr[9] = env->pc;
|
|
335 |
env->regwptr[10] = env->npc;
|
338 |
336 |
env->psrps = env->psrs;
|
339 |
337 |
env->psrs = 1;
|
340 |
338 |
env->tbr = (env->tbr & TBR_BASE_MASK) | (intno << 4);
|