| From: Michael Neuling <michael.neuling@au1.ibm.com> |
| Date: Wed, 24 Apr 2013 00:30:09 +0000 |
| Subject: powerpc: Add isync to copy_and_flush |
| |
| commit 29ce3c5073057991217916abc25628e906911757 upstream. |
| |
| In __after_prom_start we copy the kernel down to zero in two calls to |
| copy_and_flush. After the first call (copy from 0 to copy_to_here:) |
| we jump to the newly copied code soon after. |
| |
| Unfortunately there's no isync between the copy of this code and the |
| jump to it. Hence it's possible that stale instructions could still be |
| in the icache or pipeline before we branch to it. |
| |
| We've seen this on real machines and it's results in no console output |
| after: |
| calling quiesce... |
| returning from prom_init |
| |
| The below adds an isync to ensure that the copy and flushing has |
| completed before any branching to the new instructions occurs. |
| |
| Signed-off-by: Michael Neuling <mikey@neuling.org> |
| Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/powerpc/kernel/head_64.S | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/arch/powerpc/kernel/head_64.S |
| +++ b/arch/powerpc/kernel/head_64.S |
| @@ -502,6 +502,7 @@ _GLOBAL(copy_and_flush) |
| sync |
| addi r5,r5,8 |
| addi r6,r6,8 |
| + isync |
| blr |
| |
| .align 8 |