[OpenBIOS] SOLVED: the mystery of Solaris on SPARC32 and the missing Forth arguments

Blue Swirl blauwirbel at gmail.com
Sun Oct 31 17:34:49 CET 2010


On Sun, Oct 31, 2010 at 1:07 PM, Mark Cave-Ayland
<mark.cave-ayland at siriusit.co.uk> wrote:
> 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?

This is not in line with the V8 spec. "If ET=0 and a precise trap
occurs, the processor enters the error_mode state and
halts execution."

Maybe the unassigned accesses shouldn't cause any faults. Or perhaps
unassigned access is triggered where it shouldn't,
do_unassigned_access() is called from several places, not only from
normal load/store path.

> 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 at 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

0x06 = window underflow. This shouldn't happen.

> 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.
>
> --
> Mark Cave-Ayland - Senior Technical Architect
> PostgreSQL - PostGIS
> Sirius Corporation plc - control through freedom
> http://www.siriusit.co.uk
> t: +44 870 608 0063
>
> Sirius Labs: http://www.siriusit.co.uk/labs
>
> --
> OpenBIOS                 http://openbios.org/
> Mailinglist:  http://lists.openbios.org/mailman/listinfo
> Free your System - May the Forth be with you
>



More information about the OpenBIOS mailing list