Merge tag 'split-asm_system_h-for-linus-20120328' of git://git.kernel.org/pub/scm...
[linux-2.6.git] / arch / s390 / oprofile / hwsampler.c
index 59c9278..c6646de 100644 (file)
@@ -19,7 +19,7 @@
 #include <linux/oprofile.h>
 
 #include <asm/facility.h>
-#include <asm/lowcore.h>
+#include <asm/cpu_mf.h>
 #include <asm/irq.h>
 
 #include "hwsampler.h"
 #define ALERT_REQ_MASK   0x4000000000000000ul
 #define BUFFER_FULL_MASK 0x8000000000000000ul
 
-#define EI_IEA      (1 << 31)  /* invalid entry address              */
-#define EI_ISE      (1 << 30)  /* incorrect SDBT entry               */
-#define EI_PRA      (1 << 29)  /* program request alert              */
-#define EI_SACA     (1 << 23)  /* sampler authorization change alert */
-#define EI_LSDA     (1 << 22)  /* loss of sample data alert          */
-
 DECLARE_PER_CPU(struct hws_cpu_buffer, sampler_cpu_buffer);
 
 struct hws_execute_parms {
@@ -233,9 +227,20 @@ static inline unsigned long *trailer_entry_ptr(unsigned long v)
        return (unsigned long *) ret;
 }
 
-/* prototypes for external interrupt handler and worker */
 static void hws_ext_handler(struct ext_code ext_code,
-                           unsigned int param32, unsigned long param64);
+                           unsigned int param32, unsigned long param64)
+{
+       struct hws_cpu_buffer *cb = &__get_cpu_var(sampler_cpu_buffer);
+
+       if (!(param32 & CPU_MF_INT_SF_MASK))
+               return;
+
+       kstat_cpu(smp_processor_id()).irqs[EXTINT_CPM]++;
+       atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32);
+
+       if (hws_wq)
+               queue_work(hws_wq, &cb->worker);
+}
 
 static void worker(struct work_struct *work);
 
@@ -674,18 +679,6 @@ int hwsampler_activate(unsigned int cpu)
        return rc;
 }
 
-static void hws_ext_handler(struct ext_code ext_code,
-                           unsigned int param32, unsigned long param64)
-{
-       struct hws_cpu_buffer *cb;
-
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_CPM]++;
-       cb = &__get_cpu_var(sampler_cpu_buffer);
-       atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32);
-       if (hws_wq)
-               queue_work(hws_wq, &cb->worker);
-}
-
 static int check_qsi_on_setup(void)
 {
        int rc;
@@ -761,23 +754,23 @@ static int worker_check_error(unsigned int cpu, int ext_params)
        if (!sdbt || !*sdbt)
                return -EINVAL;
 
-       if (ext_params & EI_PRA)
+       if (ext_params & CPU_MF_INT_SF_PRA)
                cb->req_alert++;
 
-       if (ext_params & EI_LSDA)
+       if (ext_params & CPU_MF_INT_SF_LSDA)
                cb->loss_of_sample_data++;
 
-       if (ext_params & EI_IEA) {
+       if (ext_params & CPU_MF_INT_SF_IAE) {
                cb->invalid_entry_address++;
                rc = -EINVAL;
        }
 
-       if (ext_params & EI_ISE) {
+       if (ext_params & CPU_MF_INT_SF_ISE) {
                cb->incorrect_sdbt_entry++;
                rc = -EINVAL;
        }
 
-       if (ext_params & EI_SACA) {
+       if (ext_params & CPU_MF_INT_SF_SACA) {
                cb->sample_auth_change_alert++;
                rc = -EINVAL;
        }
@@ -1010,7 +1003,7 @@ int hwsampler_deallocate(void)
        if (hws_state != HWS_STOPPED)
                goto deallocate_exit;
 
-       ctl_clear_bit(0, 5); /* set bit 58 CR0 off */
+       measurement_alert_subclass_unregister();
        deallocate_sdbt();
 
        hws_state = HWS_DEALLOCATED;
@@ -1124,7 +1117,7 @@ int hwsampler_shutdown(void)
                mutex_lock(&hws_sem);
 
                if (hws_state == HWS_STOPPED) {
-                       ctl_clear_bit(0, 5); /* set bit 58 CR0 off */
+                       measurement_alert_subclass_unregister();
                        deallocate_sdbt();
                }
                if (hws_wq) {
@@ -1199,7 +1192,7 @@ start_all_exit:
        hws_oom = 1;
        hws_flush_all = 0;
        /* now let them in, 1407 CPUMF external interrupts */
-       ctl_set_bit(0, 5); /* set CR0 bit 58 */
+       measurement_alert_subclass_register();
 
        return 0;
 }