perfmon.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 2001-2002 Hewlett-Packard Co
  3.  *               Stephane Eranian <eranian@hpl.hp.com>
  4.  */
  5. #ifndef _ASM_IA64_PERFMON_H
  6. #define _ASM_IA64_PERFMON_H
  7. /*
  8.  * perfmon comamnds supported on all CPU models
  9.  */
  10. #define PFM_WRITE_PMCS 0x01
  11. #define PFM_WRITE_PMDS 0x02
  12. #define PFM_READ_PMDS 0x03
  13. #define PFM_STOP 0x04
  14. #define PFM_START 0x05
  15. #define PFM_ENABLE 0x06
  16. #define PFM_DISABLE 0x07
  17. #define PFM_CREATE_CONTEXT 0x08
  18. #define PFM_DESTROY_CONTEXT 0x09
  19. #define PFM_RESTART 0x0a
  20. #define PFM_PROTECT_CONTEXT 0x0b
  21. #define PFM_GET_FEATURES 0x0c
  22. #define PFM_DEBUG 0x0d
  23. #define PFM_UNPROTECT_CONTEXT 0x0e
  24. #define PFM_GET_PMC_RESET_VAL 0x0f
  25. /*
  26.  * CPU model specific commands (may not be supported on all models)
  27.  */
  28. #define PFM_WRITE_IBRS 0x20
  29. #define PFM_WRITE_DBRS 0x21
  30. /*
  31.  * context flags
  32.  */
  33. #define PFM_FL_INHERIT_NONE  0x00 /* never inherit a context across fork (default) */
  34. #define PFM_FL_INHERIT_ONCE  0x01 /* clone pfm_context only once across fork() */
  35. #define PFM_FL_INHERIT_ALL  0x02 /* always clone pfm_context across fork() */
  36. #define PFM_FL_NOTIFY_BLOCK      0x04 /* block task on user level notifications */
  37. #define PFM_FL_SYSTEM_WIDE  0x08 /* create a system wide context */
  38. /*
  39.  * PMC flags
  40.  */
  41. #define PFM_REGFL_OVFL_NOTIFY 0x1 /* send notification on overflow */
  42. /*
  43.  * PMD/PMC/IBR/DBR return flags (ignored on input)
  44.  *
  45.  * Those flags are used on output and must be checked in case EAGAIN is returned
  46.  * by any of the calls using a pfarg_reg_t or pfarg_dbreg_t structure.
  47.  */
  48. #define PFM_REG_RETFL_NOTAVAIL (1U<<31) /* set if register is implemented but not available */
  49. #define PFM_REG_RETFL_EINVAL (1U<<30) /* set if register entry is invalid */
  50. #define PFM_REG_RETFL_MASK (PFM_REG_RETFL_NOTAVAIL|PFM_REG_RETFL_EINVAL)
  51. #define PFM_REG_HAS_ERROR(flag) (((flag) & PFM_REG_RETFL_MASK) != 0)
  52. /*
  53.  * Request structure used to define a context
  54.  */
  55. typedef struct {
  56. unsigned long ctx_smpl_entries; /* how many entries in sampling buffer */
  57. unsigned long ctx_smpl_regs[4]; /* which pmds to record on overflow */
  58. pid_t       ctx_notify_pid; /* which process to notify on overflow */
  59. int       ctx_flags; /* noblock/block, inherit flags */
  60. void       *ctx_smpl_vaddr; /* returns address of BTB buffer */
  61. unsigned long ctx_cpu_mask; /* on which CPU to enable perfmon (systemwide) */
  62. unsigned long reserved[8]; /* for future use */
  63. } pfarg_context_t;
  64. /*
  65.  * Request structure used to write/read a PMC or PMD
  66.  */
  67. typedef struct {
  68. unsigned int reg_num; /* which register */
  69. unsigned int reg_flags; /* PMC: notify/don't notify. PMD/PMC: return flags */
  70. unsigned long reg_value; /* configuration (PMC) or initial value (PMD) */
  71. unsigned long reg_long_reset; /* reset after sampling buffer overflow (large) */
  72. unsigned long reg_short_reset;/* reset after counter overflow (small) */
  73. unsigned long reg_reset_pmds[4]; /* which other counters to reset on overflow */
  74. unsigned long   reserved[16]; /* for future use */
  75. } pfarg_reg_t;
  76. typedef struct {
  77. unsigned int dbreg_num; /* which register */
  78. unsigned int dbreg_flags; /* dbregs return flags */
  79. unsigned long dbreg_value; /* configuration (PMC) or initial value (PMD) */
  80. unsigned long reserved[6];
  81. } pfarg_dbreg_t;
  82. typedef struct {
  83. unsigned int ft_version; /* perfmon: major [16-31], minor [0-15] */
  84. unsigned int ft_smpl_version;/* sampling format: major [16-31], minor [0-15] */
  85. unsigned long reserved[4]; /* for future use */
  86. } pfarg_features_t;
  87. /*
  88.  * This header is at the beginning of the sampling buffer returned to the user.
  89.  * It is exported as Read-Only at this point. It is directly followed by the
  90.  * first record.
  91.  */
  92. typedef struct {
  93. unsigned int hdr_version; /* contains perfmon version (smpl format diffs) */
  94. unsigned int reserved;
  95. unsigned long hdr_entry_size; /* size of one entry in bytes */
  96. unsigned long hdr_count; /* how many valid entries */
  97. unsigned long hdr_pmds[4]; /* which pmds are recorded */
  98. } perfmon_smpl_hdr_t;
  99. /*
  100.  * Define the version numbers for both perfmon as a whole and the sampling buffer format.
  101.  */
  102. #define PFM_VERSION_MAJ 1U
  103. #define PFM_VERSION_MIN 0U
  104. #define PFM_VERSION (((PFM_VERSION_MAJ&0xffff)<<16)|(PFM_VERSION_MIN & 0xffff))
  105. #define PFM_SMPL_VERSION_MAJ 1U
  106. #define PFM_SMPL_VERSION_MIN 0U
  107. #define PFM_SMPL_VERSION (((PFM_SMPL_VERSION_MAJ&0xffff)<<16)|(PFM_SMPL_VERSION_MIN & 0xffff))
  108. #define PFM_VERSION_MAJOR(x) (((x)>>16) & 0xffff)
  109. #define PFM_VERSION_MINOR(x) ((x) & 0xffff)
  110. /*
  111.  * Entry header in the sampling buffer.
  112.  * The header is directly followed with the PMDS saved in increasing index 
  113.  * order: PMD4, PMD5, .... How many PMDs are present is determined by the 
  114.  * user program during context creation.
  115.  *
  116.  * XXX: in this version of the entry, only up to 64 registers can be recorded
  117.  * This should be enough for quite some time. Always check sampling format
  118.  * before parsing entries!
  119.  *
  120.  * Inn the case where multiple counters have overflowed at the same time, the 
  121.  * rate field indicate the initial value of the first PMD, based on the index.
  122.  * For instance, if PMD2 and PMD5 have ovewrflowed for this entry, the rate field
  123.  * will show the initial value of PMD2.
  124.  */
  125. typedef struct {
  126. int pid; /* identification of process */
  127. int cpu; /* which cpu was used */
  128. unsigned long rate; /* initial value of overflowed counter */
  129. unsigned long stamp; /* timestamp */
  130. unsigned long ip; /* where did the overflow interrupt happened */
  131. unsigned long regs; /* bitmask of which registers overflowed */
  132. unsigned long   period; /* sampling period used by overflowed counter (smallest pmd index) */
  133. } perfmon_smpl_entry_t;
  134. extern int perfmonctl(pid_t pid, int cmd, void *arg, int narg);
  135. #ifdef __KERNEL__
  136. extern void pfm_save_regs (struct task_struct *);
  137. extern void pfm_load_regs (struct task_struct *);
  138. extern int  pfm_inherit (struct task_struct *, struct pt_regs *);
  139. extern void pfm_context_exit (struct task_struct *);
  140. extern void pfm_flush_regs (struct task_struct *);
  141. extern void pfm_cleanup_notifiers (struct task_struct *);
  142. extern void pfm_cleanup_owners (struct task_struct *);
  143. extern int  pfm_use_debug_registers(struct task_struct *);
  144. extern int  pfm_release_debug_registers(struct task_struct *);
  145. extern int  pfm_cleanup_smpl_buf(struct task_struct *);
  146. extern void pfm_syst_wide_update_task(struct task_struct *, int);
  147. extern void perfmon_init_percpu(void);
  148. #endif /* __KERNEL__ */
  149. #endif /* _ASM_IA64_PERFMON_H */