mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 16:29:59 +00:00
powerpc: Make rwlocks endian safe
Our ppc64 spinlocks and rwlocks use a trick where a lock token and the paca index are placed in the lock with a single store. Since we are using two u16s they need adjusting for little endian. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
8bd0b119ae
commit
54bb7f4bda
4 changed files with 21 additions and 0 deletions
|
@ -68,8 +68,13 @@ struct paca_struct {
|
||||||
* instruction. They must travel together and be properly
|
* instruction. They must travel together and be properly
|
||||||
* aligned.
|
* aligned.
|
||||||
*/
|
*/
|
||||||
|
#ifdef __BIG_ENDIAN__
|
||||||
u16 lock_token; /* Constant 0x8000, used in locks */
|
u16 lock_token; /* Constant 0x8000, used in locks */
|
||||||
u16 paca_index; /* Logical processor number */
|
u16 paca_index; /* Logical processor number */
|
||||||
|
#else
|
||||||
|
u16 paca_index; /* Logical processor number */
|
||||||
|
u16 lock_token; /* Constant 0x8000, used in locks */
|
||||||
|
#endif
|
||||||
|
|
||||||
u64 kernel_toc; /* Kernel TOC address */
|
u64 kernel_toc; /* Kernel TOC address */
|
||||||
u64 kernelbase; /* Base address of kernel */
|
u64 kernelbase; /* Base address of kernel */
|
||||||
|
|
|
@ -32,8 +32,12 @@
|
||||||
|
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
/* use 0x800000yy when locked, where yy == CPU number */
|
/* use 0x800000yy when locked, where yy == CPU number */
|
||||||
|
#ifdef __BIG_ENDIAN__
|
||||||
#define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token))
|
#define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token))
|
||||||
#else
|
#else
|
||||||
|
#define LOCK_TOKEN (*(u32 *)(&get_paca()->paca_index))
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
#define LOCK_TOKEN 1
|
#define LOCK_TOKEN 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -363,7 +363,11 @@ long kvmppc_h_enter(struct kvm_vcpu *vcpu, unsigned long flags,
|
||||||
vcpu->arch.pgdir, true, &vcpu->arch.gpr[4]);
|
vcpu->arch.pgdir, true, &vcpu->arch.gpr[4]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __BIG_ENDIAN__
|
||||||
#define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token))
|
#define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token))
|
||||||
|
#else
|
||||||
|
#define LOCK_TOKEN (*(u32 *)(&get_paca()->paca_index))
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline int try_lock_tlbie(unsigned int *lock)
|
static inline int try_lock_tlbie(unsigned int *lock)
|
||||||
{
|
{
|
||||||
|
|
|
@ -393,7 +393,11 @@ toc_tlbie_lock:
|
||||||
.tc native_tlbie_lock[TC],native_tlbie_lock
|
.tc native_tlbie_lock[TC],native_tlbie_lock
|
||||||
.previous
|
.previous
|
||||||
ld r3,toc_tlbie_lock@toc(2)
|
ld r3,toc_tlbie_lock@toc(2)
|
||||||
|
#ifdef __BIG_ENDIAN__
|
||||||
lwz r8,PACA_LOCK_TOKEN(r13)
|
lwz r8,PACA_LOCK_TOKEN(r13)
|
||||||
|
#else
|
||||||
|
lwz r8,PACAPACAINDEX(r13)
|
||||||
|
#endif
|
||||||
24: lwarx r0,0,r3
|
24: lwarx r0,0,r3
|
||||||
cmpwi r0,0
|
cmpwi r0,0
|
||||||
bne 24b
|
bne 24b
|
||||||
|
@ -968,7 +972,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
|
||||||
32: ld r4,VCPU_KVM(r9) /* pointer to struct kvm */
|
32: ld r4,VCPU_KVM(r9) /* pointer to struct kvm */
|
||||||
|
|
||||||
/* Take the guest's tlbie_lock */
|
/* Take the guest's tlbie_lock */
|
||||||
|
#ifdef __BIG_ENDIAN__
|
||||||
lwz r8,PACA_LOCK_TOKEN(r13)
|
lwz r8,PACA_LOCK_TOKEN(r13)
|
||||||
|
#else
|
||||||
|
lwz r8,PACAPACAINDEX(r13)
|
||||||
|
#endif
|
||||||
addi r3,r4,KVM_TLBIE_LOCK
|
addi r3,r4,KVM_TLBIE_LOCK
|
||||||
24: lwarx r0,0,r3
|
24: lwarx r0,0,r3
|
||||||
cmpwi r0,0
|
cmpwi r0,0
|
||||||
|
|
Loading…
Reference in a new issue