]> Pileus Git - ~andy/linux/commitdiff
Merge commit 'kumar/next' into next
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Mon, 30 Mar 2009 02:46:19 +0000 (13:46 +1100)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Mon, 30 Mar 2009 02:46:19 +0000 (13:46 +1100)
arch/powerpc/include/asm/processor.h
arch/powerpc/kernel/signal.c
arch/powerpc/kernel/signal.h
arch/powerpc/kernel/signal_32.c
arch/powerpc/kernel/signal_64.c
arch/powerpc/kernel/sysfs.c
arch/powerpc/platforms/pseries/dtl.c

index d3466490104a557de496a0c531430948384e6264..9eed29eee604713957dc9cd64c933c0262928eb6 100644 (file)
@@ -313,6 +313,25 @@ static inline void prefetchw(const void *x)
 #define HAVE_ARCH_PICK_MMAP_LAYOUT
 #endif
 
+#ifdef CONFIG_PPC64
+static inline unsigned long get_clean_sp(struct pt_regs *regs, int is_32)
+{
+       unsigned long sp;
+
+       if (is_32)
+               sp = regs->gpr[1] & 0x0ffffffffUL;
+       else
+               sp = regs->gpr[1];
+
+       return sp;
+}
+#else
+static inline unsigned long get_clean_sp(struct pt_regs *regs, int is_32)
+{
+       return regs->gpr[1];
+}
+#endif
+
 #endif /* __KERNEL__ */
 #endif /* __ASSEMBLY__ */
 #endif /* _ASM_POWERPC_PROCESSOR_H */
index a54405ebd7b0c35236cafedb3edee13bcfb67fb3..00b5078da9a3f10f2e34ba160c72db098f67c612 100644 (file)
@@ -26,12 +26,12 @@ int show_unhandled_signals = 0;
  * Allocate space for the signal frame
  */
 void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
-                          size_t frame_size)
+                          size_t frame_size, int is_32)
 {
         unsigned long oldsp, newsp;
 
         /* Default to using normal stack */
-        oldsp = regs->gpr[1];
+        oldsp = get_clean_sp(regs, is_32);
 
        /* Check for alt stack */
        if ((ka->sa.sa_flags & SA_ONSTACK) &&
index f1442d69d4ece864af55c1e7889d01145dfc046f..6c0ddfc0603e80fa29c5a4b3408fa393d90e8f62 100644 (file)
@@ -15,7 +15,7 @@
 extern void do_signal(struct pt_regs *regs, unsigned long thread_info_flags);
 
 extern void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
-                                 size_t frame_size);
+                                 size_t frame_size, int is_32);
 extern void restore_sigmask(sigset_t *set);
 
 extern int handle_signal32(unsigned long sig, struct k_sigaction *ka,
index b13abf305996353735f0b1ec841fd8998da2e793..d670429a1608fe32a37a0b645df09aff7b904107 100644 (file)
@@ -836,7 +836,7 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
 
        /* Set up Signal Frame */
        /* Put a Real Time Context onto stack */
-       rt_sf = get_sigframe(ka, regs, sizeof(*rt_sf));
+       rt_sf = get_sigframe(ka, regs, sizeof(*rt_sf), 1);
        addr = rt_sf;
        if (unlikely(rt_sf == NULL))
                goto badframe;
@@ -1182,7 +1182,7 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka,
        unsigned long newsp = 0;
 
        /* Set up Signal Frame */
-       frame = get_sigframe(ka, regs, sizeof(*frame));
+       frame = get_sigframe(ka, regs, sizeof(*frame), 1);
        if (unlikely(frame == NULL))
                goto badframe;
        sc = (struct sigcontext __user *) &frame->sctx;
index e132891d3cea00e947750aa53ec97288a6f4c839..2fe6fc64b614ef9d1b935a472487eaf161967fd9 100644 (file)
@@ -402,7 +402,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,
        unsigned long newsp = 0;
        long err = 0;
 
-       frame = get_sigframe(ka, regs, sizeof(*frame));
+       frame = get_sigframe(ka, regs, sizeof(*frame), 0);
        if (unlikely(frame == NULL))
                goto badframe;
 
index e6cd6c990c25af99595b4019596d1ef8f3f86cf9..f41aec85aa497b1dd90c6da64d9e8389c22c80e1 100644 (file)
@@ -134,17 +134,15 @@ void ppc_enable_pmcs(void)
 }
 EXPORT_SYMBOL(ppc_enable_pmcs);
 
-
 #define SYSFS_PMCSETUP(NAME, ADDRESS) \
 static void read_##NAME(void *val) \
 { \
-       mtspr(ADDRESS, *(unsigned long *)val);  \
+       *(unsigned long *)val = mfspr(ADDRESS); \
 } \
-static unsigned long write_##NAME(unsigned long val) \
+static void write_##NAME(void *val) \
 { \
        ppc_enable_pmcs(); \
        mtspr(ADDRESS, *(unsigned long *)val);  \
-       return 0; \
 } \
 static ssize_t show_##NAME(struct sys_device *dev, \
                        struct sysdev_attribute *attr, \
index dc9b0f81e60f9420e0129cfa5bf68ca1c6185a41..fafcaa0e81ef593c6ed346493ed76926f21120c5 100644 (file)
@@ -107,6 +107,10 @@ static int dtl_enable(struct dtl *dtl)
        /* set our initial buffer indices */
        dtl->last_idx = lppaca[dtl->cpu].dtl_idx = 0;
 
+       /* ensure that our updates to the lppaca fields have occurred before
+        * we actually enable the logging */
+       smp_wmb();
+
        /* enable event logging */
        lppaca[dtl->cpu].dtl_enable_mask = dtl_event_mask;