/* * This file contains the code to configure and utilize the ppc64 pmc hardware * Copyright (C) 2002 David Engebretsen */ #ifndef __KERNEL__ #define INLINE_SYSCALL(arg1, arg2) \ ({ \ register long r0 __asm__ ("r0"); \ register long r3 __asm__ ("r3"); \ register long r4 __asm__ ("r4"); \ long ret, err; \ r0 = 208; \ r3 = (long) (arg1); \ r4 = (long) (arg2); \ __asm__ ("sc\n\t" \ "mfcr %1\n\t" \ : "=r" (r3), "=r" (err) \ : "r" (r0), "r" (r3), "r" (r4) \ : "cc", "memory"); \ ret = r3; \ }) #endif #ifndef __ASSEMBLY__ struct perfmon_base_struct { u64 profile_buffer; u64 profile_length; u64 trace_buffer; u64 trace_length; u64 trace_end; u64 timeslice_buffer; u64 timeslice_length; u64 state; }; struct pmc_header { int subcmd; union { int type; int pid; /* PID to trace */ int slice; /* Timeslice ID */ } vdata; int resv[30]; }; struct pmc_struct { unsigned long pmc[11]; }; struct pmc_info_struct { unsigned int mode, cpu; unsigned int pmc_base[11]; unsigned long pmc_cumulative[8]; }; struct perfmon_struct { struct pmc_header header; union { struct pmc_struct pmc; struct pmc_info_struct pmc_info; } vdata; }; enum { PMC_CMD_BUFFER = 1, PMC_CMD_DUMP = 2, PMC_CMD_DECR_PROFILE = 3, PMC_CMD_PROFILE = 4, PMC_CMD_TRACE = 5, PMC_CMD_TIMESLICE = 6 }; enum { PMC_SUBCMD_BUFFER_ALLOC = 1, PMC_SUBCMD_BUFFER_FREE = 2, PMC_SUBCMD_BUFFER_CLEAR = 3 }; enum { PMC_SUBCMD_DUMP_COUNTERS = 1, PMC_SUBCMD_DUMP_HARDWARE = 2 }; enum { PMC_SUBCMD_PROFILE_CYCLE = 1, }; enum { PMC_SUBCMD_TIMESLICE_ENABLE = 1, PMC_SUBCMD_TIMESLICE_DISABLE = 2, PMC_SUBCMD_TIMESLICE_SET = 3 }; #define PMC_TRACE_CMD 0xFF /* * The following types are not used by the kernel; they are put into the * trace as flag records for the user space tools to interpret. */ enum { PMC_TYPE_DERC_PROFILE = 1, PMC_TYPE_CYCLE = 2, PMC_TYPE_PROFILE = 3, PMC_TYPE_DCACHE = 4, PMC_TYPE_L2_MISS = 5, PMC_TYPE_LWARCX = 6, PMC_TYPE_TIMESLICE = 7, PMC_TYPE_TIMESLICE_DUMP = 8, PMC_TYPE_END = 8 }; #endif #define PMC_STATE_INITIAL 0x00 #define PMC_STATE_READY 0x01 #define PMC_STATE_DECR_PROFILE 0x10 #define PMC_STATE_PROFILE_KERN 0x11 #define PMC_STATE_TRACE_KERN 0x20 #define PMC_STATE_TRACE_USER 0x21 #define PMC_STATE_TIMESLICE 0x40