diff --git a/util/inteltool/cpu.c b/util/inteltool/cpu.c index db63d36729..74252293de 100644 --- a/util/inteltool/cpu.c +++ b/util/inteltool/cpu.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "inteltool.h" @@ -265,9 +266,9 @@ void print_tme(void) #endif } -int print_intel_core_msrs(void) +int print_intel_msrs(unsigned int range_start, unsigned int range_end) { - unsigned int i, core, id, core_num = get_number_of_cores(); + unsigned int i, core, id; msr_t msr; #define IA32_PLATFORM_ID 0x0017 @@ -2295,7 +2296,15 @@ int print_intel_core_msrs(void) close(fd_msr); - for (core = 0; core < core_num; core++) { + const unsigned int cores_range_max_limit = get_number_of_cores() - 1; + if (range_end > cores_range_max_limit) { + if (range_end != UINT_MAX) + printf("Warning: the range exceeds the maximum core number %d!\n", + cores_range_max_limit); + range_end = cores_range_max_limit; + } + + for (core = range_start; core <= range_end; core++) { #ifndef __DARWIN__ char msrfilename[64]; memset(msrfilename, 0, 64); diff --git a/util/inteltool/inteltool.c b/util/inteltool/inteltool.c index 7cff80f754..f8c5e9161d 100644 --- a/util/inteltool/inteltool.c +++ b/util/inteltool/inteltool.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "inteltool.h" #include "pcr.h" @@ -21,6 +22,7 @@ enum long_only_opts { LONG_OPT_PCR = 0x100, + LONG_OPT_RANGE = 0x101, }; /* @@ -516,6 +518,7 @@ static void print_usage(const char *name) " -d | --dmibar: dump northbridge DMIBAR registers\n" " -P | --pciexpress: dump northbridge PCIEXBAR registers\n\n" " -M | --msrs: dump CPU MSRs\n" + " --cpu-range [-]: (optional) set CPU cores range for -M (--msrs) option\n" " -A | --ambs: dump AMB registers\n" " -x | --sgx: dump SGX status\n" " -t | --tme: dump TME status\n" @@ -585,6 +588,8 @@ int main(int argc, char *argv[]) size_t pcr_count = 0; uint8_t dump_pcr[MAX_PCR_PORTS]; + unsigned int cores_range_start = 0, cores_range_end = UINT_MAX; + static struct option long_options[] = { {"version", 0, 0, 'v'}, {"help", 0, 0, 'h'}, @@ -598,6 +603,7 @@ int main(int argc, char *argv[]) {"dmibar", 0, 0, 'd'}, {"pciexpress", 0, 0, 'P'}, {"msrs", 0, 0, 'M'}, + {"cpu-range", required_argument, 0, LONG_OPT_RANGE}, {"ambs", 0, 0, 'A'}, {"spi", 0, 0, 's'}, {"spd", 0, 0, 'S'}, @@ -657,6 +663,24 @@ int main(int argc, char *argv[]) case 'M': dump_coremsrs = 1; break; + case LONG_OPT_RANGE: + if (strlen(optarg) == 0) { + print_usage(argv[0]); + exit(1); + } + const int sscanf_ret = sscanf(optarg, "%u-%u", &cores_range_start, &cores_range_end); + if (sscanf_ret == 1) { + /* the end of the range is not specified - only for one core */ + cores_range_end = cores_range_start; + } else if (sscanf_ret != 2) { + print_usage(argv[0]); + exit(1); + } else if (cores_range_end < cores_range_start) { + printf("Error: invalid cores range <%u-%u>!\n", + cores_range_start, cores_range_end); + exit(1); + } + break; case 'a': dump_gpios = 1; show_gpio_diffs = 1; @@ -859,7 +883,7 @@ int main(int argc, char *argv[]) } if (dump_coremsrs) { - print_intel_core_msrs(); + print_intel_msrs(cores_range_start, cores_range_end); printf("\n\n"); } diff --git a/util/inteltool/inteltool.h b/util/inteltool/inteltool.h index 678aa47871..4a6eba4968 100644 --- a/util/inteltool/inteltool.h +++ b/util/inteltool/inteltool.h @@ -396,7 +396,7 @@ void *map_physical(uint64_t phys_addr, size_t len); void unmap_physical(void *virt_addr, size_t len); unsigned int cpuid(unsigned int op); -int print_intel_core_msrs(void); +int print_intel_msrs(unsigned int range_start, unsigned int range_end); int print_mchbar(struct pci_dev *nb, struct pci_access *pacc, const char *dump_spd_file); int print_pmbase(struct pci_dev *sb, struct pci_access *pacc); int print_lpc(struct pci_dev *sb, struct pci_access *pacc);