@ -17,8 +17,7 @@
# include <linux/semaphore.h>
# include <linux/oom.h>
# include <linux/oprofile.h>
# include <asm/lowcore.h>
# include <asm/cpu_mf.h>
# include <asm/irq.h>
# include "hwsampler.h"
@ -30,12 +29,6 @@
# 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 {
@ -232,9 +225,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 ) ;
@ -673,18 +677,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 ;
@ -760,23 +752,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 ;
}
@ -1009,7 +1001,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 ;
@ -1123,7 +1115,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 ) {
@ -1198,7 +1190,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 ;
}