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:
Родитель
8bd0b119ae
Коммит
54bb7f4bda
|
@ -68,8 +68,13 @@ struct paca_struct {
|
|||
* instruction. They must travel together and be properly
|
||||
* aligned.
|
||||
*/
|
||||
#ifdef __BIG_ENDIAN__
|
||||
u16 lock_token; /* Constant 0x8000, used in locks */
|
||||
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 kernelbase; /* Base address of kernel */
|
||||
|
|
|
@ -32,8 +32,12 @@
|
|||
|
||||
#ifdef CONFIG_PPC64
|
||||
/* use 0x800000yy when locked, where yy == CPU number */
|
||||
#ifdef __BIG_ENDIAN__
|
||||
#define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token))
|
||||
#else
|
||||
#define LOCK_TOKEN (*(u32 *)(&get_paca()->paca_index))
|
||||
#endif
|
||||
#else
|
||||
#define LOCK_TOKEN 1
|
||||
#endif
|
||||
|
||||
|
|
|
@ -363,7 +363,11 @@ long kvmppc_h_enter(struct kvm_vcpu *vcpu, unsigned long flags,
|
|||
vcpu->arch.pgdir, true, &vcpu->arch.gpr[4]);
|
||||
}
|
||||
|
||||
#ifdef __BIG_ENDIAN__
|
||||
#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)
|
||||
{
|
||||
|
|
|
@ -393,7 +393,11 @@ toc_tlbie_lock:
|
|||
.tc native_tlbie_lock[TC],native_tlbie_lock
|
||||
.previous
|
||||
ld r3,toc_tlbie_lock@toc(2)
|
||||
#ifdef __BIG_ENDIAN__
|
||||
lwz r8,PACA_LOCK_TOKEN(r13)
|
||||
#else
|
||||
lwz r8,PACAPACAINDEX(r13)
|
||||
#endif
|
||||
24: lwarx r0,0,r3
|
||||
cmpwi r0,0
|
||||
bne 24b
|
||||
|
@ -968,7 +972,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
|
|||
32: ld r4,VCPU_KVM(r9) /* pointer to struct kvm */
|
||||
|
||||
/* Take the guest's tlbie_lock */
|
||||
#ifdef __BIG_ENDIAN__
|
||||
lwz r8,PACA_LOCK_TOKEN(r13)
|
||||
#else
|
||||
lwz r8,PACAPACAINDEX(r13)
|
||||
#endif
|
||||
addi r3,r4,KVM_TLBIE_LOCK
|
||||
24: lwarx r0,0,r3
|
||||
cmpwi r0,0
|
||||
|
|
Загрузка…
Ссылка в новой задаче