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