#define _GNU_SOURCE #include "internal.h" #include #include #include #include int msr_open(int cpu) { char path[64]; snprintf(path, sizeof(path), "/dev/cpu/%d/msr", cpu); int fd = open(path, O_RDWR); if (fd < 0) { if (errno == ENOENT) return ICEPICK_E_NO_CAT; if (errno == EACCES || errno == EPERM) return ICEPICK_E_PERMISSION; return ICEPICK_E_MSR; } return fd; } void msr_close(int fd) { if (fd >= 0) close(fd); } int msr_read(int fd, uint32_t msr, uint64_t *value) { if (pread(fd, value, sizeof(*value), msr) != sizeof(*value)) return ICEPICK_E_MSR; return 0; } int msr_write(int fd, uint32_t msr, uint64_t value) { if (pwrite(fd, &value, sizeof(value), msr) != sizeof(value)) return ICEPICK_E_MSR; return 0; }