Le 30/04/2020 à 21:06, Rasmus Villemoes a écrit :
On 30/04/2020 17.03, Christophe Leroy wrote:
Le 30/04/2020 à 16:44, Rasmus Villemoes a écrit :
Hi,
I'm wondering why the sysreset_mpc83xx driver (as well as the similar
code in arch/powerpc/cpu/mpc83xx/cpu.c) removes the MSR_IR and MSR_DR
bits from MSR.
[snip]
But since the arch/powerpc/cpu/mpc83xx/cpu.c code in U-Boot has been
there forever, I assume I'm missing something fundamental.
On my mpc8321 it works.
However I agree it looks odd.
I think it works by chance because we have a 1:1 MMU mapping, but if you
have a difference mapping I can't see how you can disable Instruction
MMU without going through a write into SRR0/SRR1 and an rfi.
OK, thanks. Can you test if it still works if you change the code to not
clear the MSR_IR and MSR_DR bits? (I expect it will, since I assume
you'd have noticed if reboot from linux didn't work).
Due to the COVID-19 lockdown I'm working from home and don't have access
to HW tools to recover by boards in case I flash a bad Uboot, so I won't
do that for now.
However I confirm reboot works properly in Linux.
I'm actually wondering what the core does after the MSR_IR bit gets
cleared. If address translation is disabled, what instruction does it
then do immediately after the mtmsr? I mean, the pc has some value, but
how does that get interpreted without MSR_IR set?
After the mtmsr it probably continues with a few instructions that are
already in the pipeline, until the isync. Then after the isync it will
try to fetch from the physical address having the value of the pc.
If it doesn't have an existing address, you'll get a machine check.
And yes, the (unused, it seems) disable_addr_trans routine in start.S
does seem to be somewhat more complicated than a simple RMW of MSR,
suggesting that if disabling address translation was really needed
before reset, it should be done using that rather than by just clearing
the bits directly.
Yes disable_addr_trans() is exactly what has to be done for disabling
instruction address translation.
For disabling only data address translation can be done with an RMW of
MSR + isync.
Christophe