Commit 840aaef8 authored by David S. Miller's avatar David S. Miller

[SPARC64]: Add missing memory barriers to instruction patching functions.

V9 requires a write memory barrier before the instruction flush.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 45fec05f
...@@ -529,15 +529,19 @@ static void __init per_cpu_patch(void) ...@@ -529,15 +529,19 @@ static void __init per_cpu_patch(void)
}; };
*(unsigned int *) (addr + 0) = insns[0]; *(unsigned int *) (addr + 0) = insns[0];
wmb();
__asm__ __volatile__("flush %0" : : "r" (addr + 0)); __asm__ __volatile__("flush %0" : : "r" (addr + 0));
*(unsigned int *) (addr + 4) = insns[1]; *(unsigned int *) (addr + 4) = insns[1];
wmb();
__asm__ __volatile__("flush %0" : : "r" (addr + 4)); __asm__ __volatile__("flush %0" : : "r" (addr + 4));
*(unsigned int *) (addr + 8) = insns[2]; *(unsigned int *) (addr + 8) = insns[2];
wmb();
__asm__ __volatile__("flush %0" : : "r" (addr + 8)); __asm__ __volatile__("flush %0" : : "r" (addr + 8));
*(unsigned int *) (addr + 12) = insns[3]; *(unsigned int *) (addr + 12) = insns[3];
wmb();
__asm__ __volatile__("flush %0" : : "r" (addr + 12)); __asm__ __volatile__("flush %0" : : "r" (addr + 12));
p++; p++;
...@@ -558,6 +562,7 @@ static void __init gl_patch(void) ...@@ -558,6 +562,7 @@ static void __init gl_patch(void)
unsigned long addr = p1->addr; unsigned long addr = p1->addr;
*(unsigned int *) (addr + 0) = p1->insn; *(unsigned int *) (addr + 0) = p1->insn;
wmb();
__asm__ __volatile__("flush %0" : : "r" (addr + 0)); __asm__ __volatile__("flush %0" : : "r" (addr + 0));
p1++; p1++;
...@@ -568,9 +573,11 @@ static void __init gl_patch(void) ...@@ -568,9 +573,11 @@ static void __init gl_patch(void)
unsigned long addr = p2->addr; unsigned long addr = p2->addr;
*(unsigned int *) (addr + 0) = p2->insns[0]; *(unsigned int *) (addr + 0) = p2->insns[0];
wmb();
__asm__ __volatile__("flush %0" : : "r" (addr + 0)); __asm__ __volatile__("flush %0" : : "r" (addr + 0));
*(unsigned int *) (addr + 3) = p2->insns[1]; *(unsigned int *) (addr + 3) = p2->insns[1];
wmb();
__asm__ __volatile__("flush %0" : : "r" (addr + 4)); __asm__ __volatile__("flush %0" : : "r" (addr + 4));
p2++; p2++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment