]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/powerpc/oprofile/op_model_cell.c
powerpc/cell/OProfile: Fix on-stack array size in activate spu profiling function
[linux-2.6-omap-h63xx.git] / arch / powerpc / oprofile / op_model_cell.c
index 13929771bee7c10e3fe70effebcfd3f670868ec8..25a4ec2514a3e0a9fb5bdc61167d2b000740ab70 100644 (file)
@@ -216,7 +216,7 @@ static void pm_rtas_reset_signals(u32 node)
                 * failure to stop OProfile.
                 */
                printk(KERN_WARNING "%s: rtas returned: %d\n",
-                      __FUNCTION__, ret);
+                      __func__, ret);
 }
 
 static int pm_rtas_activate_signals(u32 node, u32 count)
@@ -255,7 +255,7 @@ static int pm_rtas_activate_signals(u32 node, u32 count)
 
                if (unlikely(ret)) {
                        printk(KERN_WARNING "%s: rtas returned: %d\n",
-                              __FUNCTION__, ret);
+                              __func__, ret);
                        return -EIO;
                }
        }
@@ -404,7 +404,7 @@ set_count_mode(u32 kernel, u32 user)
        }
 }
 
-static inline void enable_ctr(u32 cpu, u32 ctr, u32 * pm07_cntrl)
+static inline void enable_ctr(u32 cpu, u32 ctr, u32 *pm07_cntrl)
 {
 
        pm07_cntrl[ctr] |= CBE_PM_CTR_ENABLE;
@@ -560,7 +560,7 @@ static int cell_reg_setup(struct op_counter_config *ctr,
                if (unlikely(spu_rtas_token == RTAS_UNKNOWN_SERVICE)) {
                        printk(KERN_ERR
                               "%s: rtas token ibm,cbe-spu-perftools unknown\n",
-                              __FUNCTION__);
+                              __func__);
                        return -EIO;
                }
        }
@@ -576,12 +576,19 @@ static int cell_reg_setup(struct op_counter_config *ctr,
        if (unlikely(pm_rtas_token == RTAS_UNKNOWN_SERVICE)) {
                printk(KERN_ERR
                       "%s: rtas token ibm,cbe-perftools unknown\n",
-                      __FUNCTION__);
+                      __func__);
                return -EIO;
        }
 
        num_counters = num_ctrs;
 
+       if (unlikely(num_ctrs > NR_PHYS_CTRS)) {
+               printk(KERN_ERR
+                      "%s: Oprofile, number of specified events " \
+                      "exceeds number of physical counters\n",
+                      __func__);
+               return -EIO;
+       }
        pm_regs.group_control = 0;
        pm_regs.debug_bus_control = 0;
 
@@ -830,13 +837,13 @@ static int calculate_lfsr(int n)
 static int pm_rtas_activate_spu_profiling(u32 node)
 {
        int ret, i;
-       struct pm_signal pm_signal_local[NR_PHYS_CTRS];
+       struct pm_signal pm_signal_local[NUM_SPUS_PER_NODE];
 
        /*
         * Set up the rtas call to configure the debug bus to
         * route the SPU PCs.  Setup the pm_signal for each SPU
         */
-       for (i = 0; i < NUM_SPUS_PER_NODE; i++) {
+       for (i = 0; i < ARRAY_SIZE(pm_signal_local); i++) {
                pm_signal_local[i].cpu = node;
                pm_signal_local[i].signal_group = 41;
                /* spu i on word (i/2) */
@@ -848,12 +855,12 @@ static int pm_rtas_activate_spu_profiling(u32 node)
 
        ret = rtas_ibm_cbe_perftools(SUBFUNC_ACTIVATE,
                                     PASSTHRU_ENABLE, pm_signal_local,
-                                    (NUM_SPUS_PER_NODE
+                                    (ARRAY_SIZE(pm_signal_local)
                                      * sizeof(struct pm_signal)));
 
        if (unlikely(ret)) {
                printk(KERN_WARNING "%s: rtas returned: %d\n",
-                      __FUNCTION__, ret);
+                      __func__, ret);
                return -EIO;
        }
 
@@ -949,7 +956,7 @@ static int cell_global_start_spu(struct op_counter_config *ctr)
                if (unlikely(ret != 0)) {
                        printk(KERN_ERR
                               "%s: rtas call ibm,cbe-spu-perftools failed, return = %d\n",
-                              __FUNCTION__, ret);
+                              __func__, ret);
                        rtas_error = -EIO;
                        goto out;
                }
@@ -1061,7 +1068,7 @@ static void cell_global_stop_spu(void)
                if (unlikely(rtn_value != 0)) {
                        printk(KERN_ERR
                               "%s: rtas call ibm,cbe-spu-perftools failed, return = %d\n",
-                              __FUNCTION__, rtn_value);
+                              __func__, rtn_value);
                }
 
                /* Deactivate the signals */
@@ -1151,7 +1158,7 @@ static void cell_handle_interrupt(struct pt_regs *regs,
                for (i = 0; i < num_counters; ++i) {
                        if ((interrupt_mask & CBE_PM_CTR_OVERFLOW_INTR(i))
                            && ctr[i].enabled) {
-                               oprofile_add_pc(pc, is_kernel, i);
+                               oprofile_add_ext_sample(pc, regs, i, is_kernel);
                                cbe_write_ctr(cpu, i, reset_value[i]);
                        }
                }