[OpenBIOS] Solaris 8: ESP device enumeration issue

Mark Cave-Ayland mark.cave-ayland at siriusit.co.uk
Sat Feb 26 17:52:39 CET 2011


On 26/02/11 16:36, Blue Swirl wrote:

>> A flush should be the removal of an entry, so I would guess that Solaris
>> flushes the relevant entries and then adds them back into its IOMMU page
>> table manually?
>
> The flush would just affect an internal TLB, which is not implemented
> in QEMU, so the flush has no effect.

Right. So I added some extra code to QEMU again to get it to print the 
current translation for 0xfc000000 every time the IOMMU is accessed, and 
that looks like this:

Jumping to entry point 00004000 for type 00000005...
switching to new context:
Size: 259040+54154+47486 Bytes
SunOS Release 5.8 Version Generic_108528-09 32-bit
Copyright 1983-2001 Sun Microsystems, Inc.  All rights reserved.
Ethernet address = 52:54:0:12:34:56
Using default device instance data
vac: enabled in write through mode
mem = 131072K (0x8000000)
avail mem = 110419968
### Writing to iommu addr: 1, value 6bc000   0
--- Current translation for 0xfc000000 is 7fba06
### Setting IOMMU base addr: 6bc000
### Writing to iommu addr: 0, value 9   0
--- Current translation for 0xfc000000 is 0
### Writing to iommu addr: 5, value 0   0
--- Current translation for 0xfc000000 is 0
### IOMMU TLB flush 0
root nexus = SUNW,SPARCstation-5
iommu0 at root: obio 0x10000000
sbus0 at iommu0: obio 0x10001000
dma0 at sbus0: SBus slot 5 0x8400000
dma0 is /iommu at 0,10000000/sbus at 0,10001000/espdma at 5,8400000
### Writing to iommu addr: 6, value fc000000   0
--- Current translation for 0xfc000000 is 0
### IOMMU page flush fc000000
/iommu at 0,10000000/sbus at 0,10001000/espdma at 5,8400000/esp at 5,8800000 (esp0):
         esp-options=0x46
esp0 at dma0: SBus slot 5 0x8800000 sparc ipl 4
esp0 is /iommu at 0,10000000/sbus at 0,10001000/espdma at 5,8400000/esp at 5,8800000
### Writing to iommu addr: 6, value fc001000   0
--- Current translation for 0xfc000000 is 0
### IOMMU page flush fc001000
qemu: fatal: Trap 0x29 while interrupts disabled, Error state

So the existing translation put in place by OpenBIOS is fine until the 
the IOMMU page table is switched, at which point we die because it 
doesn't get replaced.

The fact that it is the 0xc2 (DMA enabled) command which is issued 
rather than the 0x42 non-DMA version is making this seem more of a QEMU 
bug as opposed to an OpenBIOS bug. Surely a kernel must set up its DMA 
buffers first before attempting a DMA command?

Artyom: can you definitely boot Solaris 8 under OBP? And in fact, can 
you boot any of your other test images using OpenBIOS SVN trunk?

Blue: what debugging do I need to add to prove that this is the DMA bug 
you mentioned before?


ATB,

Mark.

-- 
Mark Cave-Ayland - Senior Technical Architect
PostgreSQL - PostGIS
Sirius Corporation plc - control through freedom
http://www.siriusit.co.uk
t: +44 870 608 0063

Sirius Labs: http://www.siriusit.co.uk/labs



More information about the OpenBIOS mailing list