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);
         }
 }