microblaze: Fix pte_update function
Do not disable irq in asm but use irq macros. Systems with MSR=0 couldn't use pte_update function because msrclr was hardcoded. Signed-off-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
@@ -411,21 +411,20 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|||||||
static inline unsigned long pte_update(pte_t *p, unsigned long clr,
|
static inline unsigned long pte_update(pte_t *p, unsigned long clr,
|
||||||
unsigned long set)
|
unsigned long set)
|
||||||
{
|
{
|
||||||
unsigned long old, tmp, msr;
|
unsigned long flags, old, tmp;
|
||||||
|
|
||||||
__asm__ __volatile__("\
|
raw_local_irq_save(flags);
|
||||||
msrclr %2, 0x2\n\
|
|
||||||
nop\n\
|
__asm__ __volatile__( "lw %0, %2, r0 \n"
|
||||||
lw %0, %4, r0\n\
|
"andn %1, %0, %3 \n"
|
||||||
andn %1, %0, %5\n\
|
"or %1, %1, %4 \n"
|
||||||
or %1, %1, %6\n\
|
"sw %1, %2, r0 \n"
|
||||||
sw %1, %4, r0\n\
|
: "=&r" (old), "=&r" (tmp)
|
||||||
mts rmsr, %2\n\
|
: "r" ((unsigned long)(p + 1) - 4), "r" (clr), "r" (set)
|
||||||
nop"
|
|
||||||
: "=&r" (old), "=&r" (tmp), "=&r" (msr), "=m" (*p)
|
|
||||||
: "r" ((unsigned long)(p + 1) - 4), "r" (clr), "r" (set), "m" (*p)
|
|
||||||
: "cc");
|
: "cc");
|
||||||
|
|
||||||
|
raw_local_irq_restore(flags);
|
||||||
|
|
||||||
return old;
|
return old;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user