static ssize_t msr_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { u32 __user *tmp = (u32 __user *) buf; u32 data[2]; u32 reg = *ppos; int cpu = iminor(file->f_path.dentry->d_inode); int err = 0; ssize_t bytes = 0; if (count % 8) return -EINVAL; /* Invalid chunk size */ for (; count; count -= 8) { err = rdmsr_safe_on_cpu(cpu, reg, &data[0], &data[1]); if (err) break; if (copy_to_user(tmp, &data, 8)) { err = -EFAULT; break; } tmp += 2; bytes += 8; } return bytes ? bytes : err; }
static ssize_t msr_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { u32 __user *tmp = (u32 __user *) buf; u32 data[2]; u32 reg = *ppos; int cpu = iminor(file_inode(file)); int err = 0; ssize_t bytes = 0; struct msr_session_info *myinfo = file->private_data; if (count % 8) return -EINVAL; /* Invalid chunk size */ if (!myinfo->rawio_allowed && !msr_whitelist_maskexists(reg)) return -EACCES; for (; count; count -= 8) { err = rdmsr_safe_on_cpu(cpu, reg, &data[0], &data[1]); if (err) break; if (copy_to_user(tmp, &data, 8)) { err = -EFAULT; break; } tmp += 2; bytes += 8; } return bytes ? bytes : err; }
static uint64_t msr_read(struct sonic_msr *msr, int offset) { int err = 0; uint64_t ret; uint32_t *p = (uint32_t *) &ret; uint32_t *q = p + 1; err = rdmsr_safe_on_cpu(msr->cpu, offset, p, q); if (err) return -1; else return ret; }
static ssize_t msr_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { const u32 __user *tmp = (const u32 __user *)buf; u32 curdata[2]; u32 data[2]; u32 reg = *ppos; u64 mask; int cpu = iminor(file_inode(file)); int err = 0; ssize_t bytes = 0; struct msr_session_info *myinfo = file->private_data; if (count % 8) return -EINVAL; /* Invalid chunk size */ mask = myinfo->rawio_allowed ? 0xffffffffffffffff : msr_whitelist_writemask(reg); if (!myinfo->rawio_allowed && mask == 0) return -EACCES; for (; count; count -= 8) { if (copy_from_user(&data, tmp, 8)) { err = -EFAULT; break; } if (mask != 0xffffffffffffffff) { err = rdmsr_safe_on_cpu(cpu, reg, &curdata[0], &curdata[1]); if (err) break; *(u64 *)&curdata[0] &= ~mask; *(u64 *)&data[0] &= mask; *(u64 *)&data[0] |= *(u64 *)&curdata[0]; } err = wrmsr_safe_on_cpu(cpu, reg, data[0], data[1]); if (err) break; tmp += 2; bytes += 8; } return bytes ? bytes : err; }
int VBOXCALL supdrvOSMsrProberRead(uint32_t uMsr, RTCPUID idCpu, uint64_t *puValue) { # ifdef SUPDRV_LINUX_HAS_SAFE_MSR_API uint32_t u32Low, u32High; int rc; if (idCpu == NIL_RTCPUID) rc = rdmsr_safe(uMsr, &u32Low, &u32High); else if (RTMpIsCpuOnline(idCpu)) rc = rdmsr_safe_on_cpu(idCpu, uMsr, &u32Low, &u32High); else return VERR_CPU_OFFLINE; if (rc == 0) { *puValue = RT_MAKE_U64(u32Low, u32High); return VINF_SUCCESS; } return VERR_ACCESS_DENIED; # else return VERR_NOT_SUPPORTED; # endif }