All of lore.kernel.org
 help / color / mirror / Atom feed
* Emulating Solaris 10 on SPARC64 sun4u
@ 2020-02-05  6:31 jasper.lowell
  2020-02-05 17:33 ` Dr. David Alan Gilbert
  2020-02-09 11:26 ` Mark Cave-Ayland
  0 siblings, 2 replies; 30+ messages in thread
From: jasper.lowell @ 2020-02-05  6:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: mark.cave-ayland, atar4qemu

[-- Attachment #1: Type: text/plain, Size: 5084 bytes --]

I'm currently working towards emulating Solaris 10 on sun4u.

The Solaris 10 ISO image I am attempting to boot is the one from the Oracle
download page at https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
Image: sol-10-u11-ga-sparc-dvd.iso
MD5:   53e8b066f7f250ce2fd2cef063f8072b

I am using QEMU commit 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.

The command I am using to run QEMU is:
./qemu/sparc64-softmmu/qemu-system-sparc64 -bios ./openbios/obj-sparc64/openbios-builtin.elf -cdrom ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m 3G

```
CPUs: 1 x SUNW,UltraSPARC-IIi
UUID: 00000000-0000-0000-0000-000000000000
Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
  Type 'help' for detailed information
Trying cdrom:f...
Not a bootable ELF image
Not a bootable a.out image

Loading FCode image...
Loaded 7420 bytes
entry point is 0x4000
Evaluating FCode...
Evaluating FCode...
Ignoring failed claim for va 1000000 memsz af6d6!
Ignoring failed claim for va 1402000 memsz 4dcc8!
Ignoring failed claim for va 1800000 memsz 510c8!
SunOS Release 5.10 Version Generic_147147-26 64-bit
Copyright (c) 1983, 2013, Oracle and/or its affiliates. All rights reserved.
could not find debugger-vocabulary-hook>threads:interpret: exception -13 caught
interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
\ All rights reserved.
\
\ ident "@(#)data64.fth  1.3     00/07/17 SMI"

hex

only forth also definitions
vocabulary kdbg-words
also kdbg-words definitions

defer p@
defer p!
['] x@ is p@
['] x! is p!

8 constant ptrsize

d# 32 constant nbitsminor
h# ffffffff constant maxmin
\
\ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
\ Use is subject to license terms.
\

\ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"

h# 7ff constant v9bias
h# unix-tte:interpret: exception -13 caught
interpret ' unix-tte is va>tte-data failed with error ffffffffffffffed
WARNING: consconfig: cannot find driver for screen device /pci@1fe,0/pci@1,1/QEMU,VGA@2
Configuring devices.
WARNING: Interrupt not seen after set_features
Using RPC Bootparams for network configuration information.
Attempting to configure interface hme0...
WARNING: Power off requested from power button or SC, powering down the system!
Skipped interface hme0
svc:/system/filesystem/local:default: WARNING: /usr/sbin/zfs mount -a failed: one or more file systems failed to mount
Serial console, reverting to text install
Beginning system identification...
Searching for configuration file(s)...
Search complete.
Discovering additional network configuration...
```

The installation menu is shown after but the console is unresponsive.

After some debugging, it looks like the QEMU front-end is correctly filling
the serial receive buffer with characters, and then starts dropping them once
the number of characters in the buffer reach the interrupt level. The interrupt
level happens to be 1 when booting Solaris 10. This looks like normal behaviour
to me.

I started looking at why the serial receive buffer might not be consumed and
considered that interrupts might not be being raised correctly. I ran with
tracing and there were no interrupts for IRQ 0x2b like there are when using
OpenBSD. When inspecting the registers of the serial device it looks like the
Interrupt Enable Register is set to zero.

If Solaris 10 was using the device is polling mode, it should be reading the RBR
or at least the LSR. When tracing serial_ioport_read and serial_ioport_write,
once the menu is hit, I don't see any read or writes to the serial device
registers despite me trying to send characters and use the menu.

The driver Solaris 10 is using for the device appears to be similar/same as
/usr/src/uts/sun4/io/su_driver.c in the OpenSolaris code found at https://github.com/nxmirrors/onnv.

```
asy->asy_hwtype = ASY16550AF;
OUTB(FIFOR, 0x00); /* clear fifo register */
asy->asy_trig_level = 0x00; /* sets the fifo Threshold to 1 */

/* set/Enable FIFO */
OUTB(FIFOR, FIFO_ON | FIFODMA | FIFOTXFLSH | FIFORXFLSH |
(asy->asy_trig_level & 0xff));

if ((INB(ISR) & 0xc0) == 0xc0)
    asy->asy_use_fifo = FIFO_ON; /* QEMU REACHES HERE. */
else {
    asy->asy_hwtype = ASY8250;
    OUTB(FIFOR, 0x00); /* NO FIFOs */
    asy->asy_trig_level = 0;
}
```

From what I can tell when tracing serial_ioport_write and serial_ioport_read,
Solaris 10 correctly identifies the serial device and successfully attaches it.
In the asyattach function (OpenSolaris driver), interrupts are disabled by zeroing the
Interrupt Enable Register. From what I'm reading in OpenSolaris source code, interrupts
are reenabled when the device is "opened". This seems like consistent and
correct behaviour though I'm not sure why the device is not being opened to be
used by the serial console.

Is this an issue anyone else has tried to debug?
Are there any leads that I can follow up on for why the serial console becomes unresponsive
on Solaris 10?

Thanks,
Lowell.

[-- Attachment #2: Type: text/html, Size: 25019 bytes --]

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-05  6:31 Emulating Solaris 10 on SPARC64 sun4u jasper.lowell
@ 2020-02-05 17:33 ` Dr. David Alan Gilbert
  2020-02-07  5:43   ` jasper.lowell
  2020-02-09 11:26 ` Mark Cave-Ayland
  1 sibling, 1 reply; 30+ messages in thread
From: Dr. David Alan Gilbert @ 2020-02-05 17:33 UTC (permalink / raw)
  To: jasper.lowell; +Cc: mark.cave-ayland, qemu-devel, atar4qemu

* jasper.lowell@bt.com (jasper.lowell@bt.com) wrote:
> I'm currently working towards emulating Solaris 10 on sun4u.
> 
> The Solaris 10 ISO image I am attempting to boot is the one from the Oracle
> download page at https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
> Image: sol-10-u11-ga-sparc-dvd.iso
> MD5:   53e8b066f7f250ce2fd2cef063f8072b
> 
> I am using QEMU commit 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
> 
> The command I am using to run QEMU is:
> ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios ./openbios/obj-sparc64/openbios-builtin.elf -cdrom ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m 3G
> 
> ```
> CPUs: 1 x SUNW,UltraSPARC-IIi
> UUID: 00000000-0000-0000-0000-000000000000
> Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
>   Type 'help' for detailed information
> Trying cdrom:f...
> Not a bootable ELF image
> Not a bootable a.out image
> 
> Loading FCode image...
> Loaded 7420 bytes
> entry point is 0x4000
> Evaluating FCode...
> Evaluating FCode...
> Ignoring failed claim for va 1000000 memsz af6d6!
> Ignoring failed claim for va 1402000 memsz 4dcc8!
> Ignoring failed claim for va 1800000 memsz 510c8!
> SunOS Release 5.10 Version Generic_147147-26 64-bit
> Copyright (c) 1983, 2013, Oracle and/or its affiliates. All rights reserved.
> could not find debugger-vocabulary-hook>threads:interpret: exception -13 caught
> interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
> \ All rights reserved.
> \
> \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
> 
> hex
> 
> only forth also definitions
> vocabulary kdbg-words
> also kdbg-words definitions
> 
> defer p@
> defer p!
> ['] x@ is p@
> ['] x! is p!
> 
> 8 constant ptrsize
> 
> d# 32 constant nbitsminor
> h# ffffffff constant maxmin
> \
> \ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
> \ Use is subject to license terms.
> \
> 
> \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
> 
> h# 7ff constant v9bias
> h# unix-tte:interpret: exception -13 caught
> interpret ' unix-tte is va>tte-data failed with error ffffffffffffffed
> WARNING: consconfig: cannot find driver for screen device /pci@1fe,0/pci@1,1/QEMU,VGA@2
> Configuring devices.
> WARNING: Interrupt not seen after set_features

GIven that your problem below is looking like an interrupt related
problem, have you figured out where that's coming from?

Dave

--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK



^ permalink raw reply	[flat|nested] 30+ messages in thread

* RE: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-05 17:33 ` Dr. David Alan Gilbert
@ 2020-02-07  5:43   ` jasper.lowell
  2020-02-08  0:03     ` BALATON Zoltan
  0 siblings, 1 reply; 30+ messages in thread
From: jasper.lowell @ 2020-02-07  5:43 UTC (permalink / raw)
  To: dgilbert; +Cc: mark.cave-ayland, qemu-devel, atar4qemu

I haven't figured out where that is coming from.
The error doesn't look like it's in the OpenSolaris source code so I don't have any context behind it.
The error does show up here: https://docs.oracle.com/cd/E23824_01/html/821-1475/uata-7d.html so it might be related to the IDE controller.
The behaviour of Solaris 10 does make me think there is a problem with interrupts but OpenBSD works just fine on this architecture.

I've also tried using kmdb (Solaris kernel debugger) by running using `boot cdrom -kvd` at the OpenBIOS prompt.
I thought this might help diagnose the problem.
After the kernel debugger prompt occurs and I type `::cont` to continue, the system hangs completely.

Thanks,
Lowell.

-----Original Message-----
From: Dr. David Alan Gilbert <dgilbert@redhat.com> 
Sent: Thursday, 6 February 2020 4:33 AM
To: Lowell,J,Jasper,VIM R <jasper.lowell@bt.com>
Cc: qemu-devel@nongnu.org; mark.cave-ayland@ilande.co.uk; atar4qemu@gmail.com
Subject: Re: Emulating Solaris 10 on SPARC64 sun4u

* jasper.lowell@bt.com (jasper.lowell@bt.com) wrote:
> I'm currently working towards emulating Solaris 10 on sun4u.
> 
> The Solaris 10 ISO image I am attempting to boot is the one from the 
> Oracle download page at https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
> Image: sol-10-u11-ga-sparc-dvd.iso
> MD5:   53e8b066f7f250ce2fd2cef063f8072b
> 
> I am using QEMU commit 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
> 
> The command I am using to run QEMU is:
> ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios 
> ./openbios/obj-sparc64/openbios-builtin.elf -cdrom 
> ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m 3G
> 
> ```
> CPUs: 1 x SUNW,UltraSPARC-IIi
> UUID: 00000000-0000-0000-0000-000000000000
> Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
>   Type 'help' for detailed information Trying cdrom:f...
> Not a bootable ELF image
> Not a bootable a.out image
> 
> Loading FCode image...
> Loaded 7420 bytes
> entry point is 0x4000
> Evaluating FCode...
> Evaluating FCode...
> Ignoring failed claim for va 1000000 memsz af6d6!
> Ignoring failed claim for va 1402000 memsz 4dcc8!
> Ignoring failed claim for va 1800000 memsz 510c8!
> SunOS Release 5.10 Version Generic_147147-26 64-bit Copyright (c) 
> 1983, 2013, Oracle and/or its affiliates. All rights reserved.
> could not find debugger-vocabulary-hook>threads:interpret: exception 
> -13 caught interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
> \ All rights reserved.
> \
> \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
> 
> hex
> 
> only forth also definitions
> vocabulary kdbg-words
> also kdbg-words definitions
> 
> defer p@
> defer p!
> ['] x@ is p@
> ['] x! is p!
> 
> 8 constant ptrsize
> 
> d# 32 constant nbitsminor
> h# ffffffff constant maxmin
> \
> \ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
> \ Use is subject to license terms.
> \
> 
> \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
> 
> h# 7ff constant v9bias
> h# unix-tte:interpret: exception -13 caught interpret ' unix-tte is 
> va>tte-data failed with error ffffffffffffffed
> WARNING: consconfig: cannot find driver for screen device 
> /pci@1fe,0/pci@1,1/QEMU,VGA@2 Configuring devices.
> WARNING: Interrupt not seen after set_features

GIven that your problem below is looking like an interrupt related problem, have you figured out where that's coming from?

Dave

--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK



^ permalink raw reply	[flat|nested] 30+ messages in thread

* RE: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-07  5:43   ` jasper.lowell
@ 2020-02-08  0:03     ` BALATON Zoltan
  2020-02-10 15:38       ` BALATON Zoltan
  0 siblings, 1 reply; 30+ messages in thread
From: BALATON Zoltan @ 2020-02-08  0:03 UTC (permalink / raw)
  To: jasper.lowell
  Cc: John Snow, mark.cave-ayland, dgilbert, atar4qemu, qemu-devel

Hello,

On Fri, 7 Feb 2020, jasper.lowell@bt.com wrote:
> I haven't figured out where that is coming from.
> The error doesn't look like it's in the OpenSolaris source code so I don't have any context behind it.
> The error does show up here: https://docs.oracle.com/cd/E23824_01/html/821-1475/uata-7d.html so it might be related to the IDE controller.
> The behaviour of Solaris 10 does make me think there is a problem with interrupts but OpenBSD works just fine on this architecture.

Not sure if my problem I see on other machine emulation I'm working on is 
related at all but there's a possibility it might be. I got this with 
different arch (ppc but could also reproduce something similar with mips) 
and ide controller emulation (via-ide) but the PCI bmdma code is shared by 
CMD646, via-ide and sii3112 and also the ide-cdrom emulation is the same 
so if there's a bug in these that could cause similar problems for 
different components. Or it could be that we get similar symptoms due to 
different reasons in which case sorry for the distracion but maybe we can 
learn from the experience of each other even in that case.

What I get is tracked here:

https://osdn.net/projects/qmiga/ticket/38949

(background on emulated machine: https://osdn.net/projects/qmiga/wiki/SubprojectPegasos2 )

Originally I had both Linux and MorphOS fail after enabling BMDMA before I 
had interrupt controller emulation (so that means it could be a problem 
with that in your case as well so something to check). Now that I've 
implemented interrupts Linux boots with DMA from CDROM but MorphOS is 
still not happy. You saw OpenBSD work but Solaris not so that could be 
similar in case the drivers do something differently or one relies on 
something the other does not care about. It could also be that since Linux 
is working, BMDMA and/or ide-cdrom may not emulate something other drivers 
may need which could cause simlar problems on multiple archs/emulations 
but I could be wrong about that.

An advice I got before to debug this is to try enabling ide traces:

https://lists.nongnu.org/archive/html/qemu-devel/2019-03/msg05656.html

I've tried that but lacking detailed knowledge about ide controllers I 
could not make much sense of the results so far.

Not sure how much help this is but maybe if more people are looking at it 
we might find something out. I've cc'd the IDE maintainer in case he has 
something more useful to add.

Regards,
BALATON Zoltan

> I've also tried using kmdb (Solaris kernel debugger) by running using `boot cdrom -kvd` at the OpenBIOS prompt.
> I thought this might help diagnose the problem.
> After the kernel debugger prompt occurs and I type `::cont` to continue, the system hangs completely.
>
> Thanks,
> Lowell.
>
> -----Original Message-----
> From: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Sent: Thursday, 6 February 2020 4:33 AM
> To: Lowell,J,Jasper,VIM R <jasper.lowell@bt.com>
> Cc: qemu-devel@nongnu.org; mark.cave-ayland@ilande.co.uk; atar4qemu@gmail.com
> Subject: Re: Emulating Solaris 10 on SPARC64 sun4u
>
> * jasper.lowell@bt.com (jasper.lowell@bt.com) wrote:
>> I'm currently working towards emulating Solaris 10 on sun4u.
>>
>> The Solaris 10 ISO image I am attempting to boot is the one from the
>> Oracle download page at https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
>> Image: sol-10-u11-ga-sparc-dvd.iso
>> MD5:   53e8b066f7f250ce2fd2cef063f8072b
>>
>> I am using QEMU commit 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
>>
>> The command I am using to run QEMU is:
>> ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios
>> ./openbios/obj-sparc64/openbios-builtin.elf -cdrom
>> ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m 3G
>>
>> ```
>> CPUs: 1 x SUNW,UltraSPARC-IIi
>> UUID: 00000000-0000-0000-0000-000000000000
>> Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
>>   Type 'help' for detailed information Trying cdrom:f...
>> Not a bootable ELF image
>> Not a bootable a.out image
>>
>> Loading FCode image...
>> Loaded 7420 bytes
>> entry point is 0x4000
>> Evaluating FCode...
>> Evaluating FCode...
>> Ignoring failed claim for va 1000000 memsz af6d6!
>> Ignoring failed claim for va 1402000 memsz 4dcc8!
>> Ignoring failed claim for va 1800000 memsz 510c8!
>> SunOS Release 5.10 Version Generic_147147-26 64-bit Copyright (c)
>> 1983, 2013, Oracle and/or its affiliates. All rights reserved.
>> could not find debugger-vocabulary-hook>threads:interpret: exception
>> -13 caught interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
>> \ All rights reserved.
>> \
>> \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
>>
>> hex
>>
>> only forth also definitions
>> vocabulary kdbg-words
>> also kdbg-words definitions
>>
>> defer p@
>> defer p!
>> ['] x@ is p@
>> ['] x! is p!
>>
>> 8 constant ptrsize
>>
>> d# 32 constant nbitsminor
>> h# ffffffff constant maxmin
>> \
>> \ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
>> \ Use is subject to license terms.
>> \
>>
>> \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
>>
>> h# 7ff constant v9bias
>> h# unix-tte:interpret: exception -13 caught interpret ' unix-tte is
>> va>tte-data failed with error ffffffffffffffed
>> WARNING: consconfig: cannot find driver for screen device
>> /pci@1fe,0/pci@1,1/QEMU,VGA@2 Configuring devices.
>> WARNING: Interrupt not seen after set_features
>
> GIven that your problem below is looking like an interrupt related problem, have you figured out where that's coming from?
>
> Dave
>
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
>
>
>


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-05  6:31 Emulating Solaris 10 on SPARC64 sun4u jasper.lowell
  2020-02-05 17:33 ` Dr. David Alan Gilbert
@ 2020-02-09 11:26 ` Mark Cave-Ayland
  2020-02-19  3:42   ` jasper.lowell
  2020-05-07 14:29   ` jasper.lowell
  1 sibling, 2 replies; 30+ messages in thread
From: Mark Cave-Ayland @ 2020-02-09 11:26 UTC (permalink / raw)
  To: jasper.lowell, qemu-devel; +Cc: atar4qemu

On 05/02/2020 06:31, jasper.lowell@bt.com wrote:

> I'm currently working towards emulating Solaris 10 on sun4u.
> 
>  
> 
> The Solaris 10 ISO image I am attempting to boot is the one from the Oracle
> 
> download page at
> https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
> 
> Image: sol-10-u11-ga-sparc-dvd.iso
> 
> MD5:   53e8b066f7f250ce2fd2cef063f8072b
> 
>  
> 
> I am using QEMU commit 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
> 
>  
> 
> The command I am using to run QEMU is:
> 
> ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios
> ./openbios/obj-sparc64/openbios-builtin.elf -cdrom
> ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m 3G
> 
>  
> 
> ```
> 
> CPUs: 1 x SUNW,UltraSPARC-IIi
> 
> UUID: 00000000-0000-0000-0000-000000000000
> 
> Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
> 
>   Type 'help' for detailed information
> 
> Trying cdrom:f...
> 
> Not a bootable ELF image
> 
> Not a bootable a.out image
> 
>  
> 
> Loading FCode image...
> 
> Loaded 7420 bytes
> 
> entry point is 0x4000
> 
> Evaluating FCode...
> 
> Evaluating FCode...
> 
> Ignoring failed claim for va 1000000 memsz af6d6!
> 
> Ignoring failed claim for va 1402000 memsz 4dcc8!
> 
> Ignoring failed claim for va 1800000 memsz 510c8!
> 
> SunOS Release 5.10 Version Generic_147147-26 64-bit
> 
> Copyright (c) 1983, 2013, Oracle and/or its affiliates. All rights reserved.
> 
> could not find debugger-vocabulary-hook>threads:interpret: exception -13 caught
> 
> interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
> 
> \ All rights reserved.
> 
> \
> 
> \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
> 
>  
> 
> hex
> 
>  
> 
> only forth also definitions
> 
> vocabulary kdbg-words
> 
> also kdbg-words definitions
> 
>  
> 
> defer p@
> 
> defer p!
> 
> ['] x@ is p@
> 
> ['] x! is p!
> 
>  
> 
> 8 constant ptrsize
> 
>  
> 
> d# 32 constant nbitsminor
> 
> h# ffffffff constant maxmin
> 
> \
> 
> \ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
> 
> \ Use is subject to license terms.
> 
> \
> 
>  
> 
> \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
> 
>  
> 
> h# 7ff constant v9bias
> 
> h# unix-tte:interpret: exception -13 caught
> 
> interpret ' unix-tte is va>tte-data failed with error ffffffffffffffed
> 
> WARNING: consconfig: cannot find driver for screen device /pci@1fe,0/pci@1,1/QEMU,VGA@2
> 
> Configuring devices.
> 
> WARNING: Interrupt not seen after set_features
> 
> Using RPC Bootparams for network configuration information.
> 
> Attempting to configure interface hme0...
> 
> WARNING: Power off requested from power button or SC, powering down the system!
> 
> Skipped interface hme0
> 
> svc:/system/filesystem/local:default: WARNING: /usr/sbin/zfs mount -a failed: one or
> more file systems failed to mount
> 
> Serial console, reverting to text install
> 
> Beginning system identification...
> 
> Searching for configuration file(s)...
> 
> Search complete.
> 
> Discovering additional network configuration...
> 
> ```
> 
>  
> 
> The installation menu is shown after but the console is unresponsive.
> 
>  
> 
> After some debugging, it looks like the QEMU front-end is correctly filling
> 
> the serial receive buffer with characters, and then starts dropping them once
> 
> the number of characters in the buffer reach the interrupt level. The interrupt
> 
> level happens to be 1 when booting Solaris 10. This looks like normal behaviour
> 
> to me.
> 
>  
> 
> I started looking at why the serial receive buffer might not be consumed and
> 
> considered that interrupts might not be being raised correctly. I ran with
> 
> tracing and there were no interrupts for IRQ 0x2b like there are when using
> 
> OpenBSD. When inspecting the registers of the serial device it looks like the
> 
> Interrupt Enable Register is set to zero.
> 
>  
> 
> If Solaris 10 was using the device is polling mode, it should be reading the RBR
> 
> or at least the LSR. When tracing serial_ioport_read and serial_ioport_write,
> 
> once the menu is hit, I don't see any read or writes to the serial device
> 
> registers despite me trying to send characters and use the menu.
> 
>  
> 
> The driver Solaris 10 is using for the device appears to be similar/same as
> 
> /usr/src/uts/sun4/io/su_driver.c in the OpenSolaris code found at
> https://github.com/nxmirrors/onnv.
> 
>  
> 
> ```
> 
> asy->asy_hwtype = ASY16550AF;
> 
> OUTB(FIFOR, 0x00); /* clear fifo register */
> 
> asy->asy_trig_level = 0x00; /* sets the fifo Threshold to 1 */
> 
>  
> 
> /* set/Enable FIFO */
> 
> OUTB(FIFOR, FIFO_ON | FIFODMA | FIFOTXFLSH | FIFORXFLSH |
> 
> (asy->asy_trig_level & 0xff));
> 
>  
> 
> if ((INB(ISR) & 0xc0) == 0xc0)
> 
>     asy->asy_use_fifo = FIFO_ON; /* QEMU REACHES HERE. */
> 
> else {
> 
>     asy->asy_hwtype = ASY8250;
> 
>     OUTB(FIFOR, 0x00); /* NO FIFOs */
> 
>     asy->asy_trig_level = 0;
> 
> }
> 
> ```
> 
>  
> 
> From what I can tell when tracing serial_ioport_write and serial_ioport_read,
> 
> Solaris 10 correctly identifies the serial device and successfully attaches it.
> 
> In the asyattach function (OpenSolaris driver), interrupts are disabled by zeroing the
> 
> Interrupt Enable Register. From what I'm reading in OpenSolaris source code, interrupts
> 
> are reenabled when the device is "opened". This seems like consistent and
> 
> correct behaviour though I'm not sure why the device is not being opened to be
> 
> used by the serial console.
> 
>  
> 
> Is this an issue anyone else has tried to debug?
> 
> Are there any leads that I can follow up on for why the serial console becomes
> unresponsive
> 
> on Solaris 10?

It has been a while since I've looked at booting Solaris >= 10 but certainly the
messages above about set_features and the frozen console suggest that something is
going amiss with interrupt routing, although since Linux and NetBSD were fine the
last time I ran my OpenBIOS release tests then Solaris must be doing something
different here.

Note that the serial interrupts are routed from the ebus into sabre so the first
thing to check would be that the end-to-end routing from device to CPU looks correct
when using Solaris.


ATB,

Mark.


^ permalink raw reply	[flat|nested] 30+ messages in thread

* RE: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-08  0:03     ` BALATON Zoltan
@ 2020-02-10 15:38       ` BALATON Zoltan
  2020-02-10 19:04         ` John Snow
  2020-02-25 22:12         ` Emulating Solaris 10 on SPARC64 sun4u BALATON Zoltan
  0 siblings, 2 replies; 30+ messages in thread
From: BALATON Zoltan @ 2020-02-10 15:38 UTC (permalink / raw)
  To: jasper.lowell
  Cc: mark.cave-ayland, John Snow, dgilbert, atar4qemu, qemu-devel

On Sat, 8 Feb 2020, BALATON Zoltan wrote:
> Not sure if my problem I see on other machine emulation I'm working on is 
> related at all but there's a possibility it might be. I got this with 
> different arch (ppc but could also reproduce something similar with mips) and 
> ide controller emulation (via-ide) but the PCI bmdma code is shared by 
> CMD646, via-ide and sii3112 and also the ide-cdrom emulation is the same so 
> if there's a bug in these that could cause similar problems for different 
> components. Or it could be that we get similar symptoms due to different 
> reasons in which case sorry for the distracion but maybe we can learn from 
> the experience of each other even in that case.
>
> What I get is tracked here:
>
> https://osdn.net/projects/qmiga/ticket/38949
>
> (background on emulated machine: 
> https://osdn.net/projects/qmiga/wiki/SubprojectPegasos2 )
>
> Originally I had both Linux and MorphOS fail after enabling BMDMA before I 
> had interrupt controller emulation (so that means it could be a problem with 
> that in your case as well so something to check). Now that I've implemented 
> interrupts Linux boots with DMA from CDROM but MorphOS is still not happy.

I could now also reproduce the same with AmigaOS4 on pegasos2 where I got 
same missing interrupt problem:

---> Port 1
IOBase 00001010, AltBase 0000101E
bmcr_base 00001028
MMIOBase 00000000
Config not forced, scanning ...
1 device(s) on port
  0 Master : 'ATAPI'
  1 Slave  : 'unknown type'
Starting 'peg2ide.device - chip 0 port 1' task
bmdma_addr_write data: 0x0000000002290000
Trying to configure unit 2

Hangs here waiting for interrupt which does not seem to arrive, then:

[peg2ide/irq_wait] timed out
[peg2ide/exec_pio_data_in_cmd] <- here
[peg2ide/ata_read_drive_properties] unit 2 returned error 255, failbits 00000000h, timeout 0
Trying to configure unit 3
[peg2ide/ata_read_drive_properties] After-reset signature invalid for unit 3

So there's definitely a problem with interrupts but not sure where. Also 
don't know why it detects an unknown slave device which then it decides is 
invalid. Maybe this is normal on an IDE bus with only one device or is it 
a problem in emulation?

To locate the problem further I've then tried the same with ide-cd 
connected to the sii3112 SATA emulation that also shares the same IDE 
BMDMA code with CMD646 and via-ide but as a PCI card the interrupt routing 
is different. So if I don't get the problem with it then that can prove 
common code is correct. If I get the problem it may come from common code 
or be another interrupt routing problem.

I did not have PCI interrupts correctly implemented in pegasos2 yet so I 
had to fix that first but I'm not sure it's correct yet. I got similar 
results but the interrupt seems to fire in this case but does not get to 
the CPU as it does not seem to be enabled:

sii3112ide.device 53.3 (05.02.2009)
Found chip #0
---> Port 0
IOBase 00001030, AltBase 0000103A
bmcr_base 00001090
MMIOBase 81004000
Config not forced, scanning ...
sii3112_write bmdma: write (size 1) 0x8a : 0x02
sii3112_write bmdma: write (size 1) 0x86 : 0x00
sii3112_write bmdma: write (size 1) 0x82 : 0x55
sii3112_write bmdma: write (size 1) 0x83 : 0xaa
sii3112_write bmdma: write (size 1) 0x82 : 0xaa
sii3112_write bmdma: write (size 1) 0x83 : 0x55
sii3112_write bmdma: write (size 1) 0x82 : 0x55
sii3112_write bmdma: write (size 1) 0x83 : 0xaa
sii3112_read bmdma: read (size 1) 0x82 : 0x55
sii3112_read bmdma: read (size 1) 0x83 : 0xaa
sii3112_write bmdma: write (size 1) 0x86 : 0x00
sii3112_write bmdma: write (size 1) 0x8a : 0x06
sii3112_write bmdma: write (size 1) 0x8a : 0x02
sii3112_set_irq channel 0 level 0
sii3112_read bmdma: read (size 1) 0x87 : 0x00
sii3112_write bmdma: write (size 1) 0x86 : 0x00
sii3112_write bmdma: write (size 1) 0x86 : 0x00
sii3112_write bmdma: write (size 1) 0x86 : 0x00
sii3112_read bmdma: read (size 1) 0x82 : 0x01
sii3112_read bmdma: read (size 1) 0x83 : 0x01
sii3112_read bmdma: read (size 1) 0x84 : 0x14
sii3112_read bmdma: read (size 1) 0x85 : 0xeb
sii3112_set_irq channel 0 level 0
sii3112_read bmdma: read (size 1) 0x87 : 0x00
sii3112_write bmdma: write (size 1) 0x86 : 0x00
1 device(s) on port
  0 Master : 'ATAPI'
Starting 'sii3112ide.device - chip 0 port 0' task
sii3112_write bmdma: write (size 4) 0x4 : 0x22c0000
bmdma_addr_write data: 0x00000000022c0000
Installing handler for irq 25
mv64361_gpp_irq(0x5654b950c1a0, 31, 1) levels=80000000 mask=80000000
mv64361_update_irq(0x5654b950c1a0, 59, 1)
mv64361_gpp_irq(0x5654b950c1a0, 31, 0) levels=0
mv64361_update_irq(0x5654b950c1a0, 59, 0)
Unassigned mem read 00000000810040a1
Trying to configure unit 0
sii3112_write bmdma: write (size 1) 0x86 : 0x00
sii3112_set_irq channel 0 level 0
sii3112_read bmdma: read (size 1) 0x87 : 0x00
sii3112_write bmdma: write (size 1) 0x8a : 0x00
sii3112_write bmdma: write (size 1) 0x81 : 0x00
sii3112_write bmdma: write (size 1) 0x82 : 0x00
sii3112_write bmdma: write (size 1) 0x83 : 0x00
sii3112_write bmdma: write (size 1) 0x84 : 0x00
sii3112_write bmdma: write (size 1) 0x85 : 0x00
sii3112_write bmdma: write (size 1) 0x86 : 0x40
sii3112_write bmdma: write (size 1) 0x87 : 0xa1
sii3112_set_irq channel 0 level 1
mv64361_pcihost_set_irq(0x5654b950ce00, 1, 1)
mv64361_gpp_irq(0x5654b950c1a0, 13, 1) levels=2000 mask=80000000

[sii3112ide/irq_wait] timed out
[sii3112ide/exec_pio_data_in_cmd] <- here
sii3112_set_irq channel 0 level 0
mv64361_pcihost_set_irq(0x5654b950ce00, 1, 0)
mv64361_gpp_irq(0x5654b950c1a0, 13, 0) levels=0
mv64361_update_irq(0x5654b950c1a0, 57, 0)
sii3112_read bmdma: read (size 1) 0x87 : 0x58
[sii3112ide/ata_read_drive_properties] unit 0 returned error 255, failbits 00000000h, timeout 0

So here I see there's an interrupt raised by the card which does also get 
to the mv64361 system controller that's also the interrupt controller on 
pegasos2 but CPU IRQ is not raised because the corresponding mask bit is 
not set for some reason.

This suggests the common IDE bmdma and ide-cd code is likely OK and 
problem is somewhere in irq routing. What's relevant for this thread and 
sparc64 is that then you should also check interrupt controller and 
routing if an interrupt raised by the IDE controller could get to the CPU 
in your case as that could be where the problem is and maybe not in 
common code as I've suspected before.

For my case I'm not sure. On pegasos2 irqs come in via the mv64361 gpio 
ports, the irq pin of the VIA south bridge (containing via-ide and the 16 
isa interrupts) is connected to gpp_irq 31 while the PCI INTA-D lines are 
connected to gpp_irq 12-15. These are mapped to interrupt cause bits 56-59 
so that gpp0-7 gets 56, gpp8-15 57, gpp16-23 58 and gpp 24-31 gets 59. 
Thus the IRQ numbers seem correct in the above but the expected interrupt 
on 59 is only raised when the sii3112 driver is insalling its interrupt 
handler (not sure why does it call that irq 25?). This should have been 
raised when talking to device on via-ide much earlier. Then when talking 
to device on sii3112 the interrupt arrives from PCI on the expected 57 but 
CPU IRQ is not raised because it is masked, only gpp 31 is enabled. This 
supposedly works on real hardware but don't get why it doesn't on my 
emulation. It's probably a bug in the IRQ controller emulation then and 
topic for another thread and other platforms that similar error happens 
may also have bugs in their IRQ routing.

Regards,
BALATON Zoltan


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-10 15:38       ` BALATON Zoltan
@ 2020-02-10 19:04         ` John Snow
  2020-02-10 22:32           ` Missing IRQ with bmdma on ppc/mips/sparc? (was: Re: Emulating Solaris 10 on SPARC64 sun4u) BALATON Zoltan
  2020-02-25 20:55           ` IDE IRQ problem after UDMA enabled " BALATON Zoltan
  2020-02-25 22:12         ` Emulating Solaris 10 on SPARC64 sun4u BALATON Zoltan
  1 sibling, 2 replies; 30+ messages in thread
From: John Snow @ 2020-02-10 19:04 UTC (permalink / raw)
  To: BALATON Zoltan, jasper.lowell
  Cc: mark.cave-ayland, dgilbert, atar4qemu, qemu-devel



On 2/10/20 10:38 AM, BALATON Zoltan wrote:
> On Sat, 8 Feb 2020, BALATON Zoltan wrote:
>> Not sure if my problem I see on other machine emulation I'm working on
>> is related at all but there's a possibility it might be. I got this
>> with different arch (ppc but could also reproduce something similar
>> with mips) and ide controller emulation (via-ide) but the PCI bmdma
>> code is shared by CMD646, via-ide and sii3112 and also the ide-cdrom
>> emulation is the same so if there's a bug in these that could cause
>> similar problems for different components. Or it could be that we get
>> similar symptoms due to different reasons in which case sorry for the
>> distracion but maybe we can learn from the experience of each other
>> even in that case.
>>
>> What I get is tracked here:
>>
>> https://osdn.net/projects/qmiga/ticket/38949
>>
>> (background on emulated machine:
>> https://osdn.net/projects/qmiga/wiki/SubprojectPegasos2 )
>>
>> Originally I had both Linux and MorphOS fail after enabling BMDMA
>> before I had interrupt controller emulation (so that means it could be
>> a problem with that in your case as well so something to check). Now
>> that I've implemented interrupts Linux boots with DMA from CDROM but
>> MorphOS is still not happy.
> 
> I could now also reproduce the same with AmigaOS4 on pegasos2 where I
> got same missing interrupt problem:
> 
> ---> Port 1
> IOBase 00001010, AltBase 0000101E
> bmcr_base 00001028
> MMIOBase 00000000
> Config not forced, scanning ...
> 1 device(s) on port
>  0 Master : 'ATAPI'

"unit 2", I assume

>  1 Slave  : 'unknown type'

"unit 3", I assume

> Starting 'peg2ide.device - chip 0 port 1' task
> bmdma_addr_write data: 0x0000000002290000
> Trying to configure unit 2
> 
> Hangs here waiting for interrupt which does not seem to arrive, then:
> 
> [peg2ide/irq_wait] timed out
> [peg2ide/exec_pio_data_in_cmd] <- here
> [peg2ide/ata_read_drive_properties] unit 2 returned error 255, failbits
> 00000000h, timeout 0
> Trying to configure unit 3
> [peg2ide/ata_read_drive_properties] After-reset signature invalid for
> unit 3
> 
> So there's definitely a problem with interrupts but not sure where. Also
> don't know why it detects an unknown slave device which then it decides
> is invalid. Maybe this is normal on an IDE bus with only one device or
> is it a problem in emulation?
> 

I don't actually know myself. We *do* always have two IDEState objects
per port, but maybe we're letting some unknown state sneak through --
filling in a register improperly, perhaps?

It's probably not ide_ioport_read -- but I see complaints about the
reset signature too, so maybe we've gotten that wrong.

You can look at ide_set_signature to see how we set the drive
signatures; called from ide_reset (and many other places too)

I think ide_init_drive is only meant to be called on devices that
actually exist and are plugged in. It initializes drive_kind to one of
IDE_HD, IDE_CD, or IDE_CFATA -- empty or missing isn't an option here.

(Hm, this means it defaults to IDE_HD actually.)

The tricky thing is that IDEState belongs to the parent bus -- not the
drive object itself -- and the bus always has two slots.

We select between the two by setting bus->unit; and we don't appear to
do any kind of actual guarding that the drive actually exists.

(I suppose guests are free to issue commands to non-existant drives if
they want to, but they're not going to be able to perform work.)

...but ide_reset_bus calls ide_reset on both slots regardless of the
presence of a device or not.

(This is probably just a side effect of the interrupt getting lost and
having the guest try to reset the controller, then noticing weird state
after the reset.)

It sounds like the real problem is either in the bmdma controller (or
its unique interaction with hw/ide/core.c -- which is possible) or in
the interrupt routing somewhere else.

If you have any IDE traces from a hang, feel free to throw them up on a
pastebin for me to take a peek at; it might help for me to see the exact
sequence that causes a hang in QEMU's IDE terms to see if I can't
"reverse engineer" what the guest is hoping to have happen. Maybe I can
trace this to a bad register value.

(Hm, it's failing on pio_in? It's using PIO on an IDE drive with a DMA
controller? Is it failing to enable DMA and then failing to use PIO as a
backup too? Maybe there are two bugs.)

--js

> To locate the problem further I've then tried the same with ide-cd
> connected to the sii3112 SATA emulation that also shares the same IDE
> BMDMA code with CMD646 and via-ide but as a PCI card the interrupt
> routing is different. So if I don't get the problem with it then that
> can prove common code is correct. If I get the problem it may come from
> common code or be another interrupt routing problem.
> 
> I did not have PCI interrupts correctly implemented in pegasos2 yet so I
> had to fix that first but I'm not sure it's correct yet. I got similar
> results but the interrupt seems to fire in this case but does not get to
> the CPU as it does not seem to be enabled:
> 
> sii3112ide.device 53.3 (05.02.2009)
> Found chip #0
> ---> Port 0
> IOBase 00001030, AltBase 0000103A
> bmcr_base 00001090
> MMIOBase 81004000
> Config not forced, scanning ...
> sii3112_write bmdma: write (size 1) 0x8a : 0x02
> sii3112_write bmdma: write (size 1) 0x86 : 0x00
> sii3112_write bmdma: write (size 1) 0x82 : 0x55
> sii3112_write bmdma: write (size 1) 0x83 : 0xaa
> sii3112_write bmdma: write (size 1) 0x82 : 0xaa
> sii3112_write bmdma: write (size 1) 0x83 : 0x55
> sii3112_write bmdma: write (size 1) 0x82 : 0x55
> sii3112_write bmdma: write (size 1) 0x83 : 0xaa
> sii3112_read bmdma: read (size 1) 0x82 : 0x55
> sii3112_read bmdma: read (size 1) 0x83 : 0xaa
> sii3112_write bmdma: write (size 1) 0x86 : 0x00
> sii3112_write bmdma: write (size 1) 0x8a : 0x06
> sii3112_write bmdma: write (size 1) 0x8a : 0x02
> sii3112_set_irq channel 0 level 0
> sii3112_read bmdma: read (size 1) 0x87 : 0x00
> sii3112_write bmdma: write (size 1) 0x86 : 0x00
> sii3112_write bmdma: write (size 1) 0x86 : 0x00
> sii3112_write bmdma: write (size 1) 0x86 : 0x00
> sii3112_read bmdma: read (size 1) 0x82 : 0x01
> sii3112_read bmdma: read (size 1) 0x83 : 0x01
> sii3112_read bmdma: read (size 1) 0x84 : 0x14
> sii3112_read bmdma: read (size 1) 0x85 : 0xeb
> sii3112_set_irq channel 0 level 0
> sii3112_read bmdma: read (size 1) 0x87 : 0x00
> sii3112_write bmdma: write (size 1) 0x86 : 0x00
> 1 device(s) on port
>  0 Master : 'ATAPI'
> Starting 'sii3112ide.device - chip 0 port 0' task
> sii3112_write bmdma: write (size 4) 0x4 : 0x22c0000
> bmdma_addr_write data: 0x00000000022c0000
> Installing handler for irq 25
> mv64361_gpp_irq(0x5654b950c1a0, 31, 1) levels=80000000 mask=80000000
> mv64361_update_irq(0x5654b950c1a0, 59, 1)
> mv64361_gpp_irq(0x5654b950c1a0, 31, 0) levels=0
> mv64361_update_irq(0x5654b950c1a0, 59, 0)
> Unassigned mem read 00000000810040a1
> Trying to configure unit 0
> sii3112_write bmdma: write (size 1) 0x86 : 0x00
> sii3112_set_irq channel 0 level 0
> sii3112_read bmdma: read (size 1) 0x87 : 0x00
> sii3112_write bmdma: write (size 1) 0x8a : 0x00
> sii3112_write bmdma: write (size 1) 0x81 : 0x00
> sii3112_write bmdma: write (size 1) 0x82 : 0x00
> sii3112_write bmdma: write (size 1) 0x83 : 0x00
> sii3112_write bmdma: write (size 1) 0x84 : 0x00
> sii3112_write bmdma: write (size 1) 0x85 : 0x00
> sii3112_write bmdma: write (size 1) 0x86 : 0x40
> sii3112_write bmdma: write (size 1) 0x87 : 0xa1
> sii3112_set_irq channel 0 level 1
> mv64361_pcihost_set_irq(0x5654b950ce00, 1, 1)
> mv64361_gpp_irq(0x5654b950c1a0, 13, 1) levels=2000 mask=80000000
> 
> [sii3112ide/irq_wait] timed out
> [sii3112ide/exec_pio_data_in_cmd] <- here
> sii3112_set_irq channel 0 level 0
> mv64361_pcihost_set_irq(0x5654b950ce00, 1, 0)
> mv64361_gpp_irq(0x5654b950c1a0, 13, 0) levels=0
> mv64361_update_irq(0x5654b950c1a0, 57, 0)
> sii3112_read bmdma: read (size 1) 0x87 : 0x58
> [sii3112ide/ata_read_drive_properties] unit 0 returned error 255,
> failbits 00000000h, timeout 0
> 
> So here I see there's an interrupt raised by the card which does also
> get to the mv64361 system controller that's also the interrupt
> controller on pegasos2 but CPU IRQ is not raised because the
> corresponding mask bit is not set for some reason.
> 
> This suggests the common IDE bmdma and ide-cd code is likely OK and
> problem is somewhere in irq routing. What's relevant for this thread and
> sparc64 is that then you should also check interrupt controller and
> routing if an interrupt raised by the IDE controller could get to the
> CPU in your case as that could be where the problem is and maybe not in
> common code as I've suspected before.
> 
> For my case I'm not sure. On pegasos2 irqs come in via the mv64361 gpio
> ports, the irq pin of the VIA south bridge (containing via-ide and the
> 16 isa interrupts) is connected to gpp_irq 31 while the PCI INTA-D lines
> are connected to gpp_irq 12-15. These are mapped to interrupt cause bits
> 56-59 so that gpp0-7 gets 56, gpp8-15 57, gpp16-23 58 and gpp 24-31 gets
> 59. Thus the IRQ numbers seem correct in the above but the expected
> interrupt on 59 is only raised when the sii3112 driver is insalling its
> interrupt handler (not sure why does it call that irq 25?). This should
> have been raised when talking to device on via-ide much earlier. Then
> when talking to device on sii3112 the interrupt arrives from PCI on the
> expected 57 but CPU IRQ is not raised because it is masked, only gpp 31
> is enabled. This supposedly works on real hardware but don't get why it
> doesn't on my emulation. It's probably a bug in the IRQ controller
> emulation then and topic for another thread and other platforms that
> similar error happens may also have bugs in their IRQ routing.
> 



^ permalink raw reply	[flat|nested] 30+ messages in thread

* Missing IRQ with bmdma on ppc/mips/sparc? (was: Re: Emulating Solaris 10 on SPARC64 sun4u)
  2020-02-10 19:04         ` John Snow
@ 2020-02-10 22:32           ` BALATON Zoltan
  2020-02-25 20:55           ` IDE IRQ problem after UDMA enabled " BALATON Zoltan
  1 sibling, 0 replies; 30+ messages in thread
From: BALATON Zoltan @ 2020-02-10 22:32 UTC (permalink / raw)
  To: John Snow
  Cc: qemu-devel, mark.cave-ayland, dgilbert, atar4qemu, jasper.lowell

[-- Attachment #1: Type: text/plain, Size: 9392 bytes --]

I've changed title to avoid derailing the original thread as this is more 
about pegasos2 issue now but left cc list for now. Let me know if you 
don't want to be cc'd.

On Mon, 10 Feb 2020, John Snow wrote:
> On 2/10/20 10:38 AM, BALATON Zoltan wrote:
>> On Sat, 8 Feb 2020, BALATON Zoltan wrote:
>>> Not sure if my problem I see on other machine emulation I'm working on
>>> is related at all but there's a possibility it might be. I got this
>>> with different arch (ppc but could also reproduce something similar
>>> with mips) and ide controller emulation (via-ide) but the PCI bmdma
>>> code is shared by CMD646, via-ide and sii3112 and also the ide-cdrom
>>> emulation is the same so if there's a bug in these that could cause
>>> similar problems for different components. Or it could be that we get
>>> similar symptoms due to different reasons in which case sorry for the
>>> distracion but maybe we can learn from the experience of each other
>>> even in that case.
>>>
>>> What I get is tracked here:
>>>
>>> https://osdn.net/projects/qmiga/ticket/38949

I've updated this ticket now with more detailed AmigaOS4 logs that also 
contains PIO regs except ide_data* to keep it managable. I've lost some of 
the driver debug messages as it seems QEMU debug messages overwrite those 
when both are directed to stdout so I can't capture them both but added 
comments to explain what stage they are at.

>>> (background on emulated machine:
>>> https://osdn.net/projects/qmiga/wiki/SubprojectPegasos2 )

(There's also board schematics linked from that page in case someone is 
interested about how IRQs are connected, it's not impossible I've got that 
wrong in my model as I don't really know what real hardware does. The 
work in progress patches implementing pegasos2 are in the git branch also 
linked from above.)

>>> Originally I had both Linux and MorphOS fail after enabling BMDMA
>>> before I had interrupt controller emulation (so that means it could be
>>> a problem with that in your case as well so something to check). Now
>>> that I've implemented interrupts Linux boots with DMA from CDROM but
>>> MorphOS is still not happy.
>>
>> I could now also reproduce the same with AmigaOS4 on pegasos2 where I
>> got same missing interrupt problem:
>>
>> ---> Port 1
>> IOBase 00001010, AltBase 0000101E
>> bmcr_base 00001028
>> MMIOBase 00000000
>> Config not forced, scanning ...
>> 1 device(s) on port
>>  0 Master : 'ATAPI'
>
> "unit 2", I assume
>
>>  1 Slave  : 'unknown type'
>
> "unit 3", I assume

Yes, there was also a "---> Port 0" before that, checking for primary 
master and slave devices that were unit 0 and 1 but I did not include that 
for brevity. Thus secondary master and slave devices are numbered 2 and 3.

>> So there's definitely a problem with interrupts but not sure where. Also
>> don't know why it detects an unknown slave device which then it decides
>> is invalid. Maybe this is normal on an IDE bus with only one device or
>> is it a problem in emulation?
>>
>
> I don't actually know myself. We *do* always have two IDEState objects
> per port, but maybe we're letting some unknown state sneak through --
> filling in a register improperly, perhaps?

To make it clear, the problem I have that prevents it from working is the 
missing interrupt after switching to UDMA. The unknown slave device is 
only causing a delay in detection but then it determines that the 
secondary device is not working and goes further so I've only reported 
that as a potential problem in emulation that could be investigated and 
fixed but it's not the main problem that prevents working.

> It's probably not ide_ioport_read -- but I see complaints about the
> reset signature too, so maybe we've gotten that wrong.
>
> You can look at ide_set_signature to see how we set the drive
> signatures; called from ide_reset (and many other places too)

Unfortunately I don't know much about IDE so likely I would not find 
out much there.

> I think ide_init_drive is only meant to be called on devices that
> actually exist and are plugged in. It initializes drive_kind to one of
> IDE_HD, IDE_CD, or IDE_CFATA -- empty or missing isn't an option here.
>
> (Hm, this means it defaults to IDE_HD actually.)

From the logs I've seen it does seem to expect an ATA device i.e. HDD as 
unit 3 but after trying to identify it it gets an error and finds that 
there's no working device there and goes with just the CD drive. MorphOS 
does the same but trying a few times before giving up, there are some logs 
showing that in the above ticket,

> The tricky thing is that IDEState belongs to the parent bus -- not the
> drive object itself -- and the bus always has two slots.
>
> We select between the two by setting bus->unit; and we don't appear to
> do any kind of actual guarding that the drive actually exists.
>
> (I suppose guests are free to issue commands to non-existant drives if
> they want to, but they're not going to be able to perform work.)
>
> ...but ide_reset_bus calls ide_reset on both slots regardless of the
> presence of a device or not.

I remember seeing log messages from guest that said it reset the ide bus 
before trying to probe to avoid hangs that probably happen on real 
hardware but I don't find them now. But it's possible there was a bus 
reset before the above probing. I think it wants to get the bus to a known 
state to avoid problems due to firmware or something else leaving the bus 
and devices in some weird state.

> (This is probably just a side effect of the interrupt getting lost and
> having the guest try to reset the controller, then noticing weird state
> after the reset.)
>
> It sounds like the real problem is either in the bmdma controller (or
> its unique interaction with hw/ide/core.c -- which is possible) or in
> the interrupt routing somewhere else.

Despite being able to reproduce similar problems on ppc mips and sparc64 
emulations with two different ide controllers (sharing bmdma code) it 
could well be that all of these have some kind of IRQ routing problem as 
neither of these are finished and stable yet so I'm not sure the missing 
IRQ is coming from IDE code. Especially because in the sii3112 case it 
seems to be generated and only get lost in the last step in the IRQ 
conroller but don't see why. The guest should have enabled the 
corresponding interrupt I think. For via-ide it's not obvious where the 
IRQ gets lost, it seems to be generated later so I don't understand that 
completely either.

> If you have any IDE traces from a hang, feel free to throw them up on a
> pastebin for me to take a peek at; it might help for me to see the exact
> sequence that causes a hang in QEMU's IDE terms to see if I can't
> "reverse engineer" what the guest is hoping to have happen. Maybe I can
> trace this to a bad register value.

See more logs in the ticket, let me know if you'd need me to check 
something else. Thanks a lot for looking into this, I'd need to look up 
all of these IDE interactions to try to make sense of the logs which would 
take too much time. Maybe you can spot something easier.

> (Hm, it's failing on pio_in? It's using PIO on an IDE drive with a DMA
> controller? Is it failing to enable DMA and then failing to use PIO as a
> backup too? Maybe there are two bugs.)

Before getting to this point where it hangs waiting for the IRQ after 
switching on UDMA the firmware did find all devices and loaded the OS from 
the CD all right and the OS also can talk to ide devices as long as it 
uses only PIO. The IRQ problem only happens after DMA is enabled but I'm 
not sure it uses IRQ in PIO at all.

AmigaOS and MorphOS really want to use UDMA only (or highest DMA mode the 
device reports) as otherwise it would be too slow on real hardware so I 
don't think it wants to fall back, just failing the drive if it does not 
work in the DMA mode it reports.

Linux may do fallback I'm not sure but booting from a 
debian-8.11.0-powerpc-netinst.iso seems to work even after it says 
enabling DMA, whereas I got the same problem with Linux before I hooked up 
IRQs correctly. Linux logs I get now with via-ide:

[    0.858497] pata_via 0000:00:0c.1: version 0.3.4

[    0.905257] scsi0 : pata_via

[    0.925207] scsi1 : pata_via
[    0.925722] ata1: PATA max UDMA/100 cmd 0x1000 ctl 0x100c bmdma 0x1020 irq 9
[    0.925906] ata2: PATA max UDMA/100 cmd 0x1010 ctl 0x101c bmdma 0x1028 irq 9

[    1.297537] ata2.01: NODEV after polling detection
[    1.298650] ata2.00: ATAPI: QEMU DVD-ROM, 2.5+, max UDMA/100
[    1.318205] ata2.00: configured for UDMA/100
[    1.330427] scsi 1:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     2.5+ PQ: 0 ANSI: 5
[    1.401652] sr0: scsi3-mmc drive: 4x/4x cd/rw xa/form2 tray
[    1.401851] cdrom: Uniform CD-ROM driver Revision: 3.20
[    1.404116] sr 1:0:0:0: Attached scsi CD-ROM sr0
[    1.410853] sr 1:0:0:0: Attached scsi generic sg0 type 5

And if boots all right. I think Linux can use DMA and I see interrupts 
with Linux so maybe the drivers work differently and only the 
AmigaOS/MorphOS drivers do something that does not work with QEMU or 
depend on some features on hardware that I did not model correctly.

Regards,
BALATON Zoltan

^ permalink raw reply	[flat|nested] 30+ messages in thread

* RE: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-09 11:26 ` Mark Cave-Ayland
@ 2020-02-19  3:42   ` jasper.lowell
  2020-02-19 18:54     ` BALATON Zoltan
  2020-05-07 14:29   ` jasper.lowell
  1 sibling, 1 reply; 30+ messages in thread
From: jasper.lowell @ 2020-02-19  3:42 UTC (permalink / raw)
  To: mark.cave-ayland, qemu-devel; +Cc: jsnow, dgilbert, atar4qemu

Excuse the delay. I believe the reason why I am unable to locate the error string "Interrupt not seen after set_features" in the OpenSolaris source code is because it belongs to a proprietary driver that was not distributed with OpenSolaris. Rather than rely on source code I've had to debug this problem by observing Solaris 10's behaviour.

I previously linked https://docs.oracle.com/cd/E23824_01/html/821-1475/uata-7d.html that seems to indicate that this error is fatal.
Considering that the CMD646 IDE controller driver experiences a fatal error during the bootstrapping of the system, I suspect that the file system on the CDROM might not be accessible.
I'm not sure if this is directly related to the unresponsive serial console but I wouldn't be surprised.

When configuring devices, Solaris 10 uses the SET_FEATURE command on the CMD646 to set the transfer mode to MDMA mode.
From what I can tell, this is successful and the emulated IDE controller raises an interrupt acknowledging that the command was completed successfully. To determine whether or not this interrupt was successfully propagated to Solaris 10, I made manual changes to ensure that the interrupt was not raised for this event at this specific time. This resulted in a new error from Solaris 10 regarding "set_features".
- Solaris 10 appears to be able to see the interrupt from the completion of the SET_FEATURE command.
- Solaris 10 appears to then perform two reads on the status register. From what I understand, this has the side effect of clearing interrupts.
- Solaris 10 then writes to the device/head register.
- Solaris 10 then spins on ARTTIM23_INTR_CH1 expecting it to be set. When it is not set, the operation times out and we are presented with the fatal error regarding set_features.

I am not intimately familiar with the workings of the CMD646 or the ATA specification so I can only speculate.
- If the interrupt that Solaris 10 expects is the one from the SET_FEATURE command, then Solaris 10 is not expecting reading from the status register to clear ARTTIM23_INTR_CH1.
- If the interrupt that Solaris 10 expects is not the one from the SET_FEATURE command, then it must expect an interrupt to occur from writing to the device/head register.

I found it strange that Solaris 10 was spinning on ARTTIM23_INTR_CH1. Is it possible that Solaris 10 is not expecting the values of ARTTIM23_INTR_CH1 and MRDMODE_INTR_CH1 to be synced? I made changes to disable the syncing and the fatal error from Solaris 10 disappeared. Unfortunately, I can't tell whether or not this actually improved the emulation of Solaris 10 as the serial console is still unresponsive.

If there is a bug in the Solaris 10 driver I would expect this error to be more widely referenced online. I suspect that the emulated CMD646 is not perfectly faithful to the hardware and this is causing problems for Solaris 10.
I am not convinced that this problem is related to IRQ routing as Solaris 10 appears to recognise interrupts when they happen (or don't). Because of this, I don't think this error is related  to the DMA problem under MorphOS but I could be wrong.

Does anyone have any ideas that might explain why Solaris 10 insists that ARTTIM23_INTR_CH1 is set despite two previous reads of the status register?

Thanks,
Jasper Lowell.

-----Original Message-----
From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> 
Sent: Sunday, 9 February 2020 10:26 PM
To: Lowell,J,Jasper,VIM R <jasper.lowell@bt.com>; qemu-devel@nongnu.org
Cc: atar4qemu@gmail.com
Subject: Re: Emulating Solaris 10 on SPARC64 sun4u

On 05/02/2020 06:31, jasper.lowell@bt.com wrote:

> I'm currently working towards emulating Solaris 10 on sun4u.
> 
>  
> 
> The Solaris 10 ISO image I am attempting to boot is the one from the 
> Oracle
> 
> download page at
> https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
> 
> Image: sol-10-u11-ga-sparc-dvd.iso
> 
> MD5:   53e8b066f7f250ce2fd2cef063f8072b
> 
>  
> 
> I am using QEMU commit 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
> 
>  
> 
> The command I am using to run QEMU is:
> 
> ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios 
> ./openbios/obj-sparc64/openbios-builtin.elf -cdrom 
> ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m 3G
> 
>  
> 
> ```
> 
> CPUs: 1 x SUNW,UltraSPARC-IIi
> 
> UUID: 00000000-0000-0000-0000-000000000000
> 
> Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
> 
>   Type 'help' for detailed information
> 
> Trying cdrom:f...
> 
> Not a bootable ELF image
> 
> Not a bootable a.out image
> 
>  
> 
> Loading FCode image...
> 
> Loaded 7420 bytes
> 
> entry point is 0x4000
> 
> Evaluating FCode...
> 
> Evaluating FCode...
> 
> Ignoring failed claim for va 1000000 memsz af6d6!
> 
> Ignoring failed claim for va 1402000 memsz 4dcc8!
> 
> Ignoring failed claim for va 1800000 memsz 510c8!
> 
> SunOS Release 5.10 Version Generic_147147-26 64-bit
> 
> Copyright (c) 1983, 2013, Oracle and/or its affiliates. All rights reserved.
> 
> could not find debugger-vocabulary-hook>threads:interpret: exception 
> -13 caught
> 
> interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
> 
> \ All rights reserved.
> 
> \
> 
> \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
> 
>  
> 
> hex
> 
>  
> 
> only forth also definitions
> 
> vocabulary kdbg-words
> 
> also kdbg-words definitions
> 
>  
> 
> defer p@
> 
> defer p!
> 
> ['] x@ is p@
> 
> ['] x! is p!
> 
>  
> 
> 8 constant ptrsize
> 
>  
> 
> d# 32 constant nbitsminor
> 
> h# ffffffff constant maxmin
> 
> \
> 
> \ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
> 
> \ Use is subject to license terms.
> 
> \
> 
>  
> 
> \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
> 
>  
> 
> h# 7ff constant v9bias
> 
> h# unix-tte:interpret: exception -13 caught
> 
> interpret ' unix-tte is va>tte-data failed with error ffffffffffffffed
> 
> WARNING: consconfig: cannot find driver for screen device 
> /pci@1fe,0/pci@1,1/QEMU,VGA@2
> 
> Configuring devices.
> 
> WARNING: Interrupt not seen after set_features
> 
> Using RPC Bootparams for network configuration information.
> 
> Attempting to configure interface hme0...
> 
> WARNING: Power off requested from power button or SC, powering down the system!
> 
> Skipped interface hme0
> 
> svc:/system/filesystem/local:default: WARNING: /usr/sbin/zfs mount -a 
> failed: one or more file systems failed to mount
> 
> Serial console, reverting to text install
> 
> Beginning system identification...
> 
> Searching for configuration file(s)...
> 
> Search complete.
> 
> Discovering additional network configuration...
> 
> ```
> 
>  
> 
> The installation menu is shown after but the console is unresponsive.
> 
>  
> 
> After some debugging, it looks like the QEMU front-end is correctly 
> filling
> 
> the serial receive buffer with characters, and then starts dropping 
> them once
> 
> the number of characters in the buffer reach the interrupt level. The 
> interrupt
> 
> level happens to be 1 when booting Solaris 10. This looks like normal 
> behaviour
> 
> to me.
> 
>  
> 
> I started looking at why the serial receive buffer might not be 
> consumed and
> 
> considered that interrupts might not be being raised correctly. I ran 
> with
> 
> tracing and there were no interrupts for IRQ 0x2b like there are when 
> using
> 
> OpenBSD. When inspecting the registers of the serial device it looks 
> like the
> 
> Interrupt Enable Register is set to zero.
> 
>  
> 
> If Solaris 10 was using the device is polling mode, it should be 
> reading the RBR
> 
> or at least the LSR. When tracing serial_ioport_read and 
> serial_ioport_write,
> 
> once the menu is hit, I don't see any read or writes to the serial 
> device
> 
> registers despite me trying to send characters and use the menu.
> 
>  
> 
> The driver Solaris 10 is using for the device appears to be 
> similar/same as
> 
> /usr/src/uts/sun4/io/su_driver.c in the OpenSolaris code found at 
> https://github.com/nxmirrors/onnv.
> 
>  
> 
> ```
> 
> asy->asy_hwtype = ASY16550AF;
> 
> OUTB(FIFOR, 0x00); /* clear fifo register */
> 
> asy->asy_trig_level = 0x00; /* sets the fifo Threshold to 1 */
> 
>  
> 
> /* set/Enable FIFO */
> 
> OUTB(FIFOR, FIFO_ON | FIFODMA | FIFOTXFLSH | FIFORXFLSH |
> 
> (asy->asy_trig_level & 0xff));
> 
>  
> 
> if ((INB(ISR) & 0xc0) == 0xc0)
> 
>     asy->asy_use_fifo = FIFO_ON; /* QEMU REACHES HERE. */
> 
> else {
> 
>     asy->asy_hwtype = ASY8250;
> 
>     OUTB(FIFOR, 0x00); /* NO FIFOs */
> 
>     asy->asy_trig_level = 0;
> 
> }
> 
> ```
> 
>  
> 
> From what I can tell when tracing serial_ioport_write and 
> serial_ioport_read,
> 
> Solaris 10 correctly identifies the serial device and successfully attaches it.
> 
> In the asyattach function (OpenSolaris driver), interrupts are 
> disabled by zeroing the
> 
> Interrupt Enable Register. From what I'm reading in OpenSolaris source 
> code, interrupts
> 
> are reenabled when the device is "opened". This seems like consistent 
> and
> 
> correct behaviour though I'm not sure why the device is not being 
> opened to be
> 
> used by the serial console.
> 
>  
> 
> Is this an issue anyone else has tried to debug?
> 
> Are there any leads that I can follow up on for why the serial console 
> becomes unresponsive
> 
> on Solaris 10?

It has been a while since I've looked at booting Solaris >= 10 but certainly the messages above about set_features and the frozen console suggest that something is going amiss with interrupt routing, although since Linux and NetBSD were fine the last time I ran my OpenBIOS release tests then Solaris must be doing something different here.

Note that the serial interrupts are routed from the ebus into sabre so the first thing to check would be that the end-to-end routing from device to CPU looks correct when using Solaris.


ATB,

Mark.


^ permalink raw reply	[flat|nested] 30+ messages in thread

* RE: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-19  3:42   ` jasper.lowell
@ 2020-02-19 18:54     ` BALATON Zoltan
  2020-02-19 20:10       ` BALATON Zoltan
  0 siblings, 1 reply; 30+ messages in thread
From: BALATON Zoltan @ 2020-02-19 18:54 UTC (permalink / raw)
  To: jasper.lowell; +Cc: jsnow, mark.cave-ayland, qemu-devel, atar4qemu, dgilbert

On Wed, 19 Feb 2020, jasper.lowell@bt.com wrote:
> When configuring devices, Solaris 10 uses the SET_FEATURE command on the CMD646 to set the transfer mode to MDMA mode.
> From what I can tell, this is successful and the emulated IDE controller 
> raises an interrupt acknowledging that the command was completed 
> successfully. To determine whether or not this interrupt was 
> successfully propagated to Solaris 10, I made manual changes to ensure 
> that the interrupt was not raised for this event at this specific time. 
> This resulted in a new error from Solaris 10 regarding "set_features".
> - Solaris 10 appears to be able to see the interrupt from the completion of the SET_FEATURE command.
> - Solaris 10 appears to then perform two reads on the status register. From what I understand, this has the side effect of clearing interrupts.
> - Solaris 10 then writes to the device/head register.
> - Solaris 10 then spins on ARTTIM23_INTR_CH1 expecting it to be set. 
> When it is not set, the operation times out and we are presented with 
> the fatal error regarding set_features.
>
> I am not intimately familiar with the workings of the CMD646 or the ATA specification so I can only speculate.
> - If the interrupt that Solaris 10 expects is the one from the 
> SET_FEATURE command, then Solaris 10 is not expecting reading from the 
> status register to clear ARTTIM23_INTR_CH1.
> - If the interrupt that Solaris 10 expects is not the one from the 
> SET_FEATURE command, then it must expect an interrupt to occur from 
> writing to the device/head register.

I don't have definitive answers so these are some ideas but I may be 
completely wrong.

I don't know about Solaris but what I've seen on PPC and via-ide is that 
it works until switched to UDMA mode then it freezes on the first command 
issued after switching to UDMA so it seems like it expects an interrupt 
that's not generated or not routed correctly but only in DMA mode, in the 
initial PIO mode it works. Not sure if this is useful at all for your case 
though so you may just disregard it.

> I found it strange that Solaris 10 was spinning on ARTTIM23_INTR_CH1. Is 
> it possible that Solaris 10 is not expecting the values of 
> ARTTIM23_INTR_CH1 and MRDMODE_INTR_CH1 to be synced? I made changes to 
> disable the syncing and the fatal error from Solaris 10 disappeared. 
> Unfortunately, I can't tell whether or not this actually improved the 
> emulation of Solaris 10 as the serial console is still unresponsive.

I think the syncing was added in commit 271dddd1 and the commit log:

https://lists.gnu.org/archive/html/qemu-devel/2014-08/msg02644.html

cites the data sheet for that and there were other commits around it that 
were changing similar things as well. I guess this was fixing some problem 
at the time (Mark may remember more) so maybe these are correct but I 
don't know what actual hardware does. I also remember this IDE controller 
chip had different versions with early ones having implementation bugs 
that could cause problems so people generally avoided it or drivers may 
have hacks to fix those so it's possible that this tries to work around 
some hardware bug? I don't remember the details but maybe Linux kernel 
source has some history on this.

> If there is a bug in the Solaris 10 driver I would expect this error to 
> be more widely referenced online. I suspect that the emulated CMD646 is 
> not perfectly faithful to the hardware and this is causing problems for 
> Solaris 10.
> I am not convinced that this problem is related to IRQ routing as 
> Solaris 10 appears to recognise interrupts when they happen (or don't). 
> Because of this, I don't think this error is related to the DMA problem 
> under MorphOS but I could be wrong.

I'm not sure either because during testing I've seen two cases and in one 
IRQ was raised but did not reach CPU due to being masked in interrupt 
controller so that suggests it's not a problem with generating the IRQ in 
IDE code but problem is afterwards but still could not understand why it 
fails. (Seems to work on Linux though so maybe understanding what the 
working and non-working cases do differently could get closer to the 
answer.)

> Does anyone have any ideas that might explain why Solaris 10 insists 
> that ARTTIM23_INTR_CH1 is set despite two previous reads of the status 
> register?

I can only guess. The data sheet says that in PCI native mode these bits 
should be checked to determine if an interrupt on PCI INTA is coming from 
this controller (but for PIO mode, for DMA it just refers to Intel's spec 
without any more info). Specifically:

"When an IDE port is in PCI IDE Native Mode, the IDE task file registers 
may be mapped to non-standard port addresses, and IDE drive interrupts 
occur at PCI INTA. [As opposed to Legacy mode when it uses standard ISA 
IDE port numbers and IRQ14 and 15.] Therefore, if both IDE ports are in 
PCI IDE Native Mode, drive interrupts from both IDE ports are multiplexed 
into PCI INTA. In this case, the interrupt status bits must be polled to 
determine which IDE port generated the interrupt, or whether the interrupt 
was generated by another PCI device sharing INTA on the bus.

1) The host reads CFR (index 50h). If bit 2 is set, then the interrupt 
occurred on the primary IDE port.

2) The host reads ARTTIM23. If bit 4 is set, then the interrupt occurred 
on the secondary IDE port.

3) If 1) and 2) are both false, then the interrupt was generated by 
another PCI device sharing INTA with the PCI0646."

As for why it polls this reg, if it's not expecting interrupt on primary 
port and just reading both as described above, it may be expecting more 
interrupts than QEMU is generating or it may expect them to arrive with 
some delay or after previous one is cleared that QEMU could just raise 
once due to being faster or doing something differently? Does someone know 
what interrupts are generated on real hardware in DMA mode so we can 
compare that to what we see with QEMU?

Regards,
BALATON Zoltan


^ permalink raw reply	[flat|nested] 30+ messages in thread

* RE: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-19 18:54     ` BALATON Zoltan
@ 2020-02-19 20:10       ` BALATON Zoltan
  2020-02-21 19:53         ` Dr. David Alan Gilbert
  2020-02-28 22:05         ` BALATON Zoltan
  0 siblings, 2 replies; 30+ messages in thread
From: BALATON Zoltan @ 2020-02-19 20:10 UTC (permalink / raw)
  To: jasper.lowell; +Cc: jsnow, mark.cave-ayland, qemu-devel, atar4qemu, dgilbert

On Wed, 19 Feb 2020, BALATON Zoltan wrote:
> faster or doing something differently? Does someone know what interrupts are 
> generated on real hardware in DMA mode so we can compare that to what we see 
> with QEMU?

The document Programming Interface for Bus Master IDE Controller, Revision 
1.0 (5/16/94) has some info on this. AFAIU it says that after DMA 
operation is completed an IRQ should be raised. On page 5, section 3.1. 
Data Synchronization it says:

"Another way to view this requirement is that the first read to the 
controller Status register in response to the IDE device interrupt must 
return with the Interrupt bit set and with the guarantee that all buffered 
data has been written to memory."

Not sure if this is relevant but how is it handled in QEMU? Is the right 
interrupt bit set after DMA transfer is done? If so is it the one that's 
checked by the OS driver?

Regards,
BALATON Zoltan


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-19 20:10       ` BALATON Zoltan
@ 2020-02-21 19:53         ` Dr. David Alan Gilbert
  2020-02-28 22:05         ` BALATON Zoltan
  1 sibling, 0 replies; 30+ messages in thread
From: Dr. David Alan Gilbert @ 2020-02-21 19:53 UTC (permalink / raw)
  To: BALATON Zoltan
  Cc: jsnow, mark.cave-ayland, qemu-devel, atar4qemu, jasper.lowell

* BALATON Zoltan (balaton@eik.bme.hu) wrote:
> On Wed, 19 Feb 2020, BALATON Zoltan wrote:
> > faster or doing something differently? Does someone know what interrupts
> > are generated on real hardware in DMA mode so we can compare that to
> > what we see with QEMU?
> 
> The document Programming Interface for Bus Master IDE Controller, Revision
> 1.0 (5/16/94) has some info on this. AFAIU it says that after DMA operation
> is completed an IRQ should be raised. On page 5, section 3.1. Data
> Synchronization it says:
> 
> "Another way to view this requirement is that the first read to the
> controller Status register in response to the IDE device interrupt must
> return with the Interrupt bit set and with the guarantee that all buffered
> data has been written to memory."
> 
> Not sure if this is relevant but how is it handled in QEMU? Is the right
> interrupt bit set after DMA transfer is done? If so is it the one that's
> checked by the OS driver?

One thing to be a little careful of is I remember the 646 was always
known for having a few quirks (I've not got a SPARC64 ith one, but I
think my Alpha has it).  So whether you're chasing a generic IDE BM
problem or a 646 special is fun.

Dave

> Regards,
> BALATON Zoltan
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK



^ permalink raw reply	[flat|nested] 30+ messages in thread

* IDE IRQ problem after UDMA enabled (was: Re: Emulating Solaris 10 on SPARC64 sun4u)
  2020-02-10 19:04         ` John Snow
  2020-02-10 22:32           ` Missing IRQ with bmdma on ppc/mips/sparc? (was: Re: Emulating Solaris 10 on SPARC64 sun4u) BALATON Zoltan
@ 2020-02-25 20:55           ` BALATON Zoltan
  2020-02-25 22:00             ` BALATON Zoltan
  1 sibling, 1 reply; 30+ messages in thread
From: BALATON Zoltan @ 2020-02-25 20:55 UTC (permalink / raw)
  To: John Snow; +Cc: qemu-devel

Hello,

On Mon, 10 Feb 2020, John Snow wrote:
> It sounds like the real problem is either in the bmdma controller (or
> its unique interaction with hw/ide/core.c -- which is possible) or in
> the interrupt routing somewhere else.
>
> If you have any IDE traces from a hang, feel free to throw them up on a
> pastebin for me to take a peek at; it might help for me to see the exact
> sequence that causes a hang in QEMU's IDE terms to see if I can't
> "reverse engineer" what the guest is hoping to have happen. Maybe I can
> trace this to a bad register value.

I've got some traces from Linux and MorphOS (both on my work in progress 
pegasos2 emulation using via-ide where I can most easily reproduce this) 
but I'm not sure what to look for in these. MorphOS starts booting, so 
firmware can read ide-cd connected to via-ide as well as MorphOS can 
before enabling UDMA 5 mode but stops after that and cannot read the drive 
any more. Linux works even after enabling DMA. I've gathered some logs in 
https://osdn.net/projects/qmiga/ticket/38949 previously but now I try to 
list here the part in more detail where drive is detected, enabling DMA 
and first command after that in case you can spot something in these that 
could explain why it fails with MorphOS driver.

First the working Linux case:

pci_cfg_read via-ide 12:1 @0x4 -> 0x87
pci_cfg_read via-ide 12:1 @0x3d -> 0x1
pci_cfg_read via-ide 12:1 @0x4 -> 0x87
pci_cfg_read via-ide 12:1 @0x40 -> 0xb
pci_cfg_read via-ide 12:1 @0x40 -> 0xb
bmdma_read_via bmdma: readb 0x2 : 0x00
bmdma_read_via bmdma: readb 0x2 : 0x00
pci_cfg_read via-ide 12:1 @0x4 -> 0x87
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x0a; bus 0x56229cb35600
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x00; bus 0x56229cb35600 IDEState 0x56229cb35a58
bmdma_read_via bmdma: readb 0x2 : 0x00
bmdma_write_via bmdma: writeb 0x2 : 0x00
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x0a; bus 0x56229cb35ef0
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
bmdma_read_via bmdma: readb 0x2 : 0x00
bmdma_write_via bmdma: writeb 0x2 : 0x00
pci_cfg_read via-ide 12:1 @0x9 -> 0x8f
[    2.589547] scsi0 : pata_via
[    2.590949] scsi1 : pata_via
[    2.591488] ata1: PATA max UDMA/100 cmd 0x1000 ctl 0x100c bmdma 0x1020 irq 9
[    2.591652] ata2: PATA max UDMA/100 cmd 0x1010 ctl 0x101c bmdma 0x1028 irq 9

[...]

[    2.938174] ata2.00: ATAPI: QEMU DVD-ROM, 2.5+, max UDMA/100
pci_cfg_read via-ide 12:1 @0x4c -> 0xaa
pci_cfg_write via-ide 12:1 @0x4c <- 0xa2
pci_cfg_write via-ide 12:1 @0x4e <- 0x31
pci_cfg_write via-ide 12:1 @0x49 <- 0x31
pci_cfg_read via-ide 12:1 @0x51 -> 0x17
pci_cfg_write via-ide 12:1 @0x51 <- 0x17
pci_cfg_read via-ide 12:1 @0x4c -> 0xa2
pci_cfg_write via-ide 12:1 @0x4c <- 0xa2
pci_cfg_write via-ide 12:1 @0x4e <- 0x31
pci_cfg_write via-ide 12:1 @0x49 <- 0x31
pci_cfg_read via-ide 12:1 @0x51 -> 0x17
pci_cfg_write via-ide 12:1 @0x51 <- 0xf0
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0xa0; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_status_read IDE PIO rd @ 0x4 (Alt Status); val 0x50; bus 0x56229cb35ef0; IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x0a; bus 0x56229cb35ef0
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0xa0; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x1 (Features); val 0x03; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x2 (Sector Count); val 0x45; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x3 (Sector Number); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x4 (Cylinder Low); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x5 (Cylinder High); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x7 (Command); val 0xef; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_exec_cmd IDE exec cmd: bus 0x56229cb35ef0; state 0x56229cb35f78; cmd 0xef
ide_status_read IDE PIO rd @ 0x4 (Alt Status); val 0x50; bus 0x56229cb35ef0; IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x08; bus 0x56229cb35ef0
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
bmdma_read_via bmdma: readb 0x2 : 0x00
bmdma_write_via bmdma: writeb 0x2 : 0x00
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x1 (Error); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x2 (Sector Count); val 0x45; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x3 (Sector Number); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x4 (Cylinder Low); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x5 (Cylinder High); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x6 (Device/Head); val 0x20; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0xa0; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_status_read IDE PIO rd @ 0x4 (Alt Status); val 0x50; bus 0x56229cb35ef0; IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x0a; bus 0x56229cb35ef0
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0xa0; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x1 (Features); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x2 (Sector Count); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x3 (Sector Number); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x4 (Cylinder Low); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x5 (Cylinder High); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x7 (Command); val 0xa1; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_exec_cmd IDE exec cmd: bus 0x56229cb35ef0; state 0x56229cb35f78; cmd 0xa1
ide_status_read IDE PIO rd @ 0x4 (Alt Status); val 0x58; bus 0x56229cb35ef0; IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_status_read IDE PIO rd @ 0x4 (Alt Status); val 0x50; bus 0x56229cb35ef0; IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x08; bus 0x56229cb35ef0
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
bmdma_read_via bmdma: readb 0x2 : 0x00
bmdma_write_via bmdma: writeb 0x2 : 0x00
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x1 (Error); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x2 (Sector Count); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x3 (Sector Number); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x4 (Cylinder Low); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x5 (Cylinder High); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x6 (Device/Head); val 0x20; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
[    2.953806] ata2.00: configured for UDMA/100
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0xa0; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_status_read IDE PIO rd @ 0x4 (Alt Status); val 0x50; bus 0x56229cb35ef0; IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0xa0; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x1 (Features); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x2 (Sector Count); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x3 (Sector Number); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x4 (Cylinder Low); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x5 (Cylinder High); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_write IDE PIO wr @ 0x7 (Command); val 0xa0; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_exec_cmd IDE exec cmd: bus 0x56229cb35ef0; state 0x56229cb35f78; cmd 0xa0
ide_status_read IDE PIO rd @ 0x4 (Alt Status); val 0x58; bus 0x56229cb35ef0; IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_atapi_cmd IDEState: 0x56229cb35f78; cmd: 0x00
ide_atapi_cmd_packet IDEState: 0x56229cb35f78; limit=0x0 packet: 00 00 00 00 00 00 00 00 00 00 00 00
mv64361_gpp_irq(0x56229c93a230, 31, 1) 80000000 80000000
mv64361_update_irq(0x56229c93a230, 59, 1)
ide_status_read IDE PIO rd @ 0x4 (Alt Status); val 0x50; bus 0x56229cb35ef0; IDEState 0x56229cb35f78
mv64361_gpp_irq(0x56229c93a230, 31, 0) 0
mv64361_update_irq(0x56229c93a230, 59, 0)
ide_status_read IDE PIO rd @ 0x4 (Alt Status); val 0x50; bus 0x56229cb35ef0; IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
bmdma_read_via bmdma: readb 0x2 : 0x04
bmdma_write_via bmdma: writeb 0x2 : 0x04
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x56229cb35ef0 IDEState 0x56229cb35f78
ide_ioport_read IDE PIO rd @ 0x1 (Error); val 0x00; bus 0x56229cb35ef0 IDEState 0x56229cb35f78

While MorphOS stops after enabling DMA:

PCI ATA/ATAPI Driver-Driver_ScanBus@1: Identify succeed
PCI ATA/ATAPI Driver-Driver_ScanBus@1: Signature 0x0
PCI ATA/ATAPI Driver-Driver_ScanBus@1: Config 0x85c0
PCI ATA/ATAPI Driver-Driver_SetParam@2: Type 0x4
PCI ATA/ATAPI Driver-Driver_SetParam@2: Capabilities 0x300
PCI ATA/ATAPI Driver-Driver_SetParam@2: PIOMode 0x0
PCI ATA/ATAPI Driver-Driver_SetParam@2: ATAPI supports at least PioMode 3
PCI ATA/ATAPI Driver-Driver_SetParam@2: Old PIOMode 0x3 DMAMode 0x0
PCI ATA/ATAPI Driver-Driver_SetParam@2: New PIOMode/DMAMode fields are valid
PCI ATA/ATAPI Driver-Driver_SetParam@2: PIOMask 0x3 DMAMask 0x7
PCI ATA/ATAPI Driver-Driver_SetParam@2: Supported PIOMode 4 DMAMode 2 UDMAMode 5
PCI ATA/ATAPI Driver-Driver_SetParam@2: Version 30 Revision 0
PCI ATA/ATAPI Driver-Driver_SetParam@2: 12 byte cmds
PCI ATA/ATAPI Driver-Driver_SetParam@2: Max PIOMode 4
PCI ATA/ATAPI Driver-Driver_SetParam@2: Set PioMode 4
PCI ATA/ATAPI Driver-Driver_SetFeature@2: Code 0x3 SubCode 0xc
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x0a; bus 0x562c141a9840
ide_ioport_write IDE PIO wr @ 0x1 (Features); val 0x03; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x2 (Sector Count); val 0x0c; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x3 (Sector Number); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x4 (Cylinder Low); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x5 (Cylinder High); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0xa0; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x7 (Command); val 0xef; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_exec_cmd IDE exec cmd: bus 0x562c141a9840; state 0x562c141a98c8; cmd 0xef
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x2 (Sector Count); val 0x0c; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x3 (Sector Number); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x4 (Cylinder Low); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x5 (Cylinder High); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x6 (Device/Head); val 0xa0; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x00; bus 0x562c141a9840
PCI ATA/ATAPI Driver-Driver_SetFeature@2: done
PCI ATA/ATAPI Driver@2: PIO Mode 4
pci_cfg_write via-ide 12:1 @0x49 <- 0x20
PCI ATA/ATAPI Driver-Driver_SetParam@2: Set DmaMode 2
PCI ATA/ATAPI Driver-Driver_SetFeature@2: Code 0x3 SubCode 0x22
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x0a; bus 0x562c141a9840
ide_ioport_write IDE PIO wr @ 0x1 (Features); val 0x03; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x2 (Sector Count); val 0x22; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x3 (Sector Number); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x4 (Cylinder Low); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x5 (Cylinder High); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0xa0; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x7 (Command); val 0xef; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_exec_cmd IDE exec cmd: bus 0x562c141a9840; state 0x562c141a98c8; cmd 0xef
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x2 (Sector Count); val 0x22; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x3 (Sector Number); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x4 (Cylinder Low); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x5 (Cylinder High); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x6 (Device/Head); val 0xa0; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x00; bus 0x562c141a9840
PCI ATA/ATAPI Driver-Driver_SetFeature@2: done
bmdma_read_via bmdma: readb 0x2 : 0x00
bmdma_write_via bmdma: writeb 0x2 : 0x26
PCI ATA/ATAPI Driver-Driver_SetParam@2: Set UDmaMode 5
PCI ATA/ATAPI Driver-Driver_SetFeature@2: Code 0x3 SubCode 0x45
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x0a; bus 0x562c141a9840
ide_ioport_write IDE PIO wr @ 0x1 (Features); val 0x03; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x2 (Sector Count); val 0x45; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x3 (Sector Number); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x4 (Cylinder Low); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x5 (Cylinder High); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0xa0; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x7 (Command); val 0xef; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_exec_cmd IDE exec cmd: bus 0x562c141a9840; state 0x562c141a98c8; cmd 0xef
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x50; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x2 (Sector Count); val 0x45; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x3 (Sector Number); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x4 (Cylinder Low); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x5 (Cylinder High); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x6 (Device/Head); val 0xa0; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_cmd_write IDE PIO wr @ 0x4 (Device Control); val 0x00; bus 0x562c141a9840
PCI ATA/ATAPI Driver-Driver_SetFeature@2: done
PCI ATA/ATAPI Driver@2: UDMA Mode 5
pci_cfg_write via-ide 12:1 @0x51 <- 0xe0
bmdma_read_via bmdma: readb 0x2 : 0x20
bmdma_write_via bmdma: writeb 0x2 : 0x26
PCI ATA/ATAPI Driver-Driver_SetParam@2: CDROM..Set no WriteCache
PCI ATA/ATAPI Driver-Driver_SetParam@2: Cylinders 0
PCI ATA/ATAPI Driver-Driver_SetParam@2: Heads 0
PCI ATA/ATAPI Driver-Driver_SetParam@2: Sectors/Cyl 0
PCI ATA/ATAPI Driver-Driver_SetParam@2: TotalSectors 0
PCI ATA/ATAPI Driver-Driver_SetParam@2: TotalSectors48 0
PCI ATA/ATAPI Driver-Driver_SetParam@2: Support.Flags 0x200003

Then it tries to identify the phantom ATA drive that seems to be present 
on other port but not working; this was discussed before. Finally tries to 
read CD drive:
[...]

Dev_Inquiry@ide.device-2: DiskPort 0x140f8890
Dev_Inquiry@ide.device-2: ATAPI
Dev_InquirySCSI@ide.device-2:
Dev_InquirySCSI@ide.device-2: Send TestDrive
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a9c98
ide_ioport_write IDE PIO wr @ 0x1 (Features); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x2 (Sector Count); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x3 (Sector Number); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x4 (Cylinder Low); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x5 (Cylinder High); val 0x80; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x6 (Device/Head); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_write IDE PIO wr @ 0x7 (Command); val 0xa0; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_exec_cmd IDE exec cmd: bus 0x562c141a9840; state 0x562c141a98c8; cmd 0xa0
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x2 (Sector Count); val 0x01; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x5 (Cylinder High); val 0x80; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x4 (Cylinder Low); val 0x00; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_ioport_read IDE PIO rd @ 0x7 (Status); val 0x58; bus 0x562c141a9840 IDEState 0x562c141a98c8
ide_atapi_cmd IDEState: 0x562c141a98c8; cmd: 0x00
ide_atapi_cmd_packet IDEState: 0x562c141a98c8; limit=0x8000 packet: 00 00 00 00 00 00 00 00 00 00 00 00
mv64361_gpp_irq(0x562c13faea60, 31, 1) 80000000 80000000
mv64361_update_irq(0x562c13faea60, 59, 1)
mv64361_gpp_irq(0x562c13faea60, 31, 0) 0
mv64361_update_irq(0x562c13faea60, 59, 0)
mv64361_gpp_irq(0x562c13faea60, 31, 1) 80000000 80000000
mv64361_update_irq(0x562c13faea60, 59, 1)
mv64361_gpp_irq(0x562c13faea60, 31, 0) 0
mv64361_update_irq(0x562c13faea60, 59, 0)

Then it stucks here not sending any more ATAPI commands despite interrupt 
is raised and lowered a few times afterwards but I don't see any more ide 
commands issued so it seems it may not get the expected interrupt? Do you 
see anything in the above logs that could explain this?

Thank you,
BALATON Zoltan


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: IDE IRQ problem after UDMA enabled (was: Re: Emulating Solaris 10 on SPARC64 sun4u)
  2020-02-25 20:55           ` IDE IRQ problem after UDMA enabled " BALATON Zoltan
@ 2020-02-25 22:00             ` BALATON Zoltan
  0 siblings, 0 replies; 30+ messages in thread
From: BALATON Zoltan @ 2020-02-25 22:00 UTC (permalink / raw)
  To: John Snow; +Cc: qemu-devel

On Tue, 25 Feb 2020, BALATON Zoltan wrote:
> On Mon, 10 Feb 2020, John Snow wrote:
>> It sounds like the real problem is either in the bmdma controller (or
>> its unique interaction with hw/ide/core.c -- which is possible) or in
>> the interrupt routing somewhere else.
>> 
>> If you have any IDE traces from a hang, feel free to throw them up on a
>> pastebin for me to take a peek at; it might help for me to see the exact
>> sequence that causes a hang in QEMU's IDE terms to see if I can't
>> "reverse engineer" what the guest is hoping to have happen. Maybe I can
>> trace this to a bad register value.
>
> I've got some traces from Linux and MorphOS (both on my work in progress 
> pegasos2 emulation using via-ide where I can most easily reproduce this) but 
> I'm not sure what to look for in these. MorphOS starts booting, so firmware 
> can read ide-cd connected to via-ide as well as MorphOS can before enabling 
> UDMA 5 mode but stops after that and cannot read the drive any more. Linux 
> works even after enabling DMA. I've gathered some logs in 
> https://osdn.net/projects/qmiga/ticket/38949 previously but now I try to list 
> here the part in more detail where drive is detected, enabling DMA and first 
> command after that in case you can spot something in these that could explain 
> why it fails with MorphOS driver.

Never mind, I've found a clue in NetBSD's driver:

http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/pci/viaide.c?rev=1.89&content-type=text/x-cvsweb-markup&only_with_tag=MAIN

which has a comment that says:

/*
  * At least under certain (mis)configurations (e.g. on the "Pegasos" board)
  * the VT8231-IDE's native mode only works with irq 14/15, and cannot be
  * programmed to use a single native PCI irq alone. So we install an interrupt
  * handler for each channel, as in compatibility mode.
  */

If I change via-ide to use ISA IRQ14 and 15 and ignore what's programmed 
in the PCI config reg then MorphOS works with UDMA so it expects that. 
This change however breaks Linux which still boots after getting some 
errors but maybe it downgrades to PIO mode then. I'll need to find out 
more about how is this broken on real hardware and how can we emulate it.

So you don't need to look at the logs unless you want to check why it sees 
a non working ATA device after resetting the bus but logs in the ticket 
above may be more useful for that as I did not include that part in this 
email.

Thank you,
BALATON Zoltan


^ permalink raw reply	[flat|nested] 30+ messages in thread

* RE: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-10 15:38       ` BALATON Zoltan
  2020-02-10 19:04         ` John Snow
@ 2020-02-25 22:12         ` BALATON Zoltan
  1 sibling, 0 replies; 30+ messages in thread
From: BALATON Zoltan @ 2020-02-25 22:12 UTC (permalink / raw)
  To: jasper.lowell
  Cc: John Snow, mark.cave-ayland, dgilbert, atar4qemu, qemu-devel

On Mon, 10 Feb 2020, BALATON Zoltan wrote:
> This suggests the common IDE bmdma and ide-cd code is likely OK and problem 
> is somewhere in irq routing. What's relevant for this thread and sparc64 is 
> that then you should also check interrupt controller and routing if an 
> interrupt raised by the IDE controller could get to the CPU in your case as 
> that could be where the problem is and maybe not in common code as I've 
> suspected before.

I can now confirm that my problem was related to IRQ routing as noted 
here:

https://lists.nongnu.org/archive/html/qemu-devel/2020-02/msg07225.html

so any similar problem for Solaris is not related to this and common IDE 
and BMDMA code are likely OK so you may want to check IRQ handling in 
board and chipset emulation in case the cause is similar to what I had.

Regards,
BALATON Zoltan


^ permalink raw reply	[flat|nested] 30+ messages in thread

* RE: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-19 20:10       ` BALATON Zoltan
  2020-02-21 19:53         ` Dr. David Alan Gilbert
@ 2020-02-28 22:05         ` BALATON Zoltan
  2020-03-01  0:15           ` BALATON Zoltan
  1 sibling, 1 reply; 30+ messages in thread
From: BALATON Zoltan @ 2020-02-28 22:05 UTC (permalink / raw)
  To: jasper.lowell; +Cc: mark.cave-ayland, jsnow, qemu-devel, atar4qemu, dgilbert

On Wed, 19 Feb 2020, BALATON Zoltan wrote:
> On Wed, 19 Feb 2020, BALATON Zoltan wrote:
>> faster or doing something differently? Does someone know what interrupts 
>> are generated on real hardware in DMA mode so we can compare that to what 
>> we see with QEMU?
>
> The document Programming Interface for Bus Master IDE Controller, Revision 
> 1.0 (5/16/94) has some info on this. AFAIU it says that after DMA operation 
> is completed an IRQ should be raised. On page 5, section 3.1. Data 
> Synchronization it says:
>
> "Another way to view this requirement is that the first read to the 
> controller Status register in response to the IDE device interrupt must 
> return with the Interrupt bit set and with the guarantee that all buffered 
> data has been written to memory."
>
> Not sure if this is relevant but how is it handled in QEMU? Is the right 
> interrupt bit set after DMA transfer is done? If so is it the one that's 
> checked by the OS driver?

I think I now understand the problem with via-ide at least and the 
following is true for that case. I'm not sure about the CMD646 but it may 
be similar as these seem to be similar designs or maybe even related 
somehow. The problem in my case stems from that the device has two modes 
documented: legacy where it uses standard ISA ioports and INT14 and 15 for 
the two channels and native mode in which it uses PCI BARs for io address 
and an IRQ configurable via PCI_INTERRUPT_LINE (config reg 9). It seems 
the IRQ in native mode is still not a PCI INT line but an ISA IRQ, however 
it can be selected by config reg and it's a single interrupt instead of 
two for separate channels (Linux prints these during boot so that's a good 
way to check which mode it thinks it's using). That's so far is complex 
enough to not be easy to emulate in QEMU as we can set up legacy ISA ports 
with ide_init_ioport() but there's no way then to switch it off so via-ide 
either implemented legacy or native mode but can't correctly switch 
between those. This may not be a problem most of the time for Linux at 
least which tries to check which mode the controller is in and use that so 
it would work with whatever is there as long as the regs match what's 
emulated so we can just emulate one mode and still work.

But all of the above is further complicated by that on some (most?) boards 
there's also a "non 100% native mode" in which the io addresses are taken 
from the PCI BARs but still using hardcoded INT14 and 15, ignoring the 
setting in PCI_INTERRUPT_LINE. So guest drivers may assume this without 
checking regs and not care about what's set in PCI_INTERRUPT_LINE just 
expect interrupts on INT14 and 15. If the emulation raises PCI INT or some 
other isa interrupt it won't work, even if config regs correctly describe 
the difference following the docs but guest drivers don't care about the 
chip spec only the implementation on the board they meant to run on. 
Unfortunately different guests use different heuristics and workarounds 
(even Linux does so on different archs) so it's not easy to make an 
emulation that works with all. The pegasos2 firmware for example sets 
via-ide in native mode and assigns interrupt 9 but on real hardware this 
reg seems to be hardcoded to 14 and Linux uses this to detect if it needs 
to use the half-native mode but sets the mode reg to legacy to note this 
despite then using PCI BARs (so we can't hardcode mode reg to always 
native without breaking this but have to force int reg and emulate half 
native mode to work with other guests). Linux would also work with 100% 
native mode with IRQ9 but Amiga like OSes don't seem to care and just use 
hardcoded half-native mode regardless of config regs and expect interrupt 
on IRQ14 and 15. I could make a patch to work with all these on pegasos2 
but the via-ide is also used on a mips board where the corresponding Linux 
version also applies its own (different) workarounds corresponding to the 
quirks of that board and ends up either trying to use legacy mode (which 
is not emulated as io is only on PCI BARs) or trying to use 100% native 
mode which does not work with half-native interrupts. I think I'll need to 
add a special property to the device to set it to half-native for pegasos2 
and leave it 100% native for mips, otherwise there may not be a 
combination which works with all these firmwares and guests on both 
machines. (We still can avoid having to implement native mode as well but 
I can imagine if some PC guests were involved we may need that too but on 
these ppc and mips boards and also in your case I think native and 
half-native modes should be enough as that's all guests use.)

The CMD646 case might be similar and that's also used on a hppa board so 
you may need to check with that too if you make changes. To check this 
theory you might try forcing ide interrupts to be IRQ14 and 15 via 
something like:

qemu_set_irq(isa_get_irq(NULL, (channel ? 15 : 14)), level);

instead of using PCI interrupt or configured ISA interrupt in native mode 
and see if Solaris likes it better. If so then go on a quest to find a 
combination that works with at least Linux on both the sparc and hppa 
boards and Solaris (if that's not enough you can also try NeXTSTEP :-) ). 
So I think after all the common ide and bmdma code is probably OK and we 
have problems in individual controller emulations which is made difficult 
because of different hardware quirks and assumptions of guest sofware.

Regards,
BALATON Zoltan



^ permalink raw reply	[flat|nested] 30+ messages in thread

* RE: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-28 22:05         ` BALATON Zoltan
@ 2020-03-01  0:15           ` BALATON Zoltan
  0 siblings, 0 replies; 30+ messages in thread
From: BALATON Zoltan @ 2020-03-01  0:15 UTC (permalink / raw)
  To: jasper.lowell; +Cc: qemu-devel, dgilbert

On Fri, 28 Feb 2020, BALATON Zoltan wrote:
> I think I now understand the problem with via-ide at least and the following

FYI, I came up with this patch:

http://patchwork.ozlabs.org/project/qemu-devel/list/?series=161714

that fixes my problem with via-ide. The first patch also touches CMD646 to 
allow reusing a field in PCIIDEState for flags but I did not change 
anything else for CMD646.

Regards,
BALATON Zoltan


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-02-09 11:26 ` Mark Cave-Ayland
  2020-02-19  3:42   ` jasper.lowell
@ 2020-05-07 14:29   ` jasper.lowell
  2020-05-07 15:02     ` Artyom Tarasenko
  2020-05-07 18:54     ` BALATON Zoltan
  1 sibling, 2 replies; 30+ messages in thread
From: jasper.lowell @ 2020-05-07 14:29 UTC (permalink / raw)
  To: mark.cave-ayland, qemu-devel; +Cc: tony.nguyen, dgilbert, atar4qemu

Just thought I'd chime in with an update.

We are currently emulating a 16550A UART. The guest sees this as the SU
device, referring to the SuperIO port (a pair of 16550A UARTs). On the
Ultra 5, the machine that Sun4u is modelled against, SuperIO was used
for the keyboard and mouse. The Ultra 5 also had a DB25 (ttya default)
and a DB9 (ttyb default) with a SAB82532 ESSC2.

Using tracing, I've looked through how the 16550A UART is touched and
it looks like Solaris 10 has no issues identifying the device. I've
matched register accesses with driver code in OpenSolaris and I'm
pretty sure the device is attached successfully. Also, if you boot
Solaris 10 with debugging output, you can see that the device gets
labelled as su0. The only time Solaris is capable of writing to the
console is when OpenBIOS is used as a proxy.

Rather than Solaris deciding against using SuperIO as a tty, I don't
think there was ever any support for doing so (at least on SPARC
machines). This could be an explanation for why the system appears to
be trucking along just fine despite a seemingly frozen console - there
is no console. I don't think the frozen console is the fault of broken
interrupt routing as the 16550A UART is never programmed to generate
them.

I've started work on emulating the SAB 82532 ESSC2 but it's
unfortunately way more complex than than the 16550A. For instance, it's
possible to configure different baudrates for receiving and
transmitting. QEMU's chardev interface doesn't appear to handle that.
QEMUSerialSetParams has a single speed value that is passed to
cfsetispeed and cfsetospeed. The chip also has support for stick parity
, which aren't valid options right now either. If I'm wrong on either
of those points please correct me. Unless there is an alternative,
changes to the interface may need to be made if adding this device is
to be considered.


Jasper Lowell.


On Sun, 2020-02-09 at 11:26 +0000, Mark Cave-Ayland wrote:
> On 05/02/2020 06:31, jasper.lowell@bt.com wrote:
> 
> > I'm currently working towards emulating Solaris 10 on sun4u.
> > 
> >  
> > 
> > The Solaris 10 ISO image I am attempting to boot is the one from
> > the Oracle
> > 
> > download page at
> > https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
> > 
> > Image: sol-10-u11-ga-sparc-dvd.iso
> > 
> > MD5:   53e8b066f7f250ce2fd2cef063f8072b
> > 
> >  
> > 
> > I am using QEMU commit 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
> > 
> >  
> > 
> > The command I am using to run QEMU is:
> > 
> > ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios
> > ./openbios/obj-sparc64/openbios-builtin.elf -cdrom
> > ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m 3G
> > 
> >  
> > 
> > ```
> > 
> > CPUs: 1 x SUNW,UltraSPARC-IIi
> > 
> > UUID: 00000000-0000-0000-0000-000000000000
> > 
> > Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
> > 
> >   Type 'help' for detailed information
> > 
> > Trying cdrom:f...
> > 
> > Not a bootable ELF image
> > 
> > Not a bootable a.out image
> > 
> >  
> > 
> > Loading FCode image...
> > 
> > Loaded 7420 bytes
> > 
> > entry point is 0x4000
> > 
> > Evaluating FCode...
> > 
> > Evaluating FCode...
> > 
> > Ignoring failed claim for va 1000000 memsz af6d6!
> > 
> > Ignoring failed claim for va 1402000 memsz 4dcc8!
> > 
> > Ignoring failed claim for va 1800000 memsz 510c8!
> > 
> > SunOS Release 5.10 Version Generic_147147-26 64-bit
> > 
> > Copyright (c) 1983, 2013, Oracle and/or its affiliates. All rights
> > reserved.
> > 
> > could not find debugger-vocabulary-hook>threads:interpret:
> > exception -13 caught
> > 
> > interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
> > 
> > \ All rights reserved.
> > 
> > \
> > 
> > \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
> > 
> >  
> > 
> > hex
> > 
> >  
> > 
> > only forth also definitions
> > 
> > vocabulary kdbg-words
> > 
> > also kdbg-words definitions
> > 
> >  
> > 
> > defer p@
> > 
> > defer p!
> > 
> > ['] x@ is p@
> > 
> > ['] x! is p!
> > 
> >  
> > 
> > 8 constant ptrsize
> > 
> >  
> > 
> > d# 32 constant nbitsminor
> > 
> > h# ffffffff constant maxmin
> > 
> > \
> > 
> > \ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
> > 
> > \ Use is subject to license terms.
> > 
> > \
> > 
> >  
> > 
> > \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
> > 
> >  
> > 
> > h# 7ff constant v9bias
> > 
> > h# unix-tte:interpret: exception -13 caught
> > 
> > interpret ' unix-tte is va>tte-data failed with error
> > ffffffffffffffed
> > 
> > WARNING: consconfig: cannot find driver for screen device /pci@1fe,
> > 0/pci@1,1/QEMU,VGA@2
> > 
> > Configuring devices.
> > 
> > WARNING: Interrupt not seen after set_features
> > 
> > Using RPC Bootparams for network configuration information.
> > 
> > Attempting to configure interface hme0...
> > 
> > WARNING: Power off requested from power button or SC, powering down
> > the system!
> > 
> > Skipped interface hme0
> > 
> > svc:/system/filesystem/local:default: WARNING: /usr/sbin/zfs mount
> > -a failed: one or
> > more file systems failed to mount
> > 
> > Serial console, reverting to text install
> > 
> > Beginning system identification...
> > 
> > Searching for configuration file(s)...
> > 
> > Search complete.
> > 
> > Discovering additional network configuration...
> > 
> > ```
> > 
> >  
> > 
> > The installation menu is shown after but the console is
> > unresponsive.
> > 
> >  
> > 
> > After some debugging, it looks like the QEMU front-end is correctly
> > filling
> > 
> > the serial receive buffer with characters, and then starts dropping
> > them once
> > 
> > the number of characters in the buffer reach the interrupt level.
> > The interrupt
> > 
> > level happens to be 1 when booting Solaris 10. This looks like
> > normal behaviour
> > 
> > to me.
> > 
> >  
> > 
> > I started looking at why the serial receive buffer might not be
> > consumed and
> > 
> > considered that interrupts might not be being raised correctly. I
> > ran with
> > 
> > tracing and there were no interrupts for IRQ 0x2b like there are
> > when using
> > 
> > OpenBSD. When inspecting the registers of the serial device it
> > looks like the
> > 
> > Interrupt Enable Register is set to zero.
> > 
> >  
> > 
> > If Solaris 10 was using the device is polling mode, it should be
> > reading the RBR
> > 
> > or at least the LSR. When tracing serial_ioport_read and
> > serial_ioport_write,
> > 
> > once the menu is hit, I don't see any read or writes to the serial
> > device
> > 
> > registers despite me trying to send characters and use the menu.
> > 
> >  
> > 
> > The driver Solaris 10 is using for the device appears to be
> > similar/same as
> > 
> > /usr/src/uts/sun4/io/su_driver.c in the OpenSolaris code found at
> > https://github.com/nxmirrors/onnv.
> > 
> >  
> > 
> > ```
> > 
> > asy->asy_hwtype = ASY16550AF;
> > 
> > OUTB(FIFOR, 0x00); /* clear fifo register */
> > 
> > asy->asy_trig_level = 0x00; /* sets the fifo Threshold to 1 */
> > 
> >  
> > 
> > /* set/Enable FIFO */
> > 
> > OUTB(FIFOR, FIFO_ON | FIFODMA | FIFOTXFLSH | FIFORXFLSH |
> > 
> > (asy->asy_trig_level & 0xff));
> > 
> >  
> > 
> > if ((INB(ISR) & 0xc0) == 0xc0)
> > 
> >     asy->asy_use_fifo = FIFO_ON; /* QEMU REACHES HERE. */
> > 
> > else {
> > 
> >     asy->asy_hwtype = ASY8250;
> > 
> >     OUTB(FIFOR, 0x00); /* NO FIFOs */
> > 
> >     asy->asy_trig_level = 0;
> > 
> > }
> > 
> > ```
> > 
> >  
> > 
> > From what I can tell when tracing serial_ioport_write and
> > serial_ioport_read,
> > 
> > Solaris 10 correctly identifies the serial device and successfully
> > attaches it.
> > 
> > In the asyattach function (OpenSolaris driver), interrupts are
> > disabled by zeroing the
> > 
> > Interrupt Enable Register. From what I'm reading in OpenSolaris
> > source code, interrupts
> > 
> > are reenabled when the device is "opened". This seems like
> > consistent and
> > 
> > correct behaviour though I'm not sure why the device is not being
> > opened to be
> > 
> > used by the serial console.
> > 
> >  
> > 
> > Is this an issue anyone else has tried to debug?
> > 
> > Are there any leads that I can follow up on for why the serial
> > console becomes
> > unresponsive
> > 
> > on Solaris 10?
> 
> It has been a while since I've looked at booting Solaris >= 10 but
> certainly the
> messages above about set_features and the frozen console suggest that
> something is
> going amiss with interrupt routing, although since Linux and NetBSD
> were fine the
> last time I ran my OpenBIOS release tests then Solaris must be doing
> something
> different here.
> 
> Note that the serial interrupts are routed from the ebus into sabre
> so the first
> thing to check would be that the end-to-end routing from device to
> CPU looks correct
> when using Solaris.
> 
> 
> ATB,
> 
> Mark.

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-07 14:29   ` jasper.lowell
@ 2020-05-07 15:02     ` Artyom Tarasenko
  2020-05-08  2:33       ` jasper.lowell
  2020-05-07 18:54     ` BALATON Zoltan
  1 sibling, 1 reply; 30+ messages in thread
From: Artyom Tarasenko @ 2020-05-07 15:02 UTC (permalink / raw)
  To: jasper.lowell
  Cc: tony.nguyen, Mark Cave-Ayland, qemu-devel, Dr. David Alan Gilbert

On Thu, May 7, 2020 at 4:29 PM <jasper.lowell@bt.com> wrote:
>
> Just thought I'd chime in with an update.
>
> We are currently emulating a 16550A UART. The guest sees this as the SU
> device, referring to the SuperIO port (a pair of 16550A UARTs). On the
> Ultra 5, the machine that Sun4u is modelled against, SuperIO was used
> for the keyboard and mouse. The Ultra 5 also had a DB25 (ttya default)
> and a DB9 (ttyb default) with a SAB82532 ESSC2.
>
> Using tracing, I've looked through how the 16550A UART is touched and
> it looks like Solaris 10 has no issues identifying the device. I've
> matched register accesses with driver code in OpenSolaris and I'm
> pretty sure the device is attached successfully. Also, if you boot
> Solaris 10 with debugging output, you can see that the device gets
> labelled as su0. The only time Solaris is capable of writing to the
> console is when OpenBIOS is used as a proxy.
>
> Rather than Solaris deciding against using SuperIO as a tty, I don't
> think there was ever any support for doing so (at least on SPARC
> machines). This could be an explanation for why the system appears to
> be trucking along just fine despite a seemingly frozen console - there
> is no console. I don't think the frozen console is the fault of broken
> interrupt routing as the 16550A UART is never programmed to generate
> them.

At least Fujitsu Siemens PRIMEPOWER250 had a tty attached to the
16550A UART. I think there were more such machines. I don't expect
there is anything in the Solaris kernel which would prevent any serial
device known to it to be used as a tty.

> I've started work on emulating the SAB 82532 ESSC2 but it's
> unfortunately way more complex than than the 16550A. For instance, it's
> possible to configure different baudrates for receiving and
> transmitting. QEMU's chardev interface doesn't appear to handle that.
> QEMUSerialSetParams has a single speed value that is passed to
> cfsetispeed and cfsetospeed. The chip also has support for stick parity
> , which aren't valid options right now either. If I'm wrong on either
> of those points please correct me. Unless there is an alternative,
> changes to the interface may need to be made if adding this device is
> to be considered.

Well, theoretically yes, but practically there is just one baudrate
which can be specified in the OBP. I think it's perfectly safe to use
max(rxrate,txrate), or min(rxrate,txrate), whatever you prefer.

Regards,
Artyom
>
> On Sun, 2020-02-09 at 11:26 +0000, Mark Cave-Ayland wrote:
> > On 05/02/2020 06:31, jasper.lowell@bt.com wrote:
> >
> > > I'm currently working towards emulating Solaris 10 on sun4u.
> > >
> > >
> > >
> > > The Solaris 10 ISO image I am attempting to boot is the one from
> > > the Oracle
> > >
> > > download page at
> > > https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
> > >
> > > Image: sol-10-u11-ga-sparc-dvd.iso
> > >
> > > MD5:   53e8b066f7f250ce2fd2cef063f8072b
> > >
> > >
> > >
> > > I am using QEMU commit 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
> > >
> > >
> > >
> > > The command I am using to run QEMU is:
> > >
> > > ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios
> > > ./openbios/obj-sparc64/openbios-builtin.elf -cdrom
> > > ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m 3G
> > >
> > >
> > >
> > > ```
> > >
> > > CPUs: 1 x SUNW,UltraSPARC-IIi
> > >
> > > UUID: 00000000-0000-0000-0000-000000000000
> > >
> > > Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
> > >
> > >   Type 'help' for detailed information
> > >
> > > Trying cdrom:f...
> > >
> > > Not a bootable ELF image
> > >
> > > Not a bootable a.out image
> > >
> > >
> > >
> > > Loading FCode image...
> > >
> > > Loaded 7420 bytes
> > >
> > > entry point is 0x4000
> > >
> > > Evaluating FCode...
> > >
> > > Evaluating FCode...
> > >
> > > Ignoring failed claim for va 1000000 memsz af6d6!
> > >
> > > Ignoring failed claim for va 1402000 memsz 4dcc8!
> > >
> > > Ignoring failed claim for va 1800000 memsz 510c8!
> > >
> > > SunOS Release 5.10 Version Generic_147147-26 64-bit
> > >
> > > Copyright (c) 1983, 2013, Oracle and/or its affiliates. All rights
> > > reserved.
> > >
> > > could not find debugger-vocabulary-hook>threads:interpret:
> > > exception -13 caught
> > >
> > > interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
> > >
> > > \ All rights reserved.
> > >
> > > \
> > >
> > > \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
> > >
> > >
> > >
> > > hex
> > >
> > >
> > >
> > > only forth also definitions
> > >
> > > vocabulary kdbg-words
> > >
> > > also kdbg-words definitions
> > >
> > >
> > >
> > > defer p@
> > >
> > > defer p!
> > >
> > > ['] x@ is p@
> > >
> > > ['] x! is p!
> > >
> > >
> > >
> > > 8 constant ptrsize
> > >
> > >
> > >
> > > d# 32 constant nbitsminor
> > >
> > > h# ffffffff constant maxmin
> > >
> > > \
> > >
> > > \ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
> > >
> > > \ Use is subject to license terms.
> > >
> > > \
> > >
> > >
> > >
> > > \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
> > >
> > >
> > >
> > > h# 7ff constant v9bias
> > >
> > > h# unix-tte:interpret: exception -13 caught
> > >
> > > interpret ' unix-tte is va>tte-data failed with error
> > > ffffffffffffffed
> > >
> > > WARNING: consconfig: cannot find driver for screen device /pci@1fe,
> > > 0/pci@1,1/QEMU,VGA@2
> > >
> > > Configuring devices.
> > >
> > > WARNING: Interrupt not seen after set_features
> > >
> > > Using RPC Bootparams for network configuration information.
> > >
> > > Attempting to configure interface hme0...
> > >
> > > WARNING: Power off requested from power button or SC, powering down
> > > the system!
> > >
> > > Skipped interface hme0
> > >
> > > svc:/system/filesystem/local:default: WARNING: /usr/sbin/zfs mount
> > > -a failed: one or
> > > more file systems failed to mount
> > >
> > > Serial console, reverting to text install
> > >
> > > Beginning system identification...
> > >
> > > Searching for configuration file(s)...
> > >
> > > Search complete.
> > >
> > > Discovering additional network configuration...
> > >
> > > ```
> > >
> > >
> > >
> > > The installation menu is shown after but the console is
> > > unresponsive.
> > >
> > >
> > >
> > > After some debugging, it looks like the QEMU front-end is correctly
> > > filling
> > >
> > > the serial receive buffer with characters, and then starts dropping
> > > them once
> > >
> > > the number of characters in the buffer reach the interrupt level.
> > > The interrupt
> > >
> > > level happens to be 1 when booting Solaris 10. This looks like
> > > normal behaviour
> > >
> > > to me.
> > >
> > >
> > >
> > > I started looking at why the serial receive buffer might not be
> > > consumed and
> > >
> > > considered that interrupts might not be being raised correctly. I
> > > ran with
> > >
> > > tracing and there were no interrupts for IRQ 0x2b like there are
> > > when using
> > >
> > > OpenBSD. When inspecting the registers of the serial device it
> > > looks like the
> > >
> > > Interrupt Enable Register is set to zero.
> > >
> > >
> > >
> > > If Solaris 10 was using the device is polling mode, it should be
> > > reading the RBR
> > >
> > > or at least the LSR. When tracing serial_ioport_read and
> > > serial_ioport_write,
> > >
> > > once the menu is hit, I don't see any read or writes to the serial
> > > device
> > >
> > > registers despite me trying to send characters and use the menu.
> > >
> > >
> > >
> > > The driver Solaris 10 is using for the device appears to be
> > > similar/same as
> > >
> > > /usr/src/uts/sun4/io/su_driver.c in the OpenSolaris code found at
> > > https://github.com/nxmirrors/onnv.
> > >
> > >
> > >
> > > ```
> > >
> > > asy->asy_hwtype = ASY16550AF;
> > >
> > > OUTB(FIFOR, 0x00); /* clear fifo register */
> > >
> > > asy->asy_trig_level = 0x00; /* sets the fifo Threshold to 1 */
> > >
> > >
> > >
> > > /* set/Enable FIFO */
> > >
> > > OUTB(FIFOR, FIFO_ON | FIFODMA | FIFOTXFLSH | FIFORXFLSH |
> > >
> > > (asy->asy_trig_level & 0xff));
> > >
> > >
> > >
> > > if ((INB(ISR) & 0xc0) == 0xc0)
> > >
> > >     asy->asy_use_fifo = FIFO_ON; /* QEMU REACHES HERE. */
> > >
> > > else {
> > >
> > >     asy->asy_hwtype = ASY8250;
> > >
> > >     OUTB(FIFOR, 0x00); /* NO FIFOs */
> > >
> > >     asy->asy_trig_level = 0;
> > >
> > > }
> > >
> > > ```
> > >
> > >
> > >
> > > From what I can tell when tracing serial_ioport_write and
> > > serial_ioport_read,
> > >
> > > Solaris 10 correctly identifies the serial device and successfully
> > > attaches it.
> > >
> > > In the asyattach function (OpenSolaris driver), interrupts are
> > > disabled by zeroing the
> > >
> > > Interrupt Enable Register. From what I'm reading in OpenSolaris
> > > source code, interrupts
> > >
> > > are reenabled when the device is "opened". This seems like
> > > consistent and
> > >
> > > correct behaviour though I'm not sure why the device is not being
> > > opened to be
> > >
> > > used by the serial console.
> > >
> > >
> > >
> > > Is this an issue anyone else has tried to debug?
> > >
> > > Are there any leads that I can follow up on for why the serial
> > > console becomes
> > > unresponsive
> > >
> > > on Solaris 10?
> >
> > It has been a while since I've looked at booting Solaris >= 10 but
> > certainly the
> > messages above about set_features and the frozen console suggest that
> > something is
> > going amiss with interrupt routing, although since Linux and NetBSD
> > were fine the
> > last time I ran my OpenBIOS release tests then Solaris must be doing
> > something
> > different here.
> >
> > Note that the serial interrupts are routed from the ebus into sabre
> > so the first
> > thing to check would be that the end-to-end routing from device to
> > CPU looks correct
> > when using Solaris.
> >
> >
> > ATB,
> >
> > Mark.



-- 
Regards,
Artyom Tarasenko

SPARC and PPC PReP under qemu blog: http://tyom.blogspot.com/search/label/qemu


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-07 14:29   ` jasper.lowell
  2020-05-07 15:02     ` Artyom Tarasenko
@ 2020-05-07 18:54     ` BALATON Zoltan
  2020-05-08  2:55       ` jasper.lowell
  1 sibling, 1 reply; 30+ messages in thread
From: BALATON Zoltan @ 2020-05-07 18:54 UTC (permalink / raw)
  To: jasper.lowell
  Cc: tony.nguyen, mark.cave-ayland, qemu-devel, atar4qemu, dgilbert

On Thu, 7 May 2020, jasper.lowell@bt.com wrote:
> I've started work on emulating the SAB 82532 ESSC2 but it's
> unfortunately way more complex than than the 16550A. For instance, it's

I don't know anything about this chip so don't know if it helps but if 
it's any way similar to ESCC (and the ESCC2 name is not just marketing) 
then there's some emulation of that in hw/char/escc.c that you may want to 
look at.

> possible to configure different baudrates for receiving and
> transmitting. QEMU's chardev interface doesn't appear to handle that.
> QEMUSerialSetParams has a single speed value that is passed to
> cfsetispeed and cfsetospeed. The chip also has support for stick parity
> , which aren't valid options right now either. If I'm wrong on either
> of those points please correct me. Unless there is an alternative,
> changes to the interface may need to be made if adding this device is
> to be considered.

Maybe you can get away with setting these to the values the driver would 
set and hard coding it for now just to get some output. Then you can 
ignore the corresponding registers which could simplify initial device 
model.

Regards,
BALATON Zoltan


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-07 15:02     ` Artyom Tarasenko
@ 2020-05-08  2:33       ` jasper.lowell
  2020-05-08  8:51         ` Peter Tribble
  0 siblings, 1 reply; 30+ messages in thread
From: jasper.lowell @ 2020-05-08  2:33 UTC (permalink / raw)
  To: atar4qemu; +Cc: qemu-devel, tony.nguyen, mark.cave-ayland, dgilbert

There are two different drivers for the 16550A in OpenSolaris.

There is a generic driver in /usr/src/uts/common/io/asy.c. This driver
clearly states in comments that it is assigning the device to tty[a-d]. 
It's really obvious to me that there is support in this driver for
using the device for a tty.

There is another driver at /usr/src/uts/sun4/io/su_driver.c. Judging
from the name this is specific for SuperIO. This driver is more than
1000 lines shorter than the other driver and contains a note at the top
of the file that it is "modified as sparc keyboard/mouse driver." I
don't have much experience with Solaris internals but I can't see any
obvious signs that this can be used as a tty. I'd also question why
there are two drivers if they have the same purpose/capability. If the
su_driver exists to only add support for the keyboard/mouse I'm not
sure why it would be shorter rather than longer. It would be helpful if
someone with Solaris experience, that knows what they're doing (I do
not), can take a look at this driver and give a better opinion.

When emulating Sun4u, the su driver is used. If you misconfigure the
serial device in QEMU, you can trigger errors that are unique to the
driver. Also, Solaris attaches the device as su0.

Solaris can access the registers, identify/attach the device, but it
just never attempts to use it. Interrupts are explicitly disabled and
the device is never polled. I don't think asyopen in su_driver.c is
ever called. I've thoroughly stepped through every register access for
the 16550A and nothing seems out of the ordinary to me. Something I've
considered is that OpenBIOS is not setting properties for the device in
a way that Solaris expects but I'm not familiar enough with Sun's
OpenBOOT to make progress here. I've read through the PROM functions
that Solaris calls when choosing what device to use as a console and
nothing seemed inconsistent with what OpenBIOS does. Unfortunately,
OpenBIOS seems to crash or hang when using the kernel debugger module,
so dynamic analysis using breakpoints isn't an option.

I don't have any concrete explanations for the broken console but
rather than do nothing I figured I'd see what happens by emulating the
SAB 82532.

> At least Fujitsu Siemens PRIMEPOWER250 had a tty attached to the
> 16550A UART. I think there were more such machines. I don't expect
> there is anything in the Solaris kernel which would prevent any
> serial
> device known to it to be used as a tty.

Do you happen to know if this was over SuperIO? If this machine was
using the same su_driver for a serial console it would rule out
emulating the hardware-faithful SAB 82532 as being a possible
improvement. I can't find anything online about someone using SuperIO
for a ttya on an Ultra 5 running Solaris.

> Well, theoretically yes, but practically there is just one baudrate
> which can be specified in the OBP. I think it's perfectly safe to use
> max(rxrate,txrate), or min(rxrate,txrate), whatever you prefer.

I'll do this while looking at whether or not the different chip fixes
the console problems on Sun4u. I'd personally like to avoid introducing
a device to QEMU that makes assumptions about how the guest may
configure the chip.

Thanks,
Jasper Lowell.


On Thu, 2020-05-07 at 17:02 +0200, Artyom Tarasenko wrote:
> On Thu, May 7, 2020 at 4:29 PM <jasper.lowell@bt.com> wrote:
> > Just thought I'd chime in with an update.
> > 
> > We are currently emulating a 16550A UART. The guest sees this as
> > the SU
> > device, referring to the SuperIO port (a pair of 16550A UARTs). On
> > the
> > Ultra 5, the machine that Sun4u is modelled against, SuperIO was
> > used
> > for the keyboard and mouse. The Ultra 5 also had a DB25 (ttya
> > default)
> > and a DB9 (ttyb default) with a SAB82532 ESSC2.
> > 
> > Using tracing, I've looked through how the 16550A UART is touched
> > and
> > it looks like Solaris 10 has no issues identifying the device. I've
> > matched register accesses with driver code in OpenSolaris and I'm
> > pretty sure the device is attached successfully. Also, if you boot
> > Solaris 10 with debugging output, you can see that the device gets
> > labelled as su0. The only time Solaris is capable of writing to the
> > console is when OpenBIOS is used as a proxy.
> > 
> > Rather than Solaris deciding against using SuperIO as a tty, I
> > don't
> > think there was ever any support for doing so (at least on SPARC
> > machines). This could be an explanation for why the system appears
> > to
> > be trucking along just fine despite a seemingly frozen console -
> > there
> > is no console. I don't think the frozen console is the fault of
> > broken
> > interrupt routing as the 16550A UART is never programmed to
> > generate
> > them.
> 
> At least Fujitsu Siemens PRIMEPOWER250 had a tty attached to the
> 16550A UART. I think there were more such machines. I don't expect
> there is anything in the Solaris kernel which would prevent any
> serial
> device known to it to be used as a tty.
> 
> > I've started work on emulating the SAB 82532 ESSC2 but it's
> > unfortunately way more complex than than the 16550A. For instance,
> > it's
> > possible to configure different baudrates for receiving and
> > transmitting. QEMU's chardev interface doesn't appear to handle
> > that.
> > QEMUSerialSetParams has a single speed value that is passed to
> > cfsetispeed and cfsetospeed. The chip also has support for stick
> > parity
> > , which aren't valid options right now either. If I'm wrong on
> > either
> > of those points please correct me. Unless there is an alternative,
> > changes to the interface may need to be made if adding this device
> > is
> > to be considered.
> 
> Well, theoretically yes, but practically there is just one baudrate
> which can be specified in the OBP. I think it's perfectly safe to use
> max(rxrate,txrate), or min(rxrate,txrate), whatever you prefer.
> 
> Regards,
> Artyom
> > On Sun, 2020-02-09 at 11:26 +0000, Mark Cave-Ayland wrote:
> > > On 05/02/2020 06:31, jasper.lowell@bt.com wrote:
> > > 
> > > > I'm currently working towards emulating Solaris 10 on sun4u.
> > > > 
> > > > 
> > > > 
> > > > The Solaris 10 ISO image I am attempting to boot is the one
> > > > from
> > > > the Oracle
> > > > 
> > > > download page at
> > > > https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
> > > > 
> > > > Image: sol-10-u11-ga-sparc-dvd.iso
> > > > 
> > > > MD5:   53e8b066f7f250ce2fd2cef063f8072b
> > > > 
> > > > 
> > > > 
> > > > I am using QEMU commit
> > > > 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
> > > > 
> > > > 
> > > > 
> > > > The command I am using to run QEMU is:
> > > > 
> > > > ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios
> > > > ./openbios/obj-sparc64/openbios-builtin.elf -cdrom
> > > > ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m
> > > > 3G
> > > > 
> > > > 
> > > > 
> > > > ```
> > > > 
> > > > CPUs: 1 x SUNW,UltraSPARC-IIi
> > > > 
> > > > UUID: 00000000-0000-0000-0000-000000000000
> > > > 
> > > > Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
> > > > 
> > > >   Type 'help' for detailed information
> > > > 
> > > > Trying cdrom:f...
> > > > 
> > > > Not a bootable ELF image
> > > > 
> > > > Not a bootable a.out image
> > > > 
> > > > 
> > > > 
> > > > Loading FCode image...
> > > > 
> > > > Loaded 7420 bytes
> > > > 
> > > > entry point is 0x4000
> > > > 
> > > > Evaluating FCode...
> > > > 
> > > > Evaluating FCode...
> > > > 
> > > > Ignoring failed claim for va 1000000 memsz af6d6!
> > > > 
> > > > Ignoring failed claim for va 1402000 memsz 4dcc8!
> > > > 
> > > > Ignoring failed claim for va 1800000 memsz 510c8!
> > > > 
> > > > SunOS Release 5.10 Version Generic_147147-26 64-bit
> > > > 
> > > > Copyright (c) 1983, 2013, Oracle and/or its affiliates. All
> > > > rights
> > > > reserved.
> > > > 
> > > > could not find debugger-vocabulary-hook>threads:interpret:
> > > > exception -13 caught
> > > > 
> > > > interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
> > > > 
> > > > \ All rights reserved.
> > > > 
> > > > \
> > > > 
> > > > \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
> > > > 
> > > > 
> > > > 
> > > > hex
> > > > 
> > > > 
> > > > 
> > > > only forth also definitions
> > > > 
> > > > vocabulary kdbg-words
> > > > 
> > > > also kdbg-words definitions
> > > > 
> > > > 
> > > > 
> > > > defer p@
> > > > 
> > > > defer p!
> > > > 
> > > > ['] x@ is p@
> > > > 
> > > > ['] x! is p!
> > > > 
> > > > 
> > > > 
> > > > 8 constant ptrsize
> > > > 
> > > > 
> > > > 
> > > > d# 32 constant nbitsminor
> > > > 
> > > > h# ffffffff constant maxmin
> > > > 
> > > > \
> > > > 
> > > > \ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
> > > > 
> > > > \ Use is subject to license terms.
> > > > 
> > > > \
> > > > 
> > > > 
> > > > 
> > > > \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
> > > > 
> > > > 
> > > > 
> > > > h# 7ff constant v9bias
> > > > 
> > > > h# unix-tte:interpret: exception -13 caught
> > > > 
> > > > interpret ' unix-tte is va>tte-data failed with error
> > > > ffffffffffffffed
> > > > 
> > > > WARNING: consconfig: cannot find driver for screen device 
> > > > /pci@1fe,
> > > > 0/pci@1,1/QEMU,VGA@2
> > > > 
> > > > Configuring devices.
> > > > 
> > > > WARNING: Interrupt not seen after set_features
> > > > 
> > > > Using RPC Bootparams for network configuration information.
> > > > 
> > > > Attempting to configure interface hme0...
> > > > 
> > > > WARNING: Power off requested from power button or SC, powering
> > > > down
> > > > the system!
> > > > 
> > > > Skipped interface hme0
> > > > 
> > > > svc:/system/filesystem/local:default: WARNING: /usr/sbin/zfs
> > > > mount
> > > > -a failed: one or
> > > > more file systems failed to mount
> > > > 
> > > > Serial console, reverting to text install
> > > > 
> > > > Beginning system identification...
> > > > 
> > > > Searching for configuration file(s)...
> > > > 
> > > > Search complete.
> > > > 
> > > > Discovering additional network configuration...
> > > > 
> > > > ```
> > > > 
> > > > 
> > > > 
> > > > The installation menu is shown after but the console is
> > > > unresponsive.
> > > > 
> > > > 
> > > > 
> > > > After some debugging, it looks like the QEMU front-end is
> > > > correctly
> > > > filling
> > > > 
> > > > the serial receive buffer with characters, and then starts
> > > > dropping
> > > > them once
> > > > 
> > > > the number of characters in the buffer reach the interrupt
> > > > level.
> > > > The interrupt
> > > > 
> > > > level happens to be 1 when booting Solaris 10. This looks like
> > > > normal behaviour
> > > > 
> > > > to me.
> > > > 
> > > > 
> > > > 
> > > > I started looking at why the serial receive buffer might not be
> > > > consumed and
> > > > 
> > > > considered that interrupts might not be being raised correctly.
> > > > I
> > > > ran with
> > > > 
> > > > tracing and there were no interrupts for IRQ 0x2b like there
> > > > are
> > > > when using
> > > > 
> > > > OpenBSD. When inspecting the registers of the serial device it
> > > > looks like the
> > > > 
> > > > Interrupt Enable Register is set to zero.
> > > > 
> > > > 
> > > > 
> > > > If Solaris 10 was using the device is polling mode, it should
> > > > be
> > > > reading the RBR
> > > > 
> > > > or at least the LSR. When tracing serial_ioport_read and
> > > > serial_ioport_write,
> > > > 
> > > > once the menu is hit, I don't see any read or writes to the
> > > > serial
> > > > device
> > > > 
> > > > registers despite me trying to send characters and use the
> > > > menu.
> > > > 
> > > > 
> > > > 
> > > > The driver Solaris 10 is using for the device appears to be
> > > > similar/same as
> > > > 
> > > > /usr/src/uts/sun4/io/su_driver.c in the OpenSolaris code found
> > > > at
> > > > https://github.com/nxmirrors/onnv.
> > > > 
> > > > 
> > > > 
> > > > ```
> > > > 
> > > > asy->asy_hwtype = ASY16550AF;
> > > > 
> > > > OUTB(FIFOR, 0x00); /* clear fifo register */
> > > > 
> > > > asy->asy_trig_level = 0x00; /* sets the fifo Threshold to 1 */
> > > > 
> > > > 
> > > > 
> > > > /* set/Enable FIFO */
> > > > 
> > > > OUTB(FIFOR, FIFO_ON | FIFODMA | FIFOTXFLSH | FIFORXFLSH |
> > > > 
> > > > (asy->asy_trig_level & 0xff));
> > > > 
> > > > 
> > > > 
> > > > if ((INB(ISR) & 0xc0) == 0xc0)
> > > > 
> > > >     asy->asy_use_fifo = FIFO_ON; /* QEMU REACHES HERE. */
> > > > 
> > > > else {
> > > > 
> > > >     asy->asy_hwtype = ASY8250;
> > > > 
> > > >     OUTB(FIFOR, 0x00); /* NO FIFOs */
> > > > 
> > > >     asy->asy_trig_level = 0;
> > > > 
> > > > }
> > > > 
> > > > ```
> > > > 
> > > > 
> > > > 
> > > > From what I can tell when tracing serial_ioport_write and
> > > > serial_ioport_read,
> > > > 
> > > > Solaris 10 correctly identifies the serial device and
> > > > successfully
> > > > attaches it.
> > > > 
> > > > In the asyattach function (OpenSolaris driver), interrupts are
> > > > disabled by zeroing the
> > > > 
> > > > Interrupt Enable Register. From what I'm reading in OpenSolaris
> > > > source code, interrupts
> > > > 
> > > > are reenabled when the device is "opened". This seems like
> > > > consistent and
> > > > 
> > > > correct behaviour though I'm not sure why the device is not
> > > > being
> > > > opened to be
> > > > 
> > > > used by the serial console.
> > > > 
> > > > 
> > > > 
> > > > Is this an issue anyone else has tried to debug?
> > > > 
> > > > Are there any leads that I can follow up on for why the serial
> > > > console becomes
> > > > unresponsive
> > > > 
> > > > on Solaris 10?
> > > 
> > > It has been a while since I've looked at booting Solaris >= 10
> > > but
> > > certainly the
> > > messages above about set_features and the frozen console suggest
> > > that
> > > something is
> > > going amiss with interrupt routing, although since Linux and
> > > NetBSD
> > > were fine the
> > > last time I ran my OpenBIOS release tests then Solaris must be
> > > doing
> > > something
> > > different here.
> > > 
> > > Note that the serial interrupts are routed from the ebus into
> > > sabre
> > > so the first
> > > thing to check would be that the end-to-end routing from device
> > > to
> > > CPU looks correct
> > > when using Solaris.
> > > 
> > > 
> > > ATB,
> > > 
> > > Mark.
> 
> 

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-07 18:54     ` BALATON Zoltan
@ 2020-05-08  2:55       ` jasper.lowell
  0 siblings, 0 replies; 30+ messages in thread
From: jasper.lowell @ 2020-05-08  2:55 UTC (permalink / raw)
  To: balaton; +Cc: tony.nguyen, mark.cave-ayland, dgilbert, atar4qemu, qemu-devel

> I don't know anything about this chip so don't know if it helps but
> if 
> it's any way similar to ESCC (and the ESCC2 name is not just
> marketing) 
> then there's some emulation of that in hw/char/escc.c that you may
> want to 
> look at.

From what I can tell, the SAB 82532 is a bit more complex than the ESCC
ones. It's not difficult to implement but a complete solution will be
lengthy because of the large combination of configuration options the
chip supports.

> Maybe you can get away with setting these to the values the driver
> would 
> set and hard coding it for now just to get some output. Then you can 
> ignore the corresponding registers which could simplify initial
> device 
> model.

I'll take this approach.

Thanks,
Jasper Lowell.

On Thu, 2020-05-07 at 20:54 +0200, BALATON Zoltan wrote:
> On Thu, 7 May 2020, jasper.lowell@bt.com wrote:
> > I've started work on emulating the SAB 82532 ESSC2 but it's
> > unfortunately way more complex than than the 16550A. For instance,
> > it's
> 
> I don't know anything about this chip so don't know if it helps but
> if 
> it's any way similar to ESCC (and the ESCC2 name is not just
> marketing) 
> then there's some emulation of that in hw/char/escc.c that you may
> want to 
> look at.
> 
> > possible to configure different baudrates for receiving and
> > transmitting. QEMU's chardev interface doesn't appear to handle
> > that.
> > QEMUSerialSetParams has a single speed value that is passed to
> > cfsetispeed and cfsetospeed. The chip also has support for stick
> > parity
> > , which aren't valid options right now either. If I'm wrong on
> > either
> > of those points please correct me. Unless there is an alternative,
> > changes to the interface may need to be made if adding this device
> > is
> > to be considered.
> 
> Maybe you can get away with setting these to the values the driver
> would 
> set and hard coding it for now just to get some output. Then you can 
> ignore the corresponding registers which could simplify initial
> device 
> model.
> 
> Regards,
> BALATON Zoltan

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-08  2:33       ` jasper.lowell
@ 2020-05-08  8:51         ` Peter Tribble
  2020-05-08 13:45           ` Artyom Tarasenko
  0 siblings, 1 reply; 30+ messages in thread
From: Peter Tribble @ 2020-05-08  8:51 UTC (permalink / raw)
  To: jasper.lowell
  Cc: tony.nguyen, mark.cave-ayland, QEMU Developers, atar4qemu, dgilbert

[-- Attachment #1: Type: text/plain, Size: 15686 bytes --]

I see the same behaviour as reported here when booting current SPARC illumos
(illumos is the ongoing fork of OpenSolaris) under qemu - looks like it's
booted
up fine, but I can't type anything on the console.

While I'm an illumos developer, and maintain it on SPARC, I'm unfamiliar
with
most of the internals. We'll try and have a poke around, though.

(The aim would be to use qemu to allow illumos developers to test changes
on SPARC
without requiring them to have SPARC hardware, hence my interest.)

On Fri, May 8, 2020 at 3:40 AM <jasper.lowell@bt.com> wrote:

> There are two different drivers for the 16550A in OpenSolaris.
>
> There is a generic driver in /usr/src/uts/common/io/asy.c. This driver
> clearly states in comments that it is assigning the device to tty[a-d].
> It's really obvious to me that there is support in this driver for
> using the device for a tty.
>
> There is another driver at /usr/src/uts/sun4/io/su_driver.c. Judging
> from the name this is specific for SuperIO. This driver is more than
> 1000 lines shorter than the other driver and contains a note at the top
> of the file that it is "modified as sparc keyboard/mouse driver." I
> don't have much experience with Solaris internals but I can't see any
> obvious signs that this can be used as a tty. I'd also question why
> there are two drivers if they have the same purpose/capability. If the
> su_driver exists to only add support for the keyboard/mouse I'm not
> sure why it would be shorter rather than longer. It would be helpful if
> someone with Solaris experience, that knows what they're doing (I do
> not), can take a look at this driver and give a better opinion.
>
> When emulating Sun4u, the su driver is used. If you misconfigure the
> serial device in QEMU, you can trigger errors that are unique to the
> driver. Also, Solaris attaches the device as su0.
>
> Solaris can access the registers, identify/attach the device, but it
> just never attempts to use it. Interrupts are explicitly disabled and
> the device is never polled. I don't think asyopen in su_driver.c is
> ever called. I've thoroughly stepped through every register access for
> the 16550A and nothing seems out of the ordinary to me. Something I've
> considered is that OpenBIOS is not setting properties for the device in
> a way that Solaris expects but I'm not familiar enough with Sun's
> OpenBOOT to make progress here. I've read through the PROM functions
> that Solaris calls when choosing what device to use as a console and
> nothing seemed inconsistent with what OpenBIOS does. Unfortunately,
> OpenBIOS seems to crash or hang when using the kernel debugger module,
> so dynamic analysis using breakpoints isn't an option.
>
> I don't have any concrete explanations for the broken console but
> rather than do nothing I figured I'd see what happens by emulating the
> SAB 82532.
>
> > At least Fujitsu Siemens PRIMEPOWER250 had a tty attached to the
> > 16550A UART. I think there were more such machines. I don't expect
> > there is anything in the Solaris kernel which would prevent any
> > serial
> > device known to it to be used as a tty.
>
> Do you happen to know if this was over SuperIO? If this machine was
> using the same su_driver for a serial console it would rule out
> emulating the hardware-faithful SAB 82532 as being a possible
> improvement. I can't find anything online about someone using SuperIO
> for a ttya on an Ultra 5 running Solaris.
>
> > Well, theoretically yes, but practically there is just one baudrate
> > which can be specified in the OBP. I think it's perfectly safe to use
> > max(rxrate,txrate), or min(rxrate,txrate), whatever you prefer.
>
> I'll do this while looking at whether or not the different chip fixes
> the console problems on Sun4u. I'd personally like to avoid introducing
> a device to QEMU that makes assumptions about how the guest may
> configure the chip.
>
> Thanks,
> Jasper Lowell.
>
>
> On Thu, 2020-05-07 at 17:02 +0200, Artyom Tarasenko wrote:
> > On Thu, May 7, 2020 at 4:29 PM <jasper.lowell@bt.com> wrote:
> > > Just thought I'd chime in with an update.
> > >
> > > We are currently emulating a 16550A UART. The guest sees this as
> > > the SU
> > > device, referring to the SuperIO port (a pair of 16550A UARTs). On
> > > the
> > > Ultra 5, the machine that Sun4u is modelled against, SuperIO was
> > > used
> > > for the keyboard and mouse. The Ultra 5 also had a DB25 (ttya
> > > default)
> > > and a DB9 (ttyb default) with a SAB82532 ESSC2.
> > >
> > > Using tracing, I've looked through how the 16550A UART is touched
> > > and
> > > it looks like Solaris 10 has no issues identifying the device. I've
> > > matched register accesses with driver code in OpenSolaris and I'm
> > > pretty sure the device is attached successfully. Also, if you boot
> > > Solaris 10 with debugging output, you can see that the device gets
> > > labelled as su0. The only time Solaris is capable of writing to the
> > > console is when OpenBIOS is used as a proxy.
> > >
> > > Rather than Solaris deciding against using SuperIO as a tty, I
> > > don't
> > > think there was ever any support for doing so (at least on SPARC
> > > machines). This could be an explanation for why the system appears
> > > to
> > > be trucking along just fine despite a seemingly frozen console -
> > > there
> > > is no console. I don't think the frozen console is the fault of
> > > broken
> > > interrupt routing as the 16550A UART is never programmed to
> > > generate
> > > them.
> >
> > At least Fujitsu Siemens PRIMEPOWER250 had a tty attached to the
> > 16550A UART. I think there were more such machines. I don't expect
> > there is anything in the Solaris kernel which would prevent any
> > serial
> > device known to it to be used as a tty.
> >
> > > I've started work on emulating the SAB 82532 ESSC2 but it's
> > > unfortunately way more complex than than the 16550A. For instance,
> > > it's
> > > possible to configure different baudrates for receiving and
> > > transmitting. QEMU's chardev interface doesn't appear to handle
> > > that.
> > > QEMUSerialSetParams has a single speed value that is passed to
> > > cfsetispeed and cfsetospeed. The chip also has support for stick
> > > parity
> > > , which aren't valid options right now either. If I'm wrong on
> > > either
> > > of those points please correct me. Unless there is an alternative,
> > > changes to the interface may need to be made if adding this device
> > > is
> > > to be considered.
> >
> > Well, theoretically yes, but practically there is just one baudrate
> > which can be specified in the OBP. I think it's perfectly safe to use
> > max(rxrate,txrate), or min(rxrate,txrate), whatever you prefer.
> >
> > Regards,
> > Artyom
> > > On Sun, 2020-02-09 at 11:26 +0000, Mark Cave-Ayland wrote:
> > > > On 05/02/2020 06:31, jasper.lowell@bt.com wrote:
> > > >
> > > > > I'm currently working towards emulating Solaris 10 on sun4u.
> > > > >
> > > > >
> > > > >
> > > > > The Solaris 10 ISO image I am attempting to boot is the one
> > > > > from
> > > > > the Oracle
> > > > >
> > > > > download page at
> > > > >
> https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html
> .
> > > > >
> > > > > Image: sol-10-u11-ga-sparc-dvd.iso
> > > > >
> > > > > MD5:   53e8b066f7f250ce2fd2cef063f8072b
> > > > >
> > > > >
> > > > >
> > > > > I am using QEMU commit
> > > > > 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
> > > > >
> > > > >
> > > > >
> > > > > The command I am using to run QEMU is:
> > > > >
> > > > > ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios
> > > > > ./openbios/obj-sparc64/openbios-builtin.elf -cdrom
> > > > > ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m
> > > > > 3G
> > > > >
> > > > >
> > > > >
> > > > > ```
> > > > >
> > > > > CPUs: 1 x SUNW,UltraSPARC-IIi
> > > > >
> > > > > UUID: 00000000-0000-0000-0000-000000000000
> > > > >
> > > > > Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
> > > > >
> > > > >   Type 'help' for detailed information
> > > > >
> > > > > Trying cdrom:f...
> > > > >
> > > > > Not a bootable ELF image
> > > > >
> > > > > Not a bootable a.out image
> > > > >
> > > > >
> > > > >
> > > > > Loading FCode image...
> > > > >
> > > > > Loaded 7420 bytes
> > > > >
> > > > > entry point is 0x4000
> > > > >
> > > > > Evaluating FCode...
> > > > >
> > > > > Evaluating FCode...
> > > > >
> > > > > Ignoring failed claim for va 1000000 memsz af6d6!
> > > > >
> > > > > Ignoring failed claim for va 1402000 memsz 4dcc8!
> > > > >
> > > > > Ignoring failed claim for va 1800000 memsz 510c8!
> > > > >
> > > > > SunOS Release 5.10 Version Generic_147147-26 64-bit
> > > > >
> > > > > Copyright (c) 1983, 2013, Oracle and/or its affiliates. All
> > > > > rights
> > > > > reserved.
> > > > >
> > > > > could not find debugger-vocabulary-hook>threads:interpret:
> > > > > exception -13 caught
> > > > >
> > > > > interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
> > > > >
> > > > > \ All rights reserved.
> > > > >
> > > > > \
> > > > >
> > > > > \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
> > > > >
> > > > >
> > > > >
> > > > > hex
> > > > >
> > > > >
> > > > >
> > > > > only forth also definitions
> > > > >
> > > > > vocabulary kdbg-words
> > > > >
> > > > > also kdbg-words definitions
> > > > >
> > > > >
> > > > >
> > > > > defer p@
> > > > >
> > > > > defer p!
> > > > >
> > > > > ['] x@ is p@
> > > > >
> > > > > ['] x! is p!
> > > > >
> > > > >
> > > > >
> > > > > 8 constant ptrsize
> > > > >
> > > > >
> > > > >
> > > > > d# 32 constant nbitsminor
> > > > >
> > > > > h# ffffffff constant maxmin
> > > > >
> > > > > \
> > > > >
> > > > > \ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
> > > > >
> > > > > \ Use is subject to license terms.
> > > > >
> > > > > \
> > > > >
> > > > >
> > > > >
> > > > > \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
> > > > >
> > > > >
> > > > >
> > > > > h# 7ff constant v9bias
> > > > >
> > > > > h# unix-tte:interpret: exception -13 caught
> > > > >
> > > > > interpret ' unix-tte is va>tte-data failed with error
> > > > > ffffffffffffffed
> > > > >
> > > > > WARNING: consconfig: cannot find driver for screen device
> > > > > /pci@1fe,
> > > > > 0/pci@1,1/QEMU,VGA@2
> > > > >
> > > > > Configuring devices.
> > > > >
> > > > > WARNING: Interrupt not seen after set_features
> > > > >
> > > > > Using RPC Bootparams for network configuration information.
> > > > >
> > > > > Attempting to configure interface hme0...
> > > > >
> > > > > WARNING: Power off requested from power button or SC, powering
> > > > > down
> > > > > the system!
> > > > >
> > > > > Skipped interface hme0
> > > > >
> > > > > svc:/system/filesystem/local:default: WARNING: /usr/sbin/zfs
> > > > > mount
> > > > > -a failed: one or
> > > > > more file systems failed to mount
> > > > >
> > > > > Serial console, reverting to text install
> > > > >
> > > > > Beginning system identification...
> > > > >
> > > > > Searching for configuration file(s)...
> > > > >
> > > > > Search complete.
> > > > >
> > > > > Discovering additional network configuration...
> > > > >
> > > > > ```
> > > > >
> > > > >
> > > > >
> > > > > The installation menu is shown after but the console is
> > > > > unresponsive.
> > > > >
> > > > >
> > > > >
> > > > > After some debugging, it looks like the QEMU front-end is
> > > > > correctly
> > > > > filling
> > > > >
> > > > > the serial receive buffer with characters, and then starts
> > > > > dropping
> > > > > them once
> > > > >
> > > > > the number of characters in the buffer reach the interrupt
> > > > > level.
> > > > > The interrupt
> > > > >
> > > > > level happens to be 1 when booting Solaris 10. This looks like
> > > > > normal behaviour
> > > > >
> > > > > to me.
> > > > >
> > > > >
> > > > >
> > > > > I started looking at why the serial receive buffer might not be
> > > > > consumed and
> > > > >
> > > > > considered that interrupts might not be being raised correctly.
> > > > > I
> > > > > ran with
> > > > >
> > > > > tracing and there were no interrupts for IRQ 0x2b like there
> > > > > are
> > > > > when using
> > > > >
> > > > > OpenBSD. When inspecting the registers of the serial device it
> > > > > looks like the
> > > > >
> > > > > Interrupt Enable Register is set to zero.
> > > > >
> > > > >
> > > > >
> > > > > If Solaris 10 was using the device is polling mode, it should
> > > > > be
> > > > > reading the RBR
> > > > >
> > > > > or at least the LSR. When tracing serial_ioport_read and
> > > > > serial_ioport_write,
> > > > >
> > > > > once the menu is hit, I don't see any read or writes to the
> > > > > serial
> > > > > device
> > > > >
> > > > > registers despite me trying to send characters and use the
> > > > > menu.
> > > > >
> > > > >
> > > > >
> > > > > The driver Solaris 10 is using for the device appears to be
> > > > > similar/same as
> > > > >
> > > > > /usr/src/uts/sun4/io/su_driver.c in the OpenSolaris code found
> > > > > at
> > > > > https://github.com/nxmirrors/onnv.
> > > > >
> > > > >
> > > > >
> > > > > ```
> > > > >
> > > > > asy->asy_hwtype = ASY16550AF;
> > > > >
> > > > > OUTB(FIFOR, 0x00); /* clear fifo register */
> > > > >
> > > > > asy->asy_trig_level = 0x00; /* sets the fifo Threshold to 1 */
> > > > >
> > > > >
> > > > >
> > > > > /* set/Enable FIFO */
> > > > >
> > > > > OUTB(FIFOR, FIFO_ON | FIFODMA | FIFOTXFLSH | FIFORXFLSH |
> > > > >
> > > > > (asy->asy_trig_level & 0xff));
> > > > >
> > > > >
> > > > >
> > > > > if ((INB(ISR) & 0xc0) == 0xc0)
> > > > >
> > > > >     asy->asy_use_fifo = FIFO_ON; /* QEMU REACHES HERE. */
> > > > >
> > > > > else {
> > > > >
> > > > >     asy->asy_hwtype = ASY8250;
> > > > >
> > > > >     OUTB(FIFOR, 0x00); /* NO FIFOs */
> > > > >
> > > > >     asy->asy_trig_level = 0;
> > > > >
> > > > > }
> > > > >
> > > > > ```
> > > > >
> > > > >
> > > > >
> > > > > From what I can tell when tracing serial_ioport_write and
> > > > > serial_ioport_read,
> > > > >
> > > > > Solaris 10 correctly identifies the serial device and
> > > > > successfully
> > > > > attaches it.
> > > > >
> > > > > In the asyattach function (OpenSolaris driver), interrupts are
> > > > > disabled by zeroing the
> > > > >
> > > > > Interrupt Enable Register. From what I'm reading in OpenSolaris
> > > > > source code, interrupts
> > > > >
> > > > > are reenabled when the device is "opened". This seems like
> > > > > consistent and
> > > > >
> > > > > correct behaviour though I'm not sure why the device is not
> > > > > being
> > > > > opened to be
> > > > >
> > > > > used by the serial console.
> > > > >
> > > > >
> > > > >
> > > > > Is this an issue anyone else has tried to debug?
> > > > >
> > > > > Are there any leads that I can follow up on for why the serial
> > > > > console becomes
> > > > > unresponsive
> > > > >
> > > > > on Solaris 10?
> > > >
> > > > It has been a while since I've looked at booting Solaris >= 10
> > > > but
> > > > certainly the
> > > > messages above about set_features and the frozen console suggest
> > > > that
> > > > something is
> > > > going amiss with interrupt routing, although since Linux and
> > > > NetBSD
> > > > were fine the
> > > > last time I ran my OpenBIOS release tests then Solaris must be
> > > > doing
> > > > something
> > > > different here.
> > > >
> > > > Note that the serial interrupts are routed from the ebus into
> > > > sabre
> > > > so the first
> > > > thing to check would be that the end-to-end routing from device
> > > > to
> > > > CPU looks correct
> > > > when using Solaris.
> > > >
> > > >
> > > > ATB,
> > > >
> > > > Mark.
> >
> >
>


-- 
-Peter Tribble
http://www.petertribble.co.uk/ - http://ptribble.blogspot.com/

[-- Attachment #2: Type: text/html, Size: 22769 bytes --]

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-08  8:51         ` Peter Tribble
@ 2020-05-08 13:45           ` Artyom Tarasenko
  2020-05-10  2:46             ` jasper.lowell
  0 siblings, 1 reply; 30+ messages in thread
From: Artyom Tarasenko @ 2020-05-08 13:45 UTC (permalink / raw)
  To: Peter Tribble, jasper.lowell
  Cc: tony.nguyen, Mark Cave-Ayland, QEMU Developers, Dr. David Alan Gilbert

On Fri, May 8, 2020 at 10:51 AM Peter Tribble <peter.tribble@gmail.com> wrote:
>
> I see the same behaviour as reported here when booting current SPARC illumos
> (illumos is the ongoing fork of OpenSolaris) under qemu - looks like it's booted
> up fine, but I can't type anything on the console.

There is one more option which can be relatively easily tested:
you can add two more ports (or replace the existing ttya/ttyb) to the
qemu's ultra5 model: the escc (aka zs) ports.
They definitely work under Solaris (Ultra-1, Ultra-2, E3000,
E3500...), I've seen it.
OpenBIOS already has a driver for them which is used for sun4m (and
some ppc) targets. So no new devices have to be implemented.
If your and Jasper's theory proofs to be correct, we can think of
replacing ttya/ttyb su with zs.
I guess the other sun4u operating systems do support zs as well. (This
has to be tested though)


> While I'm an illumos developer, and maintain it on SPARC, I'm unfamiliar with
> most of the internals. We'll try and have a poke around, though.
>
> (The aim would be to use qemu to allow illumos developers to test changes on SPARC
> without requiring them to have SPARC hardware, hence my interest.)

I think I managed booting Tribblix under the QEMU niagara target. It
has less devices than sun4u, but the console was working.

Regards,
Artyom

> On Fri, May 8, 2020 at 3:40 AM <jasper.lowell@bt.com> wrote:
>>
>> There are two different drivers for the 16550A in OpenSolaris.
>>
>> There is a generic driver in /usr/src/uts/common/io/asy.c. This driver
>> clearly states in comments that it is assigning the device to tty[a-d].
>> It's really obvious to me that there is support in this driver for
>> using the device for a tty.
>>
>> There is another driver at /usr/src/uts/sun4/io/su_driver.c. Judging
>> from the name this is specific for SuperIO. This driver is more than
>> 1000 lines shorter than the other driver and contains a note at the top
>> of the file that it is "modified as sparc keyboard/mouse driver." I
>> don't have much experience with Solaris internals but I can't see any
>> obvious signs that this can be used as a tty. I'd also question why
>> there are two drivers if they have the same purpose/capability. If the
>> su_driver exists to only add support for the keyboard/mouse I'm not
>> sure why it would be shorter rather than longer. It would be helpful if
>> someone with Solaris experience, that knows what they're doing (I do
>> not), can take a look at this driver and give a better opinion.
>>
>> When emulating Sun4u, the su driver is used. If you misconfigure the
>> serial device in QEMU, you can trigger errors that are unique to the
>> driver. Also, Solaris attaches the device as su0.
>>
>> Solaris can access the registers, identify/attach the device, but it
>> just never attempts to use it. Interrupts are explicitly disabled and
>> the device is never polled. I don't think asyopen in su_driver.c is
>> ever called. I've thoroughly stepped through every register access for
>> the 16550A and nothing seems out of the ordinary to me. Something I've
>> considered is that OpenBIOS is not setting properties for the device in
>> a way that Solaris expects but I'm not familiar enough with Sun's
>> OpenBOOT to make progress here. I've read through the PROM functions
>> that Solaris calls when choosing what device to use as a console and
>> nothing seemed inconsistent with what OpenBIOS does. Unfortunately,
>> OpenBIOS seems to crash or hang when using the kernel debugger module,
>> so dynamic analysis using breakpoints isn't an option.
>>
>> I don't have any concrete explanations for the broken console but
>> rather than do nothing I figured I'd see what happens by emulating the
>> SAB 82532.
>>
>> > At least Fujitsu Siemens PRIMEPOWER250 had a tty attached to the
>> > 16550A UART. I think there were more such machines. I don't expect
>> > there is anything in the Solaris kernel which would prevent any
>> > serial
>> > device known to it to be used as a tty.
>>
>> Do you happen to know if this was over SuperIO? If this machine was
>> using the same su_driver for a serial console it would rule out
>> emulating the hardware-faithful SAB 82532 as being a possible
>> improvement. I can't find anything online about someone using SuperIO
>> for a ttya on an Ultra 5 running Solaris.
>>
>> > Well, theoretically yes, but practically there is just one baudrate
>> > which can be specified in the OBP. I think it's perfectly safe to use
>> > max(rxrate,txrate), or min(rxrate,txrate), whatever you prefer.
>>
>> I'll do this while looking at whether or not the different chip fixes
>> the console problems on Sun4u. I'd personally like to avoid introducing
>> a device to QEMU that makes assumptions about how the guest may
>> configure the chip.
>>
>> Thanks,
>> Jasper Lowell.
>>
>>
>> On Thu, 2020-05-07 at 17:02 +0200, Artyom Tarasenko wrote:
>> > On Thu, May 7, 2020 at 4:29 PM <jasper.lowell@bt.com> wrote:
>> > > Just thought I'd chime in with an update.
>> > >
>> > > We are currently emulating a 16550A UART. The guest sees this as
>> > > the SU
>> > > device, referring to the SuperIO port (a pair of 16550A UARTs). On
>> > > the
>> > > Ultra 5, the machine that Sun4u is modelled against, SuperIO was
>> > > used
>> > > for the keyboard and mouse. The Ultra 5 also had a DB25 (ttya
>> > > default)
>> > > and a DB9 (ttyb default) with a SAB82532 ESSC2.
>> > >
>> > > Using tracing, I've looked through how the 16550A UART is touched
>> > > and
>> > > it looks like Solaris 10 has no issues identifying the device. I've
>> > > matched register accesses with driver code in OpenSolaris and I'm
>> > > pretty sure the device is attached successfully. Also, if you boot
>> > > Solaris 10 with debugging output, you can see that the device gets
>> > > labelled as su0. The only time Solaris is capable of writing to the
>> > > console is when OpenBIOS is used as a proxy.
>> > >
>> > > Rather than Solaris deciding against using SuperIO as a tty, I
>> > > don't
>> > > think there was ever any support for doing so (at least on SPARC
>> > > machines). This could be an explanation for why the system appears
>> > > to
>> > > be trucking along just fine despite a seemingly frozen console -
>> > > there
>> > > is no console. I don't think the frozen console is the fault of
>> > > broken
>> > > interrupt routing as the 16550A UART is never programmed to
>> > > generate
>> > > them.
>> >
>> > At least Fujitsu Siemens PRIMEPOWER250 had a tty attached to the
>> > 16550A UART. I think there were more such machines. I don't expect
>> > there is anything in the Solaris kernel which would prevent any
>> > serial
>> > device known to it to be used as a tty.
>> >
>> > > I've started work on emulating the SAB 82532 ESSC2 but it's
>> > > unfortunately way more complex than than the 16550A. For instance,
>> > > it's
>> > > possible to configure different baudrates for receiving and
>> > > transmitting. QEMU's chardev interface doesn't appear to handle
>> > > that.
>> > > QEMUSerialSetParams has a single speed value that is passed to
>> > > cfsetispeed and cfsetospeed. The chip also has support for stick
>> > > parity
>> > > , which aren't valid options right now either. If I'm wrong on
>> > > either
>> > > of those points please correct me. Unless there is an alternative,
>> > > changes to the interface may need to be made if adding this device
>> > > is
>> > > to be considered.
>> >
>> > Well, theoretically yes, but practically there is just one baudrate
>> > which can be specified in the OBP. I think it's perfectly safe to use
>> > max(rxrate,txrate), or min(rxrate,txrate), whatever you prefer.
>> >
>> > Regards,
>> > Artyom
>> > > On Sun, 2020-02-09 at 11:26 +0000, Mark Cave-Ayland wrote:
>> > > > On 05/02/2020 06:31, jasper.lowell@bt.com wrote:
>> > > >
>> > > > > I'm currently working towards emulating Solaris 10 on sun4u.
>> > > > >
>> > > > >
>> > > > >
>> > > > > The Solaris 10 ISO image I am attempting to boot is the one
>> > > > > from
>> > > > > the Oracle
>> > > > >
>> > > > > download page at
>> > > > > https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
>> > > > >
>> > > > > Image: sol-10-u11-ga-sparc-dvd.iso
>> > > > >
>> > > > > MD5:   53e8b066f7f250ce2fd2cef063f8072b
>> > > > >
>> > > > >
>> > > > >
>> > > > > I am using QEMU commit
>> > > > > 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
>> > > > >
>> > > > >
>> > > > >
>> > > > > The command I am using to run QEMU is:
>> > > > >
>> > > > > ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios
>> > > > > ./openbios/obj-sparc64/openbios-builtin.elf -cdrom
>> > > > > ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d -nographic -m
>> > > > > 3G
>> > > > >
>> > > > >
>> > > > >
>> > > > > ```
>> > > > >
>> > > > > CPUs: 1 x SUNW,UltraSPARC-IIi
>> > > > >
>> > > > > UUID: 00000000-0000-0000-0000-000000000000
>> > > > >
>> > > > > Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
>> > > > >
>> > > > >   Type 'help' for detailed information
>> > > > >
>> > > > > Trying cdrom:f...
>> > > > >
>> > > > > Not a bootable ELF image
>> > > > >
>> > > > > Not a bootable a.out image
>> > > > >
>> > > > >
>> > > > >
>> > > > > Loading FCode image...
>> > > > >
>> > > > > Loaded 7420 bytes
>> > > > >
>> > > > > entry point is 0x4000
>> > > > >
>> > > > > Evaluating FCode...
>> > > > >
>> > > > > Evaluating FCode...
>> > > > >
>> > > > > Ignoring failed claim for va 1000000 memsz af6d6!
>> > > > >
>> > > > > Ignoring failed claim for va 1402000 memsz 4dcc8!
>> > > > >
>> > > > > Ignoring failed claim for va 1800000 memsz 510c8!
>> > > > >
>> > > > > SunOS Release 5.10 Version Generic_147147-26 64-bit
>> > > > >
>> > > > > Copyright (c) 1983, 2013, Oracle and/or its affiliates. All
>> > > > > rights
>> > > > > reserved.
>> > > > >
>> > > > > could not find debugger-vocabulary-hook>threads:interpret:
>> > > > > exception -13 caught
>> > > > >
>> > > > > interpret \ Copyright (c) 1995-1999 by Sun Microsystems, Inc.
>> > > > >
>> > > > > \ All rights reserved.
>> > > > >
>> > > > > \
>> > > > >
>> > > > > \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
>> > > > >
>> > > > >
>> > > > >
>> > > > > hex
>> > > > >
>> > > > >
>> > > > >
>> > > > > only forth also definitions
>> > > > >
>> > > > > vocabulary kdbg-words
>> > > > >
>> > > > > also kdbg-words definitions
>> > > > >
>> > > > >
>> > > > >
>> > > > > defer p@
>> > > > >
>> > > > > defer p!
>> > > > >
>> > > > > ['] x@ is p@
>> > > > >
>> > > > > ['] x! is p!
>> > > > >
>> > > > >
>> > > > >
>> > > > > 8 constant ptrsize
>> > > > >
>> > > > >
>> > > > >
>> > > > > d# 32 constant nbitsminor
>> > > > >
>> > > > > h# ffffffff constant maxmin
>> > > > >
>> > > > > \
>> > > > >
>> > > > > \ Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
>> > > > >
>> > > > > \ Use is subject to license terms.
>> > > > >
>> > > > > \
>> > > > >
>> > > > >
>> > > > >
>> > > > > \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
>> > > > >
>> > > > >
>> > > > >
>> > > > > h# 7ff constant v9bias
>> > > > >
>> > > > > h# unix-tte:interpret: exception -13 caught
>> > > > >
>> > > > > interpret ' unix-tte is va>tte-data failed with error
>> > > > > ffffffffffffffed
>> > > > >
>> > > > > WARNING: consconfig: cannot find driver for screen device
>> > > > > /pci@1fe,
>> > > > > 0/pci@1,1/QEMU,VGA@2
>> > > > >
>> > > > > Configuring devices.
>> > > > >
>> > > > > WARNING: Interrupt not seen after set_features
>> > > > >
>> > > > > Using RPC Bootparams for network configuration information.
>> > > > >
>> > > > > Attempting to configure interface hme0...
>> > > > >
>> > > > > WARNING: Power off requested from power button or SC, powering
>> > > > > down
>> > > > > the system!
>> > > > >
>> > > > > Skipped interface hme0
>> > > > >
>> > > > > svc:/system/filesystem/local:default: WARNING: /usr/sbin/zfs
>> > > > > mount
>> > > > > -a failed: one or
>> > > > > more file systems failed to mount
>> > > > >
>> > > > > Serial console, reverting to text install
>> > > > >
>> > > > > Beginning system identification...
>> > > > >
>> > > > > Searching for configuration file(s)...
>> > > > >
>> > > > > Search complete.
>> > > > >
>> > > > > Discovering additional network configuration...
>> > > > >
>> > > > > ```
>> > > > >
>> > > > >
>> > > > >
>> > > > > The installation menu is shown after but the console is
>> > > > > unresponsive.
>> > > > >
>> > > > >
>> > > > >
>> > > > > After some debugging, it looks like the QEMU front-end is
>> > > > > correctly
>> > > > > filling
>> > > > >
>> > > > > the serial receive buffer with characters, and then starts
>> > > > > dropping
>> > > > > them once
>> > > > >
>> > > > > the number of characters in the buffer reach the interrupt
>> > > > > level.
>> > > > > The interrupt
>> > > > >
>> > > > > level happens to be 1 when booting Solaris 10. This looks like
>> > > > > normal behaviour
>> > > > >
>> > > > > to me.
>> > > > >
>> > > > >
>> > > > >
>> > > > > I started looking at why the serial receive buffer might not be
>> > > > > consumed and
>> > > > >
>> > > > > considered that interrupts might not be being raised correctly.
>> > > > > I
>> > > > > ran with
>> > > > >
>> > > > > tracing and there were no interrupts for IRQ 0x2b like there
>> > > > > are
>> > > > > when using
>> > > > >
>> > > > > OpenBSD. When inspecting the registers of the serial device it
>> > > > > looks like the
>> > > > >
>> > > > > Interrupt Enable Register is set to zero.
>> > > > >
>> > > > >
>> > > > >
>> > > > > If Solaris 10 was using the device is polling mode, it should
>> > > > > be
>> > > > > reading the RBR
>> > > > >
>> > > > > or at least the LSR. When tracing serial_ioport_read and
>> > > > > serial_ioport_write,
>> > > > >
>> > > > > once the menu is hit, I don't see any read or writes to the
>> > > > > serial
>> > > > > device
>> > > > >
>> > > > > registers despite me trying to send characters and use the
>> > > > > menu.
>> > > > >
>> > > > >
>> > > > >
>> > > > > The driver Solaris 10 is using for the device appears to be
>> > > > > similar/same as
>> > > > >
>> > > > > /usr/src/uts/sun4/io/su_driver.c in the OpenSolaris code found
>> > > > > at
>> > > > > https://github.com/nxmirrors/onnv.
>> > > > >
>> > > > >
>> > > > >
>> > > > > ```
>> > > > >
>> > > > > asy->asy_hwtype = ASY16550AF;
>> > > > >
>> > > > > OUTB(FIFOR, 0x00); /* clear fifo register */
>> > > > >
>> > > > > asy->asy_trig_level = 0x00; /* sets the fifo Threshold to 1 */
>> > > > >
>> > > > >
>> > > > >
>> > > > > /* set/Enable FIFO */
>> > > > >
>> > > > > OUTB(FIFOR, FIFO_ON | FIFODMA | FIFOTXFLSH | FIFORXFLSH |
>> > > > >
>> > > > > (asy->asy_trig_level & 0xff));
>> > > > >
>> > > > >
>> > > > >
>> > > > > if ((INB(ISR) & 0xc0) == 0xc0)
>> > > > >
>> > > > >     asy->asy_use_fifo = FIFO_ON; /* QEMU REACHES HERE. */
>> > > > >
>> > > > > else {
>> > > > >
>> > > > >     asy->asy_hwtype = ASY8250;
>> > > > >
>> > > > >     OUTB(FIFOR, 0x00); /* NO FIFOs */
>> > > > >
>> > > > >     asy->asy_trig_level = 0;
>> > > > >
>> > > > > }
>> > > > >
>> > > > > ```
>> > > > >
>> > > > >
>> > > > >
>> > > > > From what I can tell when tracing serial_ioport_write and
>> > > > > serial_ioport_read,
>> > > > >
>> > > > > Solaris 10 correctly identifies the serial device and
>> > > > > successfully
>> > > > > attaches it.
>> > > > >
>> > > > > In the asyattach function (OpenSolaris driver), interrupts are
>> > > > > disabled by zeroing the
>> > > > >
>> > > > > Interrupt Enable Register. From what I'm reading in OpenSolaris
>> > > > > source code, interrupts
>> > > > >
>> > > > > are reenabled when the device is "opened". This seems like
>> > > > > consistent and
>> > > > >
>> > > > > correct behaviour though I'm not sure why the device is not
>> > > > > being
>> > > > > opened to be
>> > > > >
>> > > > > used by the serial console.
>> > > > >
>> > > > >
>> > > > >
>> > > > > Is this an issue anyone else has tried to debug?
>> > > > >
>> > > > > Are there any leads that I can follow up on for why the serial
>> > > > > console becomes
>> > > > > unresponsive
>> > > > >
>> > > > > on Solaris 10?
>> > > >
>> > > > It has been a while since I've looked at booting Solaris >= 10
>> > > > but
>> > > > certainly the
>> > > > messages above about set_features and the frozen console suggest
>> > > > that
>> > > > something is
>> > > > going amiss with interrupt routing, although since Linux and
>> > > > NetBSD
>> > > > were fine the
>> > > > last time I ran my OpenBIOS release tests then Solaris must be
>> > > > doing
>> > > > something
>> > > > different here.
>> > > >
>> > > > Note that the serial interrupts are routed from the ebus into
>> > > > sabre
>> > > > so the first
>> > > > thing to check would be that the end-to-end routing from device
>> > > > to
>> > > > CPU looks correct
>> > > > when using Solaris.
>> > > >
>> > > >
>> > > > ATB,
>> > > >
>> > > > Mark.
>> >
>> >
>
>
>
> --
> -Peter Tribble
> http://www.petertribble.co.uk/ - http://ptribble.blogspot.com/



-- 
Regards,
Artyom Tarasenko

SPARC and PPC PReP under qemu blog: http://tyom.blogspot.com/search/label/qemu


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-08 13:45           ` Artyom Tarasenko
@ 2020-05-10  2:46             ` jasper.lowell
  2020-05-10  9:22               ` Mark Cave-Ayland
  0 siblings, 1 reply; 30+ messages in thread
From: jasper.lowell @ 2020-05-10  2:46 UTC (permalink / raw)
  To: peter.tribble, atar4qemu
  Cc: tony.nguyen, mark.cave-ayland, dgilbert, qemu-devel

Good idea.

The ESCC device looks like it's written as a sysbus device. I think the
Ultra 5 has no devices on the root sabre bus. The serial controller is
behind the ebus (essentially isa). I'm guessing I would need to write a
wrapper device around the memory io functions so that it can be used
under the ebus - judging from the serial-isa implementation.

I think it might be possible to leave the ESCC as a sysbus device but
I'm not familiar enough with OpenBIOS to expose the right information
to Solaris and reason about what's happening confidentally. I don't
expect writing a wrapper for isa to be difficult so I'll give that a
go. Do you think it would be fine to just choose an arbitrary ioport
address for the device?

Thanks,
Jasper Lowell.


On Fri, 2020-05-08 at 15:45 +0200, Artyom Tarasenko wrote:
> On Fri, May 8, 2020 at 10:51 AM Peter Tribble <
> peter.tribble@gmail.com> wrote:
> > I see the same behaviour as reported here when booting current
> > SPARC illumos
> > (illumos is the ongoing fork of OpenSolaris) under qemu - looks
> > like it's booted
> > up fine, but I can't type anything on the console.
> 
> There is one more option which can be relatively easily tested:
> you can add two more ports (or replace the existing ttya/ttyb) to the
> qemu's ultra5 model: the escc (aka zs) ports.
> They definitely work under Solaris (Ultra-1, Ultra-2, E3000,
> E3500...), I've seen it.
> OpenBIOS already has a driver for them which is used for sun4m (and
> some ppc) targets. So no new devices have to be implemented.
> If your and Jasper's theory proofs to be correct, we can think of
> replacing ttya/ttyb su with zs.
> I guess the other sun4u operating systems do support zs as well.
> (This
> has to be tested though)
> 
> 
> > While I'm an illumos developer, and maintain it on SPARC, I'm
> > unfamiliar with
> > most of the internals. We'll try and have a poke around, though.
> > 
> > (The aim would be to use qemu to allow illumos developers to test
> > changes on SPARC
> > without requiring them to have SPARC hardware, hence my interest.)
> 
> I think I managed booting Tribblix under the QEMU niagara target. It
> has less devices than sun4u, but the console was working.
> 
> Regards,
> Artyom
> 
> > On Fri, May 8, 2020 at 3:40 AM <jasper.lowell@bt.com> wrote:
> > > There are two different drivers for the 16550A in OpenSolaris.
> > > 
> > > There is a generic driver in /usr/src/uts/common/io/asy.c. This
> > > driver
> > > clearly states in comments that it is assigning the device to
> > > tty[a-d].
> > > It's really obvious to me that there is support in this driver
> > > for
> > > using the device for a tty.
> > > 
> > > There is another driver at /usr/src/uts/sun4/io/su_driver.c.
> > > Judging
> > > from the name this is specific for SuperIO. This driver is more
> > > than
> > > 1000 lines shorter than the other driver and contains a note at
> > > the top
> > > of the file that it is "modified as sparc keyboard/mouse driver."
> > > I
> > > don't have much experience with Solaris internals but I can't see
> > > any
> > > obvious signs that this can be used as a tty. I'd also question
> > > why
> > > there are two drivers if they have the same purpose/capability.
> > > If the
> > > su_driver exists to only add support for the keyboard/mouse I'm
> > > not
> > > sure why it would be shorter rather than longer. It would be
> > > helpful if
> > > someone with Solaris experience, that knows what they're doing (I
> > > do
> > > not), can take a look at this driver and give a better opinion.
> > > 
> > > When emulating Sun4u, the su driver is used. If you misconfigure
> > > the
> > > serial device in QEMU, you can trigger errors that are unique to
> > > the
> > > driver. Also, Solaris attaches the device as su0.
> > > 
> > > Solaris can access the registers, identify/attach the device, but
> > > it
> > > just never attempts to use it. Interrupts are explicitly disabled
> > > and
> > > the device is never polled. I don't think asyopen in su_driver.c
> > > is
> > > ever called. I've thoroughly stepped through every register
> > > access for
> > > the 16550A and nothing seems out of the ordinary to me. Something
> > > I've
> > > considered is that OpenBIOS is not setting properties for the
> > > device in
> > > a way that Solaris expects but I'm not familiar enough with Sun's
> > > OpenBOOT to make progress here. I've read through the PROM
> > > functions
> > > that Solaris calls when choosing what device to use as a console
> > > and
> > > nothing seemed inconsistent with what OpenBIOS does.
> > > Unfortunately,
> > > OpenBIOS seems to crash or hang when using the kernel debugger
> > > module,
> > > so dynamic analysis using breakpoints isn't an option.
> > > 
> > > I don't have any concrete explanations for the broken console but
> > > rather than do nothing I figured I'd see what happens by
> > > emulating the
> > > SAB 82532.
> > > 
> > > > At least Fujitsu Siemens PRIMEPOWER250 had a tty attached to
> > > > the
> > > > 16550A UART. I think there were more such machines. I don't
> > > > expect
> > > > there is anything in the Solaris kernel which would prevent any
> > > > serial
> > > > device known to it to be used as a tty.
> > > 
> > > Do you happen to know if this was over SuperIO? If this machine
> > > was
> > > using the same su_driver for a serial console it would rule out
> > > emulating the hardware-faithful SAB 82532 as being a possible
> > > improvement. I can't find anything online about someone using
> > > SuperIO
> > > for a ttya on an Ultra 5 running Solaris.
> > > 
> > > > Well, theoretically yes, but practically there is just one
> > > > baudrate
> > > > which can be specified in the OBP. I think it's perfectly safe
> > > > to use
> > > > max(rxrate,txrate), or min(rxrate,txrate), whatever you prefer.
> > > 
> > > I'll do this while looking at whether or not the different chip
> > > fixes
> > > the console problems on Sun4u. I'd personally like to avoid
> > > introducing
> > > a device to QEMU that makes assumptions about how the guest may
> > > configure the chip.
> > > 
> > > Thanks,
> > > Jasper Lowell.
> > > 
> > > 
> > > On Thu, 2020-05-07 at 17:02 +0200, Artyom Tarasenko wrote:
> > > > On Thu, May 7, 2020 at 4:29 PM <jasper.lowell@bt.com> wrote:
> > > > > Just thought I'd chime in with an update.
> > > > > 
> > > > > We are currently emulating a 16550A UART. The guest sees this
> > > > > as
> > > > > the SU
> > > > > device, referring to the SuperIO port (a pair of 16550A
> > > > > UARTs). On
> > > > > the
> > > > > Ultra 5, the machine that Sun4u is modelled against, SuperIO
> > > > > was
> > > > > used
> > > > > for the keyboard and mouse. The Ultra 5 also had a DB25 (ttya
> > > > > default)
> > > > > and a DB9 (ttyb default) with a SAB82532 ESSC2.
> > > > > 
> > > > > Using tracing, I've looked through how the 16550A UART is
> > > > > touched
> > > > > and
> > > > > it looks like Solaris 10 has no issues identifying the
> > > > > device. I've
> > > > > matched register accesses with driver code in OpenSolaris and
> > > > > I'm
> > > > > pretty sure the device is attached successfully. Also, if you
> > > > > boot
> > > > > Solaris 10 with debugging output, you can see that the device
> > > > > gets
> > > > > labelled as su0. The only time Solaris is capable of writing
> > > > > to the
> > > > > console is when OpenBIOS is used as a proxy.
> > > > > 
> > > > > Rather than Solaris deciding against using SuperIO as a tty,
> > > > > I
> > > > > don't
> > > > > think there was ever any support for doing so (at least on
> > > > > SPARC
> > > > > machines). This could be an explanation for why the system
> > > > > appears
> > > > > to
> > > > > be trucking along just fine despite a seemingly frozen
> > > > > console -
> > > > > there
> > > > > is no console. I don't think the frozen console is the fault
> > > > > of
> > > > > broken
> > > > > interrupt routing as the 16550A UART is never programmed to
> > > > > generate
> > > > > them.
> > > > 
> > > > At least Fujitsu Siemens PRIMEPOWER250 had a tty attached to
> > > > the
> > > > 16550A UART. I think there were more such machines. I don't
> > > > expect
> > > > there is anything in the Solaris kernel which would prevent any
> > > > serial
> > > > device known to it to be used as a tty.
> > > > 
> > > > > I've started work on emulating the SAB 82532 ESSC2 but it's
> > > > > unfortunately way more complex than than the 16550A. For
> > > > > instance,
> > > > > it's
> > > > > possible to configure different baudrates for receiving and
> > > > > transmitting. QEMU's chardev interface doesn't appear to
> > > > > handle
> > > > > that.
> > > > > QEMUSerialSetParams has a single speed value that is passed
> > > > > to
> > > > > cfsetispeed and cfsetospeed. The chip also has support for
> > > > > stick
> > > > > parity
> > > > > , which aren't valid options right now either. If I'm wrong
> > > > > on
> > > > > either
> > > > > of those points please correct me. Unless there is an
> > > > > alternative,
> > > > > changes to the interface may need to be made if adding this
> > > > > device
> > > > > is
> > > > > to be considered.
> > > > 
> > > > Well, theoretically yes, but practically there is just one
> > > > baudrate
> > > > which can be specified in the OBP. I think it's perfectly safe
> > > > to use
> > > > max(rxrate,txrate), or min(rxrate,txrate), whatever you prefer.
> > > > 
> > > > Regards,
> > > > Artyom
> > > > > On Sun, 2020-02-09 at 11:26 +0000, Mark Cave-Ayland wrote:
> > > > > > On 05/02/2020 06:31, jasper.lowell@bt.com wrote:
> > > > > > 
> > > > > > > I'm currently working towards emulating Solaris 10 on
> > > > > > > sun4u.
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > The Solaris 10 ISO image I am attempting to boot is the
> > > > > > > one
> > > > > > > from
> > > > > > > the Oracle
> > > > > > > 
> > > > > > > download page at
> > > > > > > https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html.
> > > > > > > 
> > > > > > > Image: sol-10-u11-ga-sparc-dvd.iso
> > > > > > > 
> > > > > > > MD5:   53e8b066f7f250ce2fd2cef063f8072b
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > I am using QEMU commit
> > > > > > > 7bd9d0a9e26c7a3c67c0f174f0009ba19969b158.
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > The command I am using to run QEMU is:
> > > > > > > 
> > > > > > > ./qemu/sparc64-softmmu/qemu-system-sparc64 -bios
> > > > > > > ./openbios/obj-sparc64/openbios-builtin.elf -cdrom
> > > > > > > ./iso/solaris/sol-10-u11-ga-sparc-dvd.iso -boot d
> > > > > > > -nographic -m
> > > > > > > 3G
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > ```
> > > > > > > 
> > > > > > > CPUs: 1 x SUNW,UltraSPARC-IIi
> > > > > > > 
> > > > > > > UUID: 00000000-0000-0000-0000-000000000000
> > > > > > > 
> > > > > > > Welcome to OpenBIOS v1.1 built on Feb 5 2020 19:15
> > > > > > > 
> > > > > > >   Type 'help' for detailed information
> > > > > > > 
> > > > > > > Trying cdrom:f...
> > > > > > > 
> > > > > > > Not a bootable ELF image
> > > > > > > 
> > > > > > > Not a bootable a.out image
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > Loading FCode image...
> > > > > > > 
> > > > > > > Loaded 7420 bytes
> > > > > > > 
> > > > > > > entry point is 0x4000
> > > > > > > 
> > > > > > > Evaluating FCode...
> > > > > > > 
> > > > > > > Evaluating FCode...
> > > > > > > 
> > > > > > > Ignoring failed claim for va 1000000 memsz af6d6!
> > > > > > > 
> > > > > > > Ignoring failed claim for va 1402000 memsz 4dcc8!
> > > > > > > 
> > > > > > > Ignoring failed claim for va 1800000 memsz 510c8!
> > > > > > > 
> > > > > > > SunOS Release 5.10 Version Generic_147147-26 64-bit
> > > > > > > 
> > > > > > > Copyright (c) 1983, 2013, Oracle and/or its affiliates.
> > > > > > > All
> > > > > > > rights
> > > > > > > reserved.
> > > > > > > 
> > > > > > > could not find debugger-vocabulary-
> > > > > > > hook>threads:interpret:
> > > > > > > exception -13 caught
> > > > > > > 
> > > > > > > interpret \ Copyright (c) 1995-1999 by Sun Microsystems,
> > > > > > > Inc.
> > > > > > > 
> > > > > > > \ All rights reserved.
> > > > > > > 
> > > > > > > \
> > > > > > > 
> > > > > > > \ ident "@(#)data64.fth  1.3     00/07/17 SMI"
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > hex
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > only forth also definitions
> > > > > > > 
> > > > > > > vocabulary kdbg-words
> > > > > > > 
> > > > > > > also kdbg-words definitions
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > defer p@
> > > > > > > 
> > > > > > > defer p!
> > > > > > > 
> > > > > > > ['] x@ is p@
> > > > > > > 
> > > > > > > ['] x! is p!
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 8 constant ptrsize
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > d# 32 constant nbitsminor
> > > > > > > 
> > > > > > > h# ffffffff constant maxmin
> > > > > > > 
> > > > > > > \
> > > > > > > 
> > > > > > > \ Copyright 2008 Sun Microsystems, Inc.  All rights
> > > > > > > reserved.
> > > > > > > 
> > > > > > > \ Use is subject to license terms.
> > > > > > > 
> > > > > > > \
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > \ #pragma ident  "@(#)kdbg.fth    1.20    08/06/06 SMI"
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > h# 7ff constant v9bias
> > > > > > > 
> > > > > > > h# unix-tte:interpret: exception -13 caught
> > > > > > > 
> > > > > > > interpret ' unix-tte is va>tte-data failed with error
> > > > > > > ffffffffffffffed
> > > > > > > 
> > > > > > > WARNING: consconfig: cannot find driver for screen device
> > > > > > > /pci@1fe,
> > > > > > > 0/pci@1,1/QEMU,VGA@2
> > > > > > > 
> > > > > > > Configuring devices.
> > > > > > > 
> > > > > > > WARNING: Interrupt not seen after set_features
> > > > > > > 
> > > > > > > Using RPC Bootparams for network configuration
> > > > > > > information.
> > > > > > > 
> > > > > > > Attempting to configure interface hme0...
> > > > > > > 
> > > > > > > WARNING: Power off requested from power button or SC,
> > > > > > > powering
> > > > > > > down
> > > > > > > the system!
> > > > > > > 
> > > > > > > Skipped interface hme0
> > > > > > > 
> > > > > > > svc:/system/filesystem/local:default: WARNING:
> > > > > > > /usr/sbin/zfs
> > > > > > > mount
> > > > > > > -a failed: one or
> > > > > > > more file systems failed to mount
> > > > > > > 
> > > > > > > Serial console, reverting to text install
> > > > > > > 
> > > > > > > Beginning system identification...
> > > > > > > 
> > > > > > > Searching for configuration file(s)...
> > > > > > > 
> > > > > > > Search complete.
> > > > > > > 
> > > > > > > Discovering additional network configuration...
> > > > > > > 
> > > > > > > ```
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > The installation menu is shown after but the console is
> > > > > > > unresponsive.
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > After some debugging, it looks like the QEMU front-end is
> > > > > > > correctly
> > > > > > > filling
> > > > > > > 
> > > > > > > the serial receive buffer with characters, and then
> > > > > > > starts
> > > > > > > dropping
> > > > > > > them once
> > > > > > > 
> > > > > > > the number of characters in the buffer reach the
> > > > > > > interrupt
> > > > > > > level.
> > > > > > > The interrupt
> > > > > > > 
> > > > > > > level happens to be 1 when booting Solaris 10. This looks
> > > > > > > like
> > > > > > > normal behaviour
> > > > > > > 
> > > > > > > to me.
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > I started looking at why the serial receive buffer might
> > > > > > > not be
> > > > > > > consumed and
> > > > > > > 
> > > > > > > considered that interrupts might not be being raised
> > > > > > > correctly.
> > > > > > > I
> > > > > > > ran with
> > > > > > > 
> > > > > > > tracing and there were no interrupts for IRQ 0x2b like
> > > > > > > there
> > > > > > > are
> > > > > > > when using
> > > > > > > 
> > > > > > > OpenBSD. When inspecting the registers of the serial
> > > > > > > device it
> > > > > > > looks like the
> > > > > > > 
> > > > > > > Interrupt Enable Register is set to zero.
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > If Solaris 10 was using the device is polling mode, it
> > > > > > > should
> > > > > > > be
> > > > > > > reading the RBR
> > > > > > > 
> > > > > > > or at least the LSR. When tracing serial_ioport_read and
> > > > > > > serial_ioport_write,
> > > > > > > 
> > > > > > > once the menu is hit, I don't see any read or writes to
> > > > > > > the
> > > > > > > serial
> > > > > > > device
> > > > > > > 
> > > > > > > registers despite me trying to send characters and use
> > > > > > > the
> > > > > > > menu.
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > The driver Solaris 10 is using for the device appears to
> > > > > > > be
> > > > > > > similar/same as
> > > > > > > 
> > > > > > > /usr/src/uts/sun4/io/su_driver.c in the OpenSolaris code
> > > > > > > found
> > > > > > > at
> > > > > > > https://github.com/nxmirrors/onnv.
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > ```
> > > > > > > 
> > > > > > > asy->asy_hwtype = ASY16550AF;
> > > > > > > 
> > > > > > > OUTB(FIFOR, 0x00); /* clear fifo register */
> > > > > > > 
> > > > > > > asy->asy_trig_level = 0x00; /* sets the fifo Threshold to
> > > > > > > 1 */
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > /* set/Enable FIFO */
> > > > > > > 
> > > > > > > OUTB(FIFOR, FIFO_ON | FIFODMA | FIFOTXFLSH | FIFORXFLSH |
> > > > > > > 
> > > > > > > (asy->asy_trig_level & 0xff));
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > if ((INB(ISR) & 0xc0) == 0xc0)
> > > > > > > 
> > > > > > >     asy->asy_use_fifo = FIFO_ON; /* QEMU REACHES HERE. */
> > > > > > > 
> > > > > > > else {
> > > > > > > 
> > > > > > >     asy->asy_hwtype = ASY8250;
> > > > > > > 
> > > > > > >     OUTB(FIFOR, 0x00); /* NO FIFOs */
> > > > > > > 
> > > > > > >     asy->asy_trig_level = 0;
> > > > > > > 
> > > > > > > }
> > > > > > > 
> > > > > > > ```
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > From what I can tell when tracing serial_ioport_write and
> > > > > > > serial_ioport_read,
> > > > > > > 
> > > > > > > Solaris 10 correctly identifies the serial device and
> > > > > > > successfully
> > > > > > > attaches it.
> > > > > > > 
> > > > > > > In the asyattach function (OpenSolaris driver),
> > > > > > > interrupts are
> > > > > > > disabled by zeroing the
> > > > > > > 
> > > > > > > Interrupt Enable Register. From what I'm reading in
> > > > > > > OpenSolaris
> > > > > > > source code, interrupts
> > > > > > > 
> > > > > > > are reenabled when the device is "opened". This seems
> > > > > > > like
> > > > > > > consistent and
> > > > > > > 
> > > > > > > correct behaviour though I'm not sure why the device is
> > > > > > > not
> > > > > > > being
> > > > > > > opened to be
> > > > > > > 
> > > > > > > used by the serial console.
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > Is this an issue anyone else has tried to debug?
> > > > > > > 
> > > > > > > Are there any leads that I can follow up on for why the
> > > > > > > serial
> > > > > > > console becomes
> > > > > > > unresponsive
> > > > > > > 
> > > > > > > on Solaris 10?
> > > > > > 
> > > > > > It has been a while since I've looked at booting Solaris >=
> > > > > > 10
> > > > > > but
> > > > > > certainly the
> > > > > > messages above about set_features and the frozen console
> > > > > > suggest
> > > > > > that
> > > > > > something is
> > > > > > going amiss with interrupt routing, although since Linux
> > > > > > and
> > > > > > NetBSD
> > > > > > were fine the
> > > > > > last time I ran my OpenBIOS release tests then Solaris must
> > > > > > be
> > > > > > doing
> > > > > > something
> > > > > > different here.
> > > > > > 
> > > > > > Note that the serial interrupts are routed from the ebus
> > > > > > into
> > > > > > sabre
> > > > > > so the first
> > > > > > thing to check would be that the end-to-end routing from
> > > > > > device
> > > > > > to
> > > > > > CPU looks correct
> > > > > > when using Solaris.
> > > > > > 
> > > > > > 
> > > > > > ATB,
> > > > > > 
> > > > > > Mark.
> > 
> > 
> > --
> > -Peter Tribble
> > http://www.petertribble.co.uk/ - http://ptribble.blogspot.com/
> 
> 

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-10  2:46             ` jasper.lowell
@ 2020-05-10  9:22               ` Mark Cave-Ayland
  2020-05-17  7:57                 ` jasper.lowell
  0 siblings, 1 reply; 30+ messages in thread
From: Mark Cave-Ayland @ 2020-05-10  9:22 UTC (permalink / raw)
  To: jasper.lowell, peter.tribble, atar4qemu; +Cc: tony.nguyen, dgilbert, qemu-devel

On 10/05/2020 03:46, jasper.lowell@bt.com wrote:

> Good idea.
> 
> The ESCC device looks like it's written as a sysbus device. I think the
> Ultra 5 has no devices on the root sabre bus. The serial controller is
> behind the ebus (essentially isa). I'm guessing I would need to write a
> wrapper device around the memory io functions so that it can be used
> under the ebus - judging from the serial-isa implementation.
> 
> I think it might be possible to leave the ESCC as a sysbus device but
> I'm not familiar enough with OpenBIOS to expose the right information
> to Solaris and reason about what's happening confidentally. I don't
> expect writing a wrapper for isa to be difficult so I'll give that a
> go. Do you think it would be fine to just choose an arbitrary ioport
> address for the device?
> 
> Thanks,
> Jasper Lowell.

I'm not overly keen on this approach, because it's just swapping out one incorrect
device for another. The existing sun4u machine is fairly close to an ultra5 and I'd
prefer to move towards emulating the real machine rather than keep swapping out
random bits of hardware.

The main reason I added the sunhme emulation to QEMU was because I found that across
all my test images different OSs had different bugs in their NIC drivers/IRQ
handling, and this was the only solution that would work for all of them. My fear
with going the ESCC route is that you'll end up in exactly the same situation.


ATB,

Mark.


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-10  9:22               ` Mark Cave-Ayland
@ 2020-05-17  7:57                 ` jasper.lowell
  2020-05-17 12:37                   ` Artyom Tarasenko
  0 siblings, 1 reply; 30+ messages in thread
From: jasper.lowell @ 2020-05-17  7:57 UTC (permalink / raw)
  To: peter.tribble, mark.cave-ayland, atar4qemu
  Cc: tony.nguyen, dgilbert, qemu-devel

I've written up a basic implementation of the SAB 82532 ESCC2 device
and have written a patch for OpenBIOS to add it to the device tree. I
still have the 16550A UART acting as ttya to avoid having to write an
OpenBIOS device driver.

OpenBSD and Solaris both identify the device correctly and attach it.

Interestingly, it looks like Solaris entered an interrupt handler to
deal with an event for the SAB 82532 and it probed a few status
registers. Given that I couldn't encourage Solaris to do anything
outside of attach the device for the 16550A, I was thinking this might
be a good sign.

There really shouldn't be an interrupt though as the reset state of the
SAB 82532 is to have all interrupts masked. Solaris probes these
interrupt status registers while "configuring" the sunhme device.

Attempting to configure interface hme0...
140070@1589698603.268942:escc2_mem_read channel a addr 0x38 value 0x4
140070@1589698603.269011:escc2_irq_update value 0x0
140070@1589698603.269015:escc2_mem_read channel a addr 0x3a value 0x80
140070@1589698603.269017:escc2_irq_update value 0x0
140070@1589698603.269018:escc2_mem_read channel a addr 0x3b value 0x0
140070@1589698603.269076:escc2_mem_read channel a addr 0x38 value 0x0
WARNING: Power off requested from power button or SC, powering down the
system!
140070@1589698611.270845:escc2_mem_read channel a addr 0x38 value 0x0
140070@1589698619.271758:escc2_mem_read channel a addr 0x38 value 0x0

I've noticed that removing the sunhme code for sun4u.c in QEMU prevents
the spurious interrupt from happening for the serial device along with
prevent the unexpected power off request (the power off request was not
introduced by my code). I haven't investigated why the presence of
sunhme causes these events.

I modified OpenBIOS to use ttyb for stdin/stdout and assigned that to
the 16550A so that ttya could be aliased to the SAB 82532. Outside of
the spurious interrupt handler being called, I'm getting the same
behaviour where Solaris identifies, attaches, and then ignores the
device. Doesn't look like my guess was on the mark.

I'll be looking at getting an OpenSolaris-like kernel built with prom
debugging output for console/tty related files like
usr/src/uts/common/io/consconfig_dacf.c. The illumos kernel is probably
suitable for this because it's still maintained and appears to be
suffering from the same console problems. I don't have a SPARC64
machine immediately available and I'm unfamiliar with the build system
behind these distributions, so it might be a while before this happens.

I'm out of ideas.


Thanks,
Jasper Lowell.


On Sun, 2020-05-10 at 10:22 +0100, Mark Cave-Ayland wrote:
> On 10/05/2020 03:46, jasper.lowell@bt.com wrote:
> 
> > Good idea.
> > 
> > The ESCC device looks like it's written as a sysbus device. I think
> > the
> > Ultra 5 has no devices on the root sabre bus. The serial controller
> > is
> > behind the ebus (essentially isa). I'm guessing I would need to
> > write a
> > wrapper device around the memory io functions so that it can be
> > used
> > under the ebus - judging from the serial-isa implementation.
> > 
> > I think it might be possible to leave the ESCC as a sysbus device
> > but
> > I'm not familiar enough with OpenBIOS to expose the right
> > information
> > to Solaris and reason about what's happening confidentally. I don't
> > expect writing a wrapper for isa to be difficult so I'll give that
> > a
> > go. Do you think it would be fine to just choose an arbitrary
> > ioport
> > address for the device?
> > 
> > Thanks,
> > Jasper Lowell.
> 
> I'm not overly keen on this approach, because it's just swapping out
> one incorrect
> device for another. The existing sun4u machine is fairly close to an
> ultra5 and I'd
> prefer to move towards emulating the real machine rather than keep
> swapping out
> random bits of hardware.
> 
> The main reason I added the sunhme emulation to QEMU was because I
> found that across
> all my test images different OSs had different bugs in their NIC
> drivers/IRQ
> handling, and this was the only solution that would work for all of
> them. My fear
> with going the ESCC route is that you'll end up in exactly the same
> situation.
> 
> 
> ATB,
> 
> Mark.

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-17  7:57                 ` jasper.lowell
@ 2020-05-17 12:37                   ` Artyom Tarasenko
  2020-05-18  2:56                     ` jasper.lowell
  0 siblings, 1 reply; 30+ messages in thread
From: Artyom Tarasenko @ 2020-05-17 12:37 UTC (permalink / raw)
  To: jasper.lowell
  Cc: tony.nguyen, Peter Tribble, Mark Cave-Ayland,
	Dr. David Alan Gilbert, qemu-devel

On Sun, May 17, 2020 at 9:57 AM <jasper.lowell@bt.com> wrote:
>
> I've written up a basic implementation of the SAB 82532 ESCC2 device
> and have written a patch for OpenBIOS to add it to the device tree. I
> still have the 16550A UART acting as ttya to avoid having to write an
> OpenBIOS device driver.

Great progress! Are you planning to contribute your escc2 to the upstream?

> OpenBSD and Solaris both identify the device correctly and attach it.
>
> Interestingly, it looks like Solaris entered an interrupt handler to
> deal with an event for the SAB 82532 and it probed a few status
> registers. Given that I couldn't encourage Solaris to do anything
> outside of attach the device for the 16550A, I was thinking this might
> be a good sign.
>
> There really shouldn't be an interrupt though as the reset state of the
> SAB 82532 is to have all interrupts masked. Solaris probes these
> interrupt status registers while "configuring" the sunhme device.
>
> Attempting to configure interface hme0...
> 140070@1589698603.268942:escc2_mem_read channel a addr 0x38 value 0x4
> 140070@1589698603.269011:escc2_irq_update value 0x0
> 140070@1589698603.269015:escc2_mem_read channel a addr 0x3a value 0x80
> 140070@1589698603.269017:escc2_irq_update value 0x0
> 140070@1589698603.269018:escc2_mem_read channel a addr 0x3b value 0x0
> 140070@1589698603.269076:escc2_mem_read channel a addr 0x38 value 0x0
> WARNING: Power off requested from power button or SC, powering down the
> system!
> 140070@1589698611.270845:escc2_mem_read channel a addr 0x38 value 0x0
> 140070@1589698619.271758:escc2_mem_read channel a addr 0x38 value 0x0
>
> I've noticed that removing the sunhme code for sun4u.c in QEMU prevents
> the spurious interrupt from happening for the serial device along with
> prevent the unexpected power off request (the power off request was not
> introduced by my code). I haven't investigated why the presence of
> sunhme causes these events.
>
> I modified OpenBIOS to use ttyb for stdin/stdout and assigned that to
> the 16550A so that ttya could be aliased to the SAB 82532. Outside of
> the spurious interrupt handler being called, I'm getting the same
> behaviour where Solaris identifies, attaches, and then ignores the
> device. Doesn't look like my guess was on the mark.
>
> I'll be looking at getting an OpenSolaris-like kernel built with prom
> debugging output for console/tty related files like
> usr/src/uts/common/io/consconfig_dacf.c. The illumos kernel is probably
> suitable for this because it's still maintained and appears to be
> suffering from the same console problems. I don't have a SPARC64
> machine immediately available and I'm unfamiliar with the build system
> behind these distributions, so it might be a while before this happens.
>
> I'm out of ideas.

We can use the strategy I used 10 years back for sun4m: boot the
proprietary firmware first to reduce the number of possible emulation
bugs. The proprietary firmware is known to boot Solaris.

Regards,
Artyom


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-17 12:37                   ` Artyom Tarasenko
@ 2020-05-18  2:56                     ` jasper.lowell
  2020-05-20 17:44                       ` Mike Russo
  0 siblings, 1 reply; 30+ messages in thread
From: jasper.lowell @ 2020-05-18  2:56 UTC (permalink / raw)
  To: atar4qemu
  Cc: tony.nguyen, peter.tribble, mark.cave-ayland, dgilbert, qemu-devel

> Great progress! Are you planning to contribute your escc2 to the
> upstream?

I would like to. While it didn't solve the console difficulties on
OpenSolaris variants, it's probably still a good idea to increment
Sun4u emulation towards being more faithful to hardware. It will take
me a few weeks to clean up and test but I'll make an RFC once I have a
patch to discuss. It's unlikely that the patch will be feature complete
but I'll aim for it to be enough to satisfy the Linux/OpenBSD drivers.

> We can use the strategy I used 10 years back for sun4m: boot the
> proprietary firmware first to reduce the number of possible emulation
> bugs. The proprietary firmware is known to boot Solaris.

Using the proprietary firmware for this would be ideal. It would also
provide reliable access to the kernel debugger which would be extremely
helpful for diagnosing what's going wrong with the console. I'm not
sure how I would go about making progress on this though. I know there
are binaries of the BIOS for Sun4m machines floating around but I'm not
aware of any for Sun4u machines.

Thanks,
Jasper Lowell.

On Sun, 2020-05-17 at 14:37 +0200, Artyom Tarasenko wrote:
> On Sun, May 17, 2020 at 9:57 AM <jasper.lowell@bt.com> wrote:
> > I've written up a basic implementation of the SAB 82532 ESCC2
> > device
> > and have written a patch for OpenBIOS to add it to the device tree.
> > I
> > still have the 16550A UART acting as ttya to avoid having to write
> > an
> > OpenBIOS device driver.
> 
> Great progress! Are you planning to contribute your escc2 to the
> upstream?
> 
> > OpenBSD and Solaris both identify the device correctly and attach
> > it.
> > 
> > Interestingly, it looks like Solaris entered an interrupt handler
> > to
> > deal with an event for the SAB 82532 and it probed a few status
> > registers. Given that I couldn't encourage Solaris to do anything
> > outside of attach the device for the 16550A, I was thinking this
> > might
> > be a good sign.
> > 
> > There really shouldn't be an interrupt though as the reset state of
> > the
> > SAB 82532 is to have all interrupts masked. Solaris probes these
> > interrupt status registers while "configuring" the sunhme device.
> > 
> > Attempting to configure interface hme0...
> > 140070@1589698603.268942:escc2_mem_read channel a addr 0x38 value
> > 0x4
> > 140070@1589698603.269011:escc2_irq_update value 0x0
> > 140070@1589698603.269015:escc2_mem_read channel a addr 0x3a value
> > 0x80
> > 140070@1589698603.269017:escc2_irq_update value 0x0
> > 140070@1589698603.269018:escc2_mem_read channel a addr 0x3b value
> > 0x0
> > 140070@1589698603.269076:escc2_mem_read channel a addr 0x38 value
> > 0x0
> > WARNING: Power off requested from power button or SC, powering down
> > the
> > system!
> > 140070@1589698611.270845:escc2_mem_read channel a addr 0x38 value
> > 0x0
> > 140070@1589698619.271758:escc2_mem_read channel a addr 0x38 value
> > 0x0
> > 
> > I've noticed that removing the sunhme code for sun4u.c in QEMU
> > prevents
> > the spurious interrupt from happening for the serial device along
> > with
> > prevent the unexpected power off request (the power off request was
> > not
> > introduced by my code). I haven't investigated why the presence of
> > sunhme causes these events.
> > 
> > I modified OpenBIOS to use ttyb for stdin/stdout and assigned that
> > to
> > the 16550A so that ttya could be aliased to the SAB 82532. Outside
> > of
> > the spurious interrupt handler being called, I'm getting the same
> > behaviour where Solaris identifies, attaches, and then ignores the
> > device. Doesn't look like my guess was on the mark.
> > 
> > I'll be looking at getting an OpenSolaris-like kernel built with
> > prom
> > debugging output for console/tty related files like
> > usr/src/uts/common/io/consconfig_dacf.c. The illumos kernel is
> > probably
> > suitable for this because it's still maintained and appears to be
> > suffering from the same console problems. I don't have a SPARC64
> > machine immediately available and I'm unfamiliar with the build
> > system
> > behind these distributions, so it might be a while before this
> > happens.
> > 
> > I'm out of ideas.
> 
> We can use the strategy I used 10 years back for sun4m: boot the
> proprietary firmware first to reduce the number of possible emulation
> bugs. The proprietary firmware is known to boot Solaris.
> 
> Regards,
> Artyom

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: Emulating Solaris 10 on SPARC64 sun4u
  2020-05-18  2:56                     ` jasper.lowell
@ 2020-05-20 17:44                       ` Mike Russo
  0 siblings, 0 replies; 30+ messages in thread
From: Mike Russo @ 2020-05-20 17:44 UTC (permalink / raw)
  To: jasper.lowell
  Cc: tony.nguyen, mark.cave-ayland, dgilbert, qemu-devel,
	peter.tribble, atar4qemu

[-- Attachment #1: Type: text/plain, Size: 642 bytes --]

> Using the proprietary firmware for this would be ideal. It would also
> provide reliable access to the kernel debugger which would be
> extremely
> helpful for diagnosing what's going wrong with the console. I'm not
> sure how I would go about making progress on this though. I know there
> are binaries of the BIOS for Sun4m machines floating around but I'm
> not
> aware of any for Sun4u machines.
> 

I haven't been able to find any of this firmware either. Not sure if
this helps but someone says they've got the Ultra 1 firmware (along with
cgsix and cgthree) available here:
https://people.csail.mit.edu/fredette/tme/sun-u1-nbsd.html

[-- Attachment #2: Type: text/html, Size: 1007 bytes --]

^ permalink raw reply	[flat|nested] 30+ messages in thread

end of thread, other threads:[~2020-05-20 21:39 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-05  6:31 Emulating Solaris 10 on SPARC64 sun4u jasper.lowell
2020-02-05 17:33 ` Dr. David Alan Gilbert
2020-02-07  5:43   ` jasper.lowell
2020-02-08  0:03     ` BALATON Zoltan
2020-02-10 15:38       ` BALATON Zoltan
2020-02-10 19:04         ` John Snow
2020-02-10 22:32           ` Missing IRQ with bmdma on ppc/mips/sparc? (was: Re: Emulating Solaris 10 on SPARC64 sun4u) BALATON Zoltan
2020-02-25 20:55           ` IDE IRQ problem after UDMA enabled " BALATON Zoltan
2020-02-25 22:00             ` BALATON Zoltan
2020-02-25 22:12         ` Emulating Solaris 10 on SPARC64 sun4u BALATON Zoltan
2020-02-09 11:26 ` Mark Cave-Ayland
2020-02-19  3:42   ` jasper.lowell
2020-02-19 18:54     ` BALATON Zoltan
2020-02-19 20:10       ` BALATON Zoltan
2020-02-21 19:53         ` Dr. David Alan Gilbert
2020-02-28 22:05         ` BALATON Zoltan
2020-03-01  0:15           ` BALATON Zoltan
2020-05-07 14:29   ` jasper.lowell
2020-05-07 15:02     ` Artyom Tarasenko
2020-05-08  2:33       ` jasper.lowell
2020-05-08  8:51         ` Peter Tribble
2020-05-08 13:45           ` Artyom Tarasenko
2020-05-10  2:46             ` jasper.lowell
2020-05-10  9:22               ` Mark Cave-Ayland
2020-05-17  7:57                 ` jasper.lowell
2020-05-17 12:37                   ` Artyom Tarasenko
2020-05-18  2:56                     ` jasper.lowell
2020-05-20 17:44                       ` Mike Russo
2020-05-07 18:54     ` BALATON Zoltan
2020-05-08  2:55       ` jasper.lowell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.