List Info

Thread: PowerPC G5 port update and Open Firmware woes




PowerPC G5 port update and Open Firmware woes
user name
2006-07-10 07:56:12
On Jul 10, 2006, at 2:18 AM, Sanjay Lal wrote:

> the problem is that in PoweMacs OFW runs in what the
standard  
> defines as "virtual mode", i.e. with the
MMU turned on. The kernel  
> switches the MSR + segment registers to what OFW
expects before  
> calling the client interface.   The series of mtsrin
instructions  
> basically blows away OFW's MMU context (see below for
details).  
> That is why, even though the MMU is disabled in the
kernel context,  
> the system hangs once the OFW interface is called after
the series  
> of mtsrin instructions.

But the ofwinit() routine in powerpc/oea/ofw_subr.S saves
the initial  
OFW context that exists before the kernel starts to load,
and the  
openfirmware() routine restores it prior to switching
control to OFW.  
Unless the code is faulty, all of the segment registers
should be  
loaded up to their correct virtual-mode values before the
branch to  
<openfirmware_entry>, and then subsequently restored
to whatever  
values the kernel had before, so that it shouldn't make any
 
difference if the kernel calls mtsrin or not. What bothers
me is that  
the code does seem to be buggy, but I can't figure out how.

> As it stands today the code is as follows:
>
> (1) Save OFW translations (machdep.c : save_ofmap())
> (2) pmap_bootstrap() (ofw_pmap is not initialized
yet!!)
> (3) Restore the OFW translations that NetBSD needs by
loading them  
> up in ofw_pmap (machdep.c: restore_ofmap).
>
> Unfortunately, restore_ofmap uses pmap_enter() which
can only be  
> called once the pmap layer is up.

Let me make sure I understand: Currently, OFW is not
expected to work  
until after restore_ofmap() is called, right?

> Currently, I insert page table entries for the OFW
code+data in  
> pmap_setup_segment0_map(). I think things will fare
better if you  
> add in PTEs (uncached) for the framebuffer  Also, you
need to  
> modify restore_ofmap() so that the map entries for the
framebuffer  
> are loaded into ofw_pmap.

The issues I'm having occur within pmap_bootstrap(), before
 
restore_ofmap() is called. The goal is to be able to call
printf() at  
any point in the kernel code and have it do whatever it
needs to OFW  
to print out data. If we have to wait until restore_ofmap()
is  
called, what's the point of having an early console? I
think there  
has to be another way. What do you think about the callback 

mechanism? Is it something worthwhile to pursue?

Oh a thought I just had as I was reading over what I wrote:
The PPC64  
PEM states that mtsrin instructions need to be followed, and
possibly  
also preceded, by a context-synchronizing instruction. But
these are  
absent in pmap_bootstrap(). Could this be a clue? I'll test
it out  
tomorrow.

Thanks,
Yevgeny

> On Jul 8, 2006, at 11:46 PM, Yevgeny Binder wrote:
>
>> After this point, however, pmap_bootstrap() starts
to load the 16  
>> segment registers with a loop of mtsrin
instructions. Console  
>> output stops upon the first load. I don't
understand what effect  
>> this should have: Address translation has not yet
been enabled in  
>> the kernel when this happens, and the Open Firmware
client  
>> interface routines load up their own segment
registers anyway. My  
>> only guess was that the addresses that I pass to
dcbf, which I got  
>> from Open Firmware (and are hence virtual addresses
in OFW's  
>> context, supposedly), somehow become invalid after
the mtsrin. But  
>> if address translation is off in the kernel the
whole time  
>> through, how can that be?
>

PowerPC G5 port update and Open Firmware woes
user name
2006-07-10 20:11:53
Yevgeny, if you follow my suggestion of inserting the PTEs in pmap_setup_segment0_map() AND modifying restore_ofmap(), then the early console should work.

Sanjay

On Jul 10, 2006, at 2:56 AM, Yevgeny Binder wrote:


Let me make sure I understand: Currently, OFW is not expected to work until after restore_ofmap() is called, right?


Currently, I insert page table entries for the OFW code+data in pmap_setup_segment0_map(). I think things will fare better if you add in PTEs (uncached) for the framebuffer  Also, you need to modify restore_ofmap() so that the map entries for the framebuffer are loaded into ofw_pmap.


The issues I'm having occur within pmap_bootstrap(), before restore_ofmap() is called. The goal is to be able to call printf() at any point in the kernel code and have it do whatever it needs to OFW to print out data. If we have to wait until restore_ofmap() is called, what's the point of having an early console? I think there has to be another way. What do you think about the callback mechanism? Is it something worthwhile to pursue?


Oh a thought I just had as I was reading over what I wrote: The PPC64 PEM states that mtsrin instructions need to be followed, and possibly also preceded, by a context-synchronizing instruction. But these are absent in pmap_bootstrap(). Could this be a clue? I'll test it out tomorrow.


Thanks,

Yevgeny


PowerPC G5 port update and Open Firmware woes
user name
2006-07-10 14:32:46
Yevgeny, I looked ofwinit(), it seems to save the MSR and the SPRGs and not the MMU context. openfirmware() does extract the context from ofw_pmap but ofw_pmap is only valid after restore_ofmap.

Regards
sanjay


On Jul 10, 2006, at 2:56 AM, Yevgeny Binder wrote:

But the ofwinit() routine in powerpc/oea/ofw_subr.S saves the initial OFW context that exists before the kernel starts to load, and the openfirmware() routine restores it prior to switching control to OFW. Unless the code is faulty, all of the segment registers should be loaded up to their correct virtual-mode values before the branch to <openfirmware_entry>, and then subsequently restored to whatever values the kernel had before, so that it shouldn't make any difference if the kernel calls mtsrin or not. What bothers me is that the code does seem to be buggy, but I can't figure out how.


PowerPC G5 port update and Open Firmware woes
user name
2006-07-10 14:32:46
Yevgeny, I looked ofwinit(), it seems to save the MSR and the SPRGs and not the MMU context. openfirmware() does extract the context from ofw_pmap but ofw_pmap is only valid after restore_ofmap.

Regards
sanjay


On Jul 10, 2006, at 2:56 AM, Yevgeny Binder wrote:

But the ofwinit() routine in powerpc/oea/ofw_subr.S saves the initial OFW context that exists before the kernel starts to load, and the openfirmware() routine restores it prior to switching control to OFW. Unless the code is faulty, all of the segment registers should be loaded up to their correct virtual-mode values before the branch to <openfirmware_entry>, and then subsequently restored to whatever values the kernel had before, so that it shouldn't make any difference if the kernel calls mtsrin or not. What bothers me is that the code does seem to be buggy, but I can't figure out how.


[1-4]

about | contact  Other archives ( Real Estate discussion Medical topics )