Re: Missing operand for tlbie instruction on Power7
From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2015-10-07 09:13:37
Also in:
lkml
On Wed, 2015-10-07 at 02:19 -0500, Segher Boessenkool wrote:
On Wed, Oct 07, 2015 at 05:00:49PM +1100, Michael Ellerman wrote:quoted
quoted
It's also worth noting that the __flush_power7 uses tlbiel instead of tlbie.Yeah that's a good point. It's not clear if the swsusp code wants to a local or a global invalidate.If I read the code right, this is called on the boot CPU when all the non-boot CPUs are still (potentially) down, so if you would do a global invalidate the non-boot CPUs might not even notice, so those need to do a (local) invalidate after being brought up anyway? Or they probably need it before being brought down at all? You figure it out, it makes my brain hurt :-)
A good rule would be that every cpu does a local invalidate before turning on the MMU. That would work for this case and also for kexec, kdump, junk left by firmare etc. But I don't think we do that consistently in a way that works for this code at the moment.
quoted
As an alternative, can you try adding a .machine push / .machine "power4" / .machine pop, around the tlbie. That should tell the assembler to drop back to power4 mode for that instruction, which should then do the right thing. There are some examples in that file.That will get the assembler to not complain, but it will assemble the wrong instruction: the power7 instruction has the same opcode (but different semantics). So if you assemble a "tlbie r4" in power4 mode, a newer CPU will see it as a "tlbie r4,r0" and do the wrong thing.
Yeah, it would basically maintain the existing behaviour which is wrong but a known quantity. I suspect no one has ever run this on Power7 or in fact anything other than G5 or Book3E. cheers