[OpenBIOS] Booting SunOS from OpenBIOS

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Wed Apr 3 00:01:52 CEST 2013


On 02/04/13 22:37, Artyom Tarasenko wrote:

>> Ah I think I may see the bug here - what if you change arch/sparc32/lib.c
>> line 276 in obp_memalloc() from:
>>
>> virt = ofmem_claim_virt(pointer2cell(va), size, 0);
>>
>> to:
>>
>> virt = ofmem_claim_virt(pointer2cell(va), size, align);
>>
>> Does that fix the bug for you?
>>
>
> At least, it seems to die some instructions later, thanks! Will debug more.
> Does it mean that obp_memalloc is actually using the first argument
> just as a hint? As the OpenSolaris header suggests?

(goes away and tests)

Hmmmm I'm not sure that does the right thing as the change causes my 
Solaris 8 boot to crash. Basically if align is not set to zero then the 
virtual address is ignored, and OFMEM simply allocates a chunk of memory 
on the specified alignment. From my boot here with this change:

Breakpoint 1, obp_memalloc (va=0xf0040000 <Address 0xf0040000 out of 
bounds>, size=262144, align=262144) at 
/home/build/src/openbios/openbios-git/openbios-devel/arch/sparc32/lib.c:273
273         phys = ofmem_claim_phys(-1, size, align);
(gdb) p/x align
$1 = 0x40000
(gdb) next
276         virt = ofmem_claim_virt(pointer2cell(va), size, align);
(gdb) p/x phys
$2 = 0x6f40000
(gdb) next
279         ofmem_map(phys, virt, size, 
ofmem_arch_default_translation_mode(phys));
(gdb) p/x virt
$3 = 0xffc40000
(gdb) next
281         return cell2pointer(virt);
(gdb) p/x virt
$4 = 0xffc40000
(gdb) next
282     }
(gdb)
0x001134e8 in ?? ()
(gdb) cont
Continuing.
Remote connection closed

So it would seem that the caller is definitely expecting to get a VA of 
0xf0040000 back. In fact looking at 
http://fxr.watson.org/fxr/source/sun4/os/startup.c?v=OPENSOLARIS#L818 
the caller only accepts the same VA being returned as an indication of 
success.

This does remind me of a problem on SPARC64 where we get warnings from 
the bootloader because we are trying to reallocate the same region. 
Perhaps the right question to ask is what should the behaviour be if a 
region is allocated twice? For example, what should happen in this case 
below:

virt1 = ofmem_claim(0xf0004000, 0x2000, 0);
virt2 = ofmem_claim(0xf0004000, 0x1000, 0);

If the virtual address 0xf0004000 is already claimed and mapped, should 
the old mapping be completely removed, or would we have to do something 
more complex such as split the mapped region into a new physical region 
and remap the first half of the split virtual region to the new physical 
region?

Also for reference, can you post a tar.gz of your output with both 
CONFIG_DEBUG_OBP and CONFIG_DEBUG_OFMEM enabled for the build (but 
without my modification) so we can see the duplicate memalloc?


ATB,

Mark.



More information about the OpenBIOS mailing list