Mark Cave-Ayland wrote:
I'm not sure exactly what's happening, although it seems like some kind of I/O memory access is triggering the error before the neverland mapping is removed?
Even simpler than that: the reason the neverland code is being invoked is because env->psret == 0 (i.e. traps are disabled), not because the MMU is in no fault mode:
Breakpoint 1, cpu_sparc_handle_mmu_fault (env=0x10579f0, address=4028890828, rw=1, mmu_idx=1, is_softmmu=1) at /home/build/src/qemu/git/qemu/target-sparc/helper.c:261 261 vaddr = address & TARGET_PAGE_MASK; (gdb) p/x env->mmuregs[0] & MMU_NF No symbol "MMU_NF" in current context. (gdb) p/x env->mmuregs[0] & 2 $5 = 0x0 (gdb) p/x env->psret $6 = 0x0 (gdb) quit
Based upon this, it would seem that we shouldn't be invoking the data access exception if traps have been globally disabled. Blue, what do you make of the following patch?
diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c index be3c1e0..d3a9f28 100644 --- a/target-sparc/op_helper.c +++ b/target-sparc/op_helper.c @@ -4258,7 +4258,7 @@ void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec, env->mmuregs[3] |= 1; }
- if ((env->mmuregs[0] & MMU_E) && !(env->mmuregs[0] & MMU_NF)) { + if ((env->mmuregs[0] & MMU_E) && !(env->mmuregs[0] & MMU_NF) && (env->psret)) { if (is_exec) raise_exception(TT_CODE_ACCESS); else
This allows the Solaris 8 boot to proceed a couple of seconds longer, however it still falls over with a similar error but for trap 0x6 (window underflow) this time:
Configuration device id QEMU version 1 machine id 32 CPUs: 1 x FMI,MB86904 UUID: 00000000-0000-0000-0000-000000000000 Welcome to OpenBIOS v1.0 built on Oct 30 2010 16:27 Type 'help' for detailed information
0 > boot cdrom:d -vb Not a bootable ELF image Loading a.out image... Loaded 7680 bytes entry point is 0x4000 bootpath: /iommu/sbus/espdma/esp/sd@2,0:d
Jumping to entry point 00004000 for type 00000005... switching to new context: Size: 259040+54154+47486 Bytes device auxio size -1 SunOS Release 5.8 Version Generic_108528-09 32-bit Copyright 1983-2001 Sun Microsystems, Inc. All rights reserved. Ethernet address = 52:54:0:12:34:56 Using default device instance data qemu: fatal: Trap 0x06 while interrupts disabled, Error state pc: f00414a4 npc: f00413e0 General Registers: %g0-7: 00000000 00000003 00000000 f0041b74 000000ab f0243b88 00000000 f0244020
Current Register Window: %o0-7: f0000000 f0158f08 f0158f08 000000b7 f0243b88 00000000 f00423c8 f005bf58 %l0-7: 04400cc0 f005bf90 f005bf94 00000001 00000000 f0041b74 00000000 00000101 %i0-7: 00000009 f00424cc f1ff0514 000000b7 00000002 00000004 f0042470 f0041b74
Floating Point Registers: %f00: 000000000.000000 000000000.000000 000000000.000000 000000000.000000 %f04: 000000000.000000 000000000.000000 000000000.000000 000000000.000000 %f08: 000000000.000000 000000000.000000 000000000.000000 000000000.000000 %f12: 000000000.000000 000000000.000000 000000000.000000 000000000.000000 %f16: 000000000.000000 000000000.000000 000000000.000000 000000000.000000 %f20: 000000000.000000 000000000.000000 000000000.000000 000000000.000000 %f24: 000000000.000000 000000000.000000 000000000.000000 000000000.000000 %f28: 000000000.000000 000000000.000000 000000000.000000 000000000.000000 psr: 04400cc0 (icc: -Z-- SPE: SP-) wim: 00000003 fsr: 00080000 y: 00000000 Aborted
ATB,
Mark.