The two u16 fields lock_token and paca_index in struct paca_struct are
accessed as one u32 field via type punning.  Change this into one u32
field paca_id, and add a paca_get_index() function to access only the
low 16 bits of this.

Signed-off-by: Segher Boessenkool <[EMAIL PROTECTED]>
---
 arch/powerpc/kernel/asm-offsets.c          |    2 +-
 arch/powerpc/kernel/paca.c                 |    3 +--
 arch/powerpc/platforms/iseries/exception.S |    2 +-
 include/asm-powerpc/iseries/hv_call.h      |    2 +-
 include/asm-powerpc/paca.h                 |   18 ++++++++++++------
 include/asm-powerpc/smp.h                  |    2 +-
 include/asm-powerpc/spinlock.h             |    2 +-
 7 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/arch/powerpc/kernel/asm-offsets.c 
b/arch/powerpc/kernel/asm-offsets.c
index 4b749c4..d00171f 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -108,7 +108,7 @@ int main(void)
        DEFINE(ICACHEL1LINESPERPAGE, offsetof(struct ppc64_caches, 
ilines_per_page));
        /* paca */
        DEFINE(PACA_SIZE, sizeof(struct paca_struct));
-       DEFINE(PACAPACAINDEX, offsetof(struct paca_struct, paca_index));
+       DEFINE(PACAPACAID, offsetof(struct paca_struct, paca_id));
        DEFINE(PACAPROCSTART, offsetof(struct paca_struct, cpu_start));
        DEFINE(PACAKSAVE, offsetof(struct paca_struct, kstack));
        DEFINE(PACACURRENT, offsetof(struct paca_struct, __current));
diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c
index 55f1a25..d68d86c 100644
--- a/arch/powerpc/kernel/paca.c
+++ b/arch/powerpc/kernel/paca.c
@@ -68,8 +68,7 @@ struct slb_shadow slb_shadow[] __cacheline_aligned = {
  */
 #define PACA_INIT_COMMON(number)                                           \
        .lppaca_ptr = &lppaca[number],                                      \
-       .lock_token = 0x8000,                                               \
-       .paca_index = (number),         /* Paca Index */                    \
+       .paca_id = 0x80000000 | (number),       /* Paca Index */            \
        .kernel_toc = (unsigned long)(&__toc_start) + 0x8000UL,             \
        .hw_cpu_id = 0xffff,                                                \
        .slb_shadow_ptr = &slb_shadow[number],
diff --git a/arch/powerpc/platforms/iseries/exception.S 
b/arch/powerpc/platforms/iseries/exception.S
index 5381038..17dea0d 100644
--- a/arch/powerpc/platforms/iseries/exception.S
+++ b/arch/powerpc/platforms/iseries/exception.S
@@ -42,7 +42,7 @@ system_reset_iSeries:
        mfmsr   r24
        ori     r24,r24,MSR_RI
        mtmsrd  r24                     /* RI on */
-       lhz     r24,PACAPACAINDEX(r13)  /* Get processor # */
+       lhz     r24,(PACAPACAID+2)(r13) /* Get processor # */
        cmpwi   0,r24,0                 /* Are we processor 0? */
        bne     1f
        b       .__start_initialization_iSeries /* Start up the first processor 
*/
diff --git a/include/asm-powerpc/iseries/hv_call.h 
b/include/asm-powerpc/iseries/hv_call.h
index 162d653..998db2c 100644
--- a/include/asm-powerpc/iseries/hv_call.h
+++ b/include/asm-powerpc/iseries/hv_call.h
@@ -105,7 +105,7 @@ extern void HvCall_writeLogBuffer(const void *buffer, u64 
bufLen);
 
 static inline void HvCall_sendIPI(struct paca_struct *targetPaca)
 {
-       HvCall1(HvCallBaseSendIPI, targetPaca->paca_index);
+       HvCall1(HvCallBaseSendIPI, paca_get_index(targetPaca));
 }
 
 #endif /* _ASM_POWERPC_ISERIES_HV_CALL_H */
diff --git a/include/asm-powerpc/paca.h b/include/asm-powerpc/paca.h
index 748b35a..7665d0a 100644
--- a/include/asm-powerpc/paca.h
+++ b/include/asm-powerpc/paca.h
@@ -65,13 +65,12 @@ struct paca_struct {
 #endif /* CONFIG_PPC_ISERIES */
 
        /*
-        * MAGIC: the spinlock functions in arch/powerpc/lib/locks.c 
-        * load lock_token and paca_index with a single lwz
-        * instruction.  They must travel together and be properly
-        * aligned.
+        * MAGIC: the spinlock functions in arch/powerpc/lib/locks.c
+        * load paca_id with a single lwz instruction.  The high half
+        * of this is constant 0x8000; the low half is the paca index,
+        * accessed with paca_get_index().
         */
-       u16 lock_token;                 /* Constant 0x8000, used in locks */
-       u16 paca_index;                 /* Logical processor number */
+       u32 paca_id;
 
        u64 kernel_toc;                 /* Kernel TOC address */
        u64 stab_real;                  /* Absolute address of segment table */
@@ -117,6 +116,13 @@ struct paca_struct {
        u64 startspurr;                 /* SPURR value snapshot */
 };
 
+static inline u16 paca_get_index(struct paca_struct *paca)
+{
+       /* GCC will transform this into a single lhz instruction.  */
+
+       return paca->paca_id & 0xffff;
+}
+
 extern struct paca_struct paca[];
 
 #endif /* __KERNEL__ */
diff --git a/include/asm-powerpc/smp.h b/include/asm-powerpc/smp.h
index 505f35b..5fb4f13 100644
--- a/include/asm-powerpc/smp.h
+++ b/include/asm-powerpc/smp.h
@@ -46,7 +46,7 @@ void generic_mach_cpu_die(void);
 #endif
 
 #ifdef CONFIG_PPC64
-#define raw_smp_processor_id() (local_paca->paca_index)
+#define raw_smp_processor_id() paca_get_index(local_paca)
 #define hard_smp_processor_id() (get_paca()->hw_cpu_id)
 #else
 /* 32-bit */
diff --git a/include/asm-powerpc/spinlock.h b/include/asm-powerpc/spinlock.h
index cc4cfce..5922a2f 100644
--- a/include/asm-powerpc/spinlock.h
+++ b/include/asm-powerpc/spinlock.h
@@ -31,7 +31,7 @@
 
 #ifdef CONFIG_PPC64
 /* use 0x800000yy when locked, where yy == CPU number */
-#define LOCK_TOKEN     (*(u32 *)(&get_paca()->lock_token))
+#define LOCK_TOKEN     (get_paca()->paca_id)
 #else
 #define LOCK_TOKEN     1
 #endif
-- 
1.5.5.23.g2a5f.dirty

_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to