Print this page
11844 add rdmsr utility
Reviewed by: Dan McDonald <danmcd@joyent.com>
@@ -20,11 +20,11 @@
*/
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ * Copyright 2019 Joyent, Inc.
*/
#include <sys/types.h>
#include <sys/file.h>
@@ -37,10 +37,11 @@
#include <sys/cpuvar.h>
#include <sys/kmem.h>
#include <sys/modctl.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
+#include <sys/policy.h>
#include <sys/auxv.h>
#include <sys/cpuid_drv.h>
#include <sys/systeminfo.h>
@@ -181,10 +182,39 @@
(void *)arg, STRUCT_SIZE(h), mode))
return (EFAULT);
return (0);
}
+#ifdef __x86
+ case CPUID_RDMSR: {
+ struct cpuid_rdmsr crm = { 0, };
+ label_t label;
+
+ if (secpolicy_sys_config(cr, B_FALSE) != 0)
+ return (EPERM);
+
+ if (ddi_copyin((void *)arg, &crm, sizeof (crm), mode))
+ return (EFAULT);
+
+ kpreempt_disable();
+
+ if (on_fault(&label)) {
+ kpreempt_enable();
+ return (ENOENT);
+ }
+
+ crm.cr_msr_val = rdmsr(crm.cr_msr_nr);
+
+ no_fault();
+ kpreempt_enable();
+
+ if (ddi_copyout(&crm, (void *)arg, sizeof (crm), mode))
+ return (EFAULT);
+ return (0);
+ }
+#endif
+
default:
return (ENOTTY);
}
}