| /* Copyright (c) 2016 Google Inc. |
| * Barret Rhoden <brho@cs.berkeley.edu> |
| * See LICENSE for details. |
| * |
| * Usage: rdmsr MSR |
| * |
| * This will read MSR on all cores. |
| * |
| * e.g. rdmsr 0x199 */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <stdint.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <assert.h> |
| #include <unistd.h> |
| #include <parlib/sysinfo.h> |
| |
| int main(int argc, char **argv) |
| { |
| uint32_t msr; |
| int fd; |
| uint64_t *buf; |
| size_t buf_sz; |
| ssize_t ret; |
| int num_cores; |
| |
| if (argc < 2) { |
| printf("Usage: %s MSR\n", argv[0]); |
| exit(-1); |
| } |
| msr = strtoul(argv[1], 0, 0); |
| num_cores = get_num_pcores(); |
| fd = open("#arch/msr", O_RDWR); |
| if (fd < 0) { |
| perror("open"); |
| exit(-1); |
| } |
| buf_sz = num_cores * sizeof(uint64_t); |
| buf = malloc(buf_sz); |
| assert(buf); |
| ret = pread(fd, buf, buf_sz, msr); |
| if (ret < 0) { |
| perror("pread"); |
| exit(-1); |
| } |
| for (int i = 0; i < num_cores; i++) |
| printf("Core %3d, MSR 0x%08x: 0x%016llx\n", i, msr, buf[i]); |
| return 0; |
| } |