Commit 12863939 authored by Joshua Kinard's avatar Joshua Kinard Committed by Ralf Baechle

MIPS: Adjust set_pte() SMP fix to handle R10000_LLSC_WAR

Update the recent changes to set_pte() that were added in 46011e6e
to handle R10000_LLSC_WAR, and format the assembly to match other areas
of the MIPS tree using the same WAR.

This also incorporates a patch recently sent in my Markos Chandras,
"Remove local LL/SC preprocessor variants", so that patch doesn't need
to be applied if this one is accepted.
Signed-off-by: default avatarJoshua Kinard <kumba@gentoo.org>
Fixes: 46011e6e ("MIPS: Make set_pte() SMP safe.)
Cc: David Daney <david.daney@cavium.com>
Cc: Linux/MIPS <linux-mips@linux-mips.org>
Patchwork: https://patchwork.linux-mips.org/patch/11103/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 05490626
...@@ -190,20 +190,39 @@ static inline void set_pte(pte_t *ptep, pte_t pteval) ...@@ -190,20 +190,39 @@ static inline void set_pte(pte_t *ptep, pte_t pteval)
unsigned long page_global = _PAGE_GLOBAL; unsigned long page_global = _PAGE_GLOBAL;
unsigned long tmp; unsigned long tmp;
if (kernel_uses_llsc && R10000_LLSC_WAR) {
__asm__ __volatile__ ( __asm__ __volatile__ (
" .set push\n" " .set arch=r4000 \n"
" .set noreorder\n" " .set push \n"
"1: " __LL " %[tmp], %[buddy]\n" " .set noreorder \n"
" bnez %[tmp], 2f\n" "1:" __LL "%[tmp], %[buddy] \n"
" or %[tmp], %[tmp], %[global]\n" " bnez %[tmp], 2f \n"
" " __SC " %[tmp], %[buddy]\n" " or %[tmp], %[tmp], %[global] \n"
" beqz %[tmp], 1b\n" __SC "%[tmp], %[buddy] \n"
" nop\n" " beqzl %[tmp], 1b \n"
"2:\n" " nop \n"
" .set pop" "2: \n"
: [buddy] "+m" (buddy->pte), " .set pop \n"
[tmp] "=&r" (tmp) " .set mips0 \n"
: [buddy] "+m" (buddy->pte), [tmp] "=&r" (tmp)
: [global] "r" (page_global)); : [global] "r" (page_global));
} else if (kernel_uses_llsc) {
__asm__ __volatile__ (
" .set "MIPS_ISA_ARCH_LEVEL" \n"
" .set push \n"
" .set noreorder \n"
"1:" __LL "%[tmp], %[buddy] \n"
" bnez %[tmp], 2f \n"
" or %[tmp], %[tmp], %[global] \n"
__SC "%[tmp], %[buddy] \n"
" beqz %[tmp], 1b \n"
" nop \n"
"2: \n"
" .set pop \n"
" .set mips0 \n"
: [buddy] "+m" (buddy->pte), [tmp] "=&r" (tmp)
: [global] "r" (page_global));
}
#else /* !CONFIG_SMP */ #else /* !CONFIG_SMP */
if (pte_none(*buddy)) if (pte_none(*buddy))
pte_val(*buddy) = pte_val(*buddy) | _PAGE_GLOBAL; pte_val(*buddy) = pte_val(*buddy) | _PAGE_GLOBAL;
......
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