hwc_cpus.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /* Copyright (C) 2021 Free Software Foundation, Inc.
  2. Contributed by Oracle.
  3. This file is part of GNU Binutils.
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 3, or (at your option)
  7. any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, 51 Franklin Street - Fifth Floor, Boston,
  15. MA 02110-1301, USA. */
  16. /* Hardware counter profiling: cpu types */
  17. #ifndef __HWC_CPUS_H
  18. #define __HWC_CPUS_H
  19. #define MAX_PICS 20 /* Max # of HW ctrs that can be enabled simultaneously */
  20. /* type for specifying CPU register number */
  21. typedef int regno_t;
  22. #define REGNO_ANY ((regno_t)-1)
  23. #define REGNO_INVALID ((regno_t)-2)
  24. /* --- Utilities for use with regno_t and reg_list[] --- */
  25. #define REG_LIST_IS_EMPTY(reg_list) (!(reg_list) || (reg_list)[0] == REGNO_ANY)
  26. #define REG_LIST_EOL(regno) ((regno)==REGNO_ANY)
  27. #define REG_LIST_SINGLE_VALID_ENTRY(reg_list) \
  28. (((reg_list) && (reg_list)[1] == REGNO_ANY && \
  29. (reg_list)[0] != REGNO_ANY ) ? (reg_list)[0] : REGNO_ANY)
  30. /* enum for specifying unknown or uninitialized CPU */
  31. enum
  32. {
  33. CPUVER_GENERIC = 0,
  34. CPUVER_UNDEFINED = -1
  35. };
  36. // Note: changing an values below may make older HWC experiments unreadable.
  37. // --- Sun/Oracle SPARC ---
  38. #define CPC_ULTRA1 1000
  39. #define CPC_ULTRA2 1001
  40. #define CPC_ULTRA3 1002
  41. #define CPC_ULTRA3_PLUS 1003
  42. #define CPC_ULTRA3_I 1004
  43. #define CPC_ULTRA4_PLUS 1005 /* Panther */
  44. #define CPC_ULTRA4 1017 /* Jaguar */
  45. #define CPC_ULTRA_T1 1100 /* Niagara1 */
  46. #define CPC_ULTRA_T2 1101 /* Niagara2 */
  47. #define CPC_ULTRA_T2P 1102
  48. #define CPC_ULTRA_T3 1103
  49. #define CPC_SPARC_T4 1104
  50. #define CPC_SPARC_T5 1110
  51. #define CPC_SPARC_T6 1120
  52. // #define CPC_SPARC_T7 1130 // use CPC_SPARC_M7
  53. #define CPC_SPARC_M4 1204 /* Obsolete */
  54. #define CPC_SPARC_M5 1210
  55. #define CPC_SPARC_M6 1220
  56. #define CPC_SPARC_M7 1230
  57. #define CPC_SPARC_M8 1240
  58. // --- Intel ---
  59. // Pentium
  60. #define CPC_PENTIUM 2000
  61. #define CPC_PENTIUM_MMX 2001
  62. #define CPC_PENTIUM_PRO 2002
  63. #define CPC_PENTIUM_PRO_MMX 2003
  64. #define CPC_PENTIUM_4 2017
  65. #define CPC_PENTIUM_4_HT 2027
  66. // Core Microarchitecture (Merom/Menryn)
  67. #define CPC_INTEL_CORE2 2028
  68. #define CPC_INTEL_NEHALEM 2040
  69. #define CPC_INTEL_WESTMERE 2042
  70. #define CPC_INTEL_SANDYBRIDGE 2045
  71. #define CPC_INTEL_IVYBRIDGE 2047
  72. #define CPC_INTEL_ATOM 2050 /* Atom*/
  73. #define CPC_INTEL_HASWELL 2060
  74. #define CPC_INTEL_BROADWELL 2070
  75. #define CPC_INTEL_SKYLAKE 2080
  76. #define CPC_INTEL_UNKNOWN 2499
  77. #define CPC_AMD_K8C 2500 /* Opteron, Athlon... */
  78. #define CPC_AMD_FAM_10H 2501 /* Barcelona, Shanghai... */
  79. #define CPC_AMD_FAM_11H 2502 /* Griffin... */
  80. #define CPC_AMD_FAM_15H 2503
  81. #define CPC_KPROF 3003 // OBSOLETE (To support 12.3 and earlier)
  82. #define CPC_FOX 3004 /* pseudo-chip */
  83. // --- Fujitsu ---
  84. #define CPC_SPARC64_III 3000
  85. #define CPC_SPARC64_V 3002
  86. #define CPC_SPARC64_VI 4003 /* OPL-C */
  87. #define CPC_SPARC64_VII 4004 /* Jupiter */
  88. #define CPC_SPARC64_X 4006 /* Athena */
  89. #define CPC_SPARC64_XII 4010 /* Athena++ */
  90. // aarch64. Constants from arch/arm64/include/asm/cputype.h
  91. enum {
  92. ARM_CPU_IMP_ARM = 0x41,
  93. ARM_CPU_IMP_BRCM = 0x42,
  94. ARM_CPU_IMP_CAVIUM = 0x43,
  95. ARM_CPU_IMP_APM = 0x50,
  96. ARM_CPU_IMP_QCOM = 0x51
  97. };
  98. #define AARCH64_VENDORSTR_ARM "ARM"
  99. /* strings below must match those returned by cpc_getcpuver() */
  100. typedef struct
  101. {
  102. int cpc2_cpuver;
  103. const char * cpc2_cciname;
  104. } libcpc2_cpu_lookup_t;
  105. #define LIBCPC2_CPU_LOOKUP_LIST \
  106. {CPC_AMD_K8C , "AMD Opteron & Athlon64"}, \
  107. {CPC_AMD_FAM_10H , "AMD Family 10h"}, \
  108. {CPC_AMD_FAM_11H , "AMD Family 11h"}, \
  109. {CPC_AMD_FAM_15H , "AMD Family 15h Model 01h"}, \
  110. {CPC_AMD_FAM_15H , "AMD Family 15h Model 02h"},/*future*/ \
  111. {CPC_AMD_FAM_15H , "AMD Family 15h Model 03h"},/*future*/ \
  112. {CPC_PENTIUM_4_HT , "Pentium 4 with HyperThreading"}, \
  113. {CPC_PENTIUM_4 , "Pentium 4"}, \
  114. {CPC_PENTIUM_PRO_MMX , "Pentium Pro with MMX, Pentium II"}, \
  115. {CPC_PENTIUM_PRO , "Pentium Pro, Pentium II"}, \
  116. {CPC_PENTIUM_MMX , "Pentium with MMX"}, \
  117. {CPC_PENTIUM , "Pentium"}, \
  118. {CPC_INTEL_CORE2 , "Core Microarchitecture"}, \
  119. /* Merom: F6M15: Clovertown, Kentsfield, Conroe, Merom, Woodcrest */ \
  120. /* Merom: F6M22: Merom Conroe */ \
  121. /* Penryn: F6M23: Yorkfield, Wolfdale, Penryn, Harpertown */ \
  122. /* Penryn: F6M29: Dunnington */ \
  123. {CPC_INTEL_NEHALEM , "Intel Arch PerfMon v3 on Family 6 Model 26"},/*Bloomfield, Nehalem EP*/ \
  124. {CPC_INTEL_NEHALEM , "Intel Arch PerfMon v3 on Family 6 Model 30"},/*Clarksfield, Lynnfield, Jasper Forest*/ \
  125. {CPC_INTEL_NEHALEM , "Intel Arch PerfMon v3 on Family 6 Model 31"},/*(TBD)*/ \
  126. {CPC_INTEL_NEHALEM , "Intel Arch PerfMon v3 on Family 6 Model 46"},/*Nehalem EX*/ \
  127. {CPC_INTEL_WESTMERE , "Intel Arch PerfMon v3 on Family 6 Model 37"},/*Arrandale, Clarskdale*/ \
  128. {CPC_INTEL_WESTMERE , "Intel Arch PerfMon v3 on Family 6 Model 44"},/*Gulftown, Westmere EP*/ \
  129. {CPC_INTEL_WESTMERE , "Intel Arch PerfMon v3 on Family 6 Model 47"},/*Westmere EX*/ \
  130. {CPC_INTEL_SANDYBRIDGE , "Intel Arch PerfMon v3 on Family 6 Model 42"},/*Sandy Bridge*/ \
  131. {CPC_INTEL_SANDYBRIDGE , "Intel Arch PerfMon v3 on Family 6 Model 45"},/*Sandy Bridge E, SandyBridge-EN, SandyBridge EP*/ \
  132. {CPC_INTEL_IVYBRIDGE , "Intel Arch PerfMon v3 on Family 6 Model 58"},/*Ivy Bridge*/ \
  133. {CPC_INTEL_IVYBRIDGE , "Intel Arch PerfMon v3 on Family 6 Model 62"},/*(TBD)*/ \
  134. {CPC_INTEL_ATOM , "Intel Arch PerfMon v3 on Family 6 Model 28"},/*Atom*/ \
  135. {CPC_INTEL_HASWELL , "Intel Arch PerfMon v3 on Family 6 Model 60"},/*Haswell*/ \
  136. {CPC_INTEL_HASWELL , "Intel Arch PerfMon v3 on Family 6 Model 63"},/*Haswell*/ \
  137. {CPC_INTEL_HASWELL , "Intel Arch PerfMon v3 on Family 6 Model 69"},/*Haswell*/ \
  138. {CPC_INTEL_HASWELL , "Intel Arch PerfMon v3 on Family 6 Model 70"},/*Haswell*/ \
  139. {CPC_INTEL_BROADWELL , "Intel Arch PerfMon v3 on Family 6 Model 61"},/*Broadwell*/ \
  140. {CPC_INTEL_BROADWELL , "Intel Arch PerfMon v3 on Family 6 Model 71"},/*Broadwell*/ \
  141. {CPC_INTEL_BROADWELL , "Intel Arch PerfMon v3 on Family 6 Model 79"},/*Broadwell*/ \
  142. {CPC_INTEL_BROADWELL , "Intel Arch PerfMon v3 on Family 6 Model 86"},/*Broadwell*/ \
  143. {CPC_INTEL_SKYLAKE , "Intel Arch PerfMon v4 on Family 6 Model 78"},/*Skylake*/ \
  144. {CPC_INTEL_SKYLAKE , "Intel Arch PerfMon v4 on Family 6 Model 85"},/*Skylake*/ \
  145. {CPC_INTEL_SKYLAKE , "Intel Arch PerfMon v4 on Family 6 Model 94"},/*Skylake*/ \
  146. {CPC_INTEL_UNKNOWN , "Intel Arch PerfMon"},/*Not yet in table*/ \
  147. {CPC_SPARC64_III , "SPARC64 III"/*?*/}, \
  148. {CPC_SPARC64_V , "SPARC64 V"/*?*/}, \
  149. {CPC_SPARC64_VI , "SPARC64 VI"}, \
  150. {CPC_SPARC64_VII , "SPARC64 VI & VII"}, \
  151. {CPC_SPARC64_X , "SPARC64 X"}, \
  152. {CPC_SPARC64_XII , "SPARC64 XII"}, \
  153. {CPC_ULTRA_T1 , "UltraSPARC T1"}, \
  154. {CPC_ULTRA_T2 , "UltraSPARC T2"}, \
  155. {CPC_ULTRA_T2P , "UltraSPARC T2+"}, \
  156. {CPC_ULTRA_T3 , "SPARC T3"}, \
  157. {CPC_SPARC_T4 , "SPARC T4"}, \
  158. {CPC_SPARC_M4 , "SPARC M4"}, \
  159. {CPC_SPARC_T5 , "SPARC T5"}, \
  160. {CPC_SPARC_M5 , "SPARC M5"}, \
  161. {CPC_SPARC_T6 , "SPARC T6"}, \
  162. {CPC_SPARC_M6 , "SPARC M6"}, \
  163. {CPC_SPARC_M7 , "SPARC T7"}, \
  164. {CPC_SPARC_M7 , "SPARC 3e40"}, \
  165. {CPC_SPARC_M7 , "SPARC M7"}, \
  166. {CPC_SPARC_M8 , "SPARC 3e50"}, \
  167. {CPC_ULTRA4_PLUS , "UltraSPARC IV+"}, \
  168. {CPC_ULTRA4 , "UltraSPARC IV"}, \
  169. {CPC_ULTRA3_I , "UltraSPARC IIIi"}, \
  170. {CPC_ULTRA3_I , "UltraSPARC IIIi & IIIi+"}, \
  171. {CPC_ULTRA3_PLUS , "UltraSPARC III+"}, \
  172. {CPC_ULTRA3_PLUS , "UltraSPARC III+ & IV"}, \
  173. {CPC_ULTRA3 , "UltraSPARC III"}, \
  174. {CPC_ULTRA2 , "UltraSPARC I&II"}, \
  175. {CPC_ULTRA1 , "UltraSPARC I&II"}, \
  176. {ARM_CPU_IMP_APM , AARCH64_VENDORSTR_ARM}, \
  177. {0, NULL}
  178. /* init like this:
  179. static libcpc2_cpu_lookup_t cpu_table[]={LIBCPC2_CPU_LOOKUP_LIST};
  180. */
  181. #endif