1# Copyright (C) 2021-2022 Intel Corporation. 2# 3# SPDX-License-Identifier: BSD-3-Clause 4# 5 6import cpuparser.cpuids 7 8dispatch_table = { 9 0x0: cpuparser.cpuids.LEAF_0, 10 0x1: cpuparser.cpuids.LEAF_1, 11 0x2: cpuparser.cpuids.LEAF_2, 12 0x4: cpuparser.cpuids.LEAF_4, 13 0x5: cpuparser.cpuids.LEAF_5, 14 0x6: cpuparser.cpuids.LEAF_6, 15 0x7: cpuparser.cpuids.LEAF_7, 16 0x9: cpuparser.cpuids.LEAF_9, 17 0xA: cpuparser.cpuids.LEAF_A, 18 0xB: cpuparser.cpuids.LEAF_B, 19 # 0xD: multiple parsers 20 # 0xF: multiple parsers 21 # 0x10: multiple parsers 22 0x1A: cpuparser.cpuids.LEAF_1A, 23 0x1F: cpuparser.cpuids.LEAF_1F, 24 0x80000000: cpuparser.cpuids.LEAF_80000000, 25 0x80000001: cpuparser.cpuids.LEAF_80000001, 26 0x80000002: cpuparser.cpuids.LEAF_80000002, 27 0x80000003: cpuparser.cpuids.LEAF_80000003, 28 0x80000004: cpuparser.cpuids.LEAF_80000004, 29 0x80000006: cpuparser.cpuids.LEAF_80000006, 30 0x80000007: cpuparser.cpuids.LEAF_80000007, 31 0x80000008: cpuparser.cpuids.LEAF_80000008, 32} 33 34def parse_cpuid(leaf, subleaf, cpu_id): 35 if leaf in dispatch_table.keys(): 36 return dispatch_table[leaf].read(cpu_id, subleaf) 37 elif leaf == 0xD: 38 if subleaf == 0: 39 return cpuparser.cpuids.LEAF_D.read(cpu_id, subleaf) 40 elif subleaf == 1: 41 return cpuparser.cpuids.LEAF_D_1.read(cpu_id, subleaf) 42 else: 43 return cpuparser.cpuids.LEAF_D_n.read(cpu_id, subleaf) 44 elif leaf == 0xF: 45 if subleaf == 0: 46 return cpuparser.cpuids.LEAF_F.read(cpu_id, subleaf) 47 elif subleaf == 1: 48 return cpuparser.cpuids.LEAF_F_1.read(cpu_id, subleaf) 49 else: 50 return cpuparser.cpuids.LEAF_F_n.read(cpu_id, subleaf) 51 elif leaf == 0x10: 52 if subleaf == 0: 53 return cpuparser.cpuids.LEAF_10.read(cpu_id, subleaf) 54 elif subleaf == 1 or subleaf == 2: 55 return cpuparser.cpuids.LEAF_10_1.read(cpu_id, subleaf) 56 elif subleaf == 3: 57 return cpuparser.cpuids.LEAF_10_3.read(cpu_id, subleaf) 58 else: 59 return None 60 else: 61 return None 62 63def parse_cpu_ids(file): 64 acc = list() 65 with open(file, "r") as f: 66 line = f.read().strip() 67 for r in line.split(","): 68 if r.find("-") > 0: 69 first, last = tuple(map(int, r.split("-"))) 70 acc.extend(range(first, last + 1)) 71 else: 72 if r: 73 acc.append(int(r)) 74 return acc 75 76def get_online_cpu_ids(): 77 return parse_cpu_ids("/sys/devices/system/cpu/online") 78 79def get_offline_cpu_ids(): 80 return parse_cpu_ids("/sys/devices/system/cpu/offline") 81