Home | History | Annotate | Download | only in simpleperf
      1 #!/usr/bin/python
      2 #
      3 # Copyright (C) 2015 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #      http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 #
     17 
     18 
     19 def gen_event_type_entry_str(event_type_name, event_type, event_config):
     20   """
     21   return string like:
     22   {"cpu-cycles", PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES},
     23   """
     24   return '{"%s", %s, %s},\n' % (event_type_name, event_type, event_config)
     25 
     26 
     27 def gen_hardware_events():
     28   hardware_configs = ["cpu-cycles",
     29                       "instructions",
     30                       "cache-references",
     31                       "cache-misses",
     32                       "branch-instructions",
     33                       "branch-misses",
     34                       "bus-cycles",
     35                       "stalled-cycles-frontend",
     36                       "stalled-cycles-backend",
     37                       ]
     38   generated_str = ""
     39   for config in hardware_configs:
     40     event_type_name = config
     41     event_config = "PERF_COUNT_HW_" + config.replace('-', '_').upper()
     42 
     43     generated_str += gen_event_type_entry_str(
     44         event_type_name, "PERF_TYPE_HARDWARE", event_config)
     45 
     46   return generated_str
     47 
     48 
     49 def gen_software_events():
     50   software_configs = ["cpu-clock",
     51                       "task-clock",
     52                       "page-faults",
     53                       "context-switches",
     54                       "cpu-migrations",
     55                       ["minor-faults", "PERF_COUNT_SW_PAGE_FAULTS_MIN"],
     56                       ["major-faults", "PERF_COUNT_SW_PAGE_FAULTS_MAJ"],
     57                       "alignment-faults",
     58                       "emulation-faults",
     59                       ]
     60   generated_str = ""
     61   for config in software_configs:
     62     if isinstance(config, list):
     63       event_type_name = config[0]
     64       event_config = config[1]
     65     else:
     66       event_type_name = config
     67       event_config = "PERF_COUNT_SW_" + config.replace('-', '_').upper()
     68 
     69     generated_str += gen_event_type_entry_str(
     70         event_type_name, "PERF_TYPE_SOFTWARE", event_config)
     71 
     72   return generated_str
     73 
     74 
     75 def gen_hw_cache_events():
     76   hw_cache_types = [["L1-dcache", "PERF_COUNT_HW_CACHE_L1D"],
     77                     ["L1-icache", "PERF_COUNT_HW_CACHE_L1I"],
     78                     ["LLC", "PERF_COUNT_HW_CACHE_LL"],
     79                     ["dTLB", "PERF_COUNT_HW_CACHE_DTLB"],
     80                     ["iTLB", "PERF_COUNT_HW_CACHE_ITLB"],
     81                     ["branch", "PERF_COUNT_HW_CACHE_BPU"],
     82                     ["node", "PERF_COUNT_HW_CACHE_NODE"],
     83                     ]
     84   hw_cache_ops = [["loads", "load", "PERF_COUNT_HW_CACHE_OP_READ"],
     85                   ["stores", "store", "PERF_COUNT_HW_CACHE_OP_WRITE"],
     86                   ["prefetches", "prefetch",
     87                    "PERF_COUNT_HW_CACHE_OP_PREFETCH"],
     88                   ]
     89   hw_cache_op_results = [["accesses", "PERF_COUNT_HW_CACHE_RESULT_ACCESS"],
     90                          ["misses", "PERF_COUNT_HW_CACHE_RESULT_MISS"],
     91                          ]
     92   generated_str = ""
     93   for (type_name, type_config) in hw_cache_types:
     94     for (op_name_access, op_name_miss, op_config) in hw_cache_ops:
     95       for (result_name, result_config) in hw_cache_op_results:
     96         if result_name == "accesses":
     97           event_type_name = type_name + '-' + op_name_access
     98         else:
     99           event_type_name = type_name + '-' + \
    100               op_name_miss + '-' + result_name
    101         event_config = "((%s) | (%s << 8) | (%s << 16))" % (
    102             type_config, op_config, result_config)
    103         generated_str += gen_event_type_entry_str(
    104             event_type_name, "PERF_TYPE_HW_CACHE", event_config)
    105 
    106   return generated_str
    107 
    108 
    109 def gen_user_space_events():
    110   generated_str = gen_event_type_entry_str("inplace-sampler",
    111                                            "SIMPLEPERF_TYPE_USER_SPACE_SAMPLERS",
    112                                            "SIMPLEPERF_CONFIG_INPLACE_SAMPLER")
    113   return generated_str
    114 
    115 def gen_events():
    116   generated_str = "// This file is auto-generated by generate-event_table.py.\n\n"
    117   generated_str += gen_hardware_events() + '\n'
    118   generated_str += gen_software_events() + '\n'
    119   generated_str += gen_hw_cache_events() + '\n'
    120   generated_str += gen_user_space_events() + '\n'
    121   return generated_str
    122 
    123 generated_str = gen_events()
    124 fh = open('event_type_table.h', 'w')
    125 fh.write(generated_str)
    126 fh.close()
    127