summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorStanislav Sedov <stas@FreeBSD.org>2009-06-30 12:35:47 +0000
committerStanislav Sedov <stas@FreeBSD.org>2009-06-30 12:35:47 +0000
commitb2d758545bc5d29786ee9ab87d10de7ab52a7334 (patch)
tree0c67a0c6d6ba2ea6cf40b29b3fd2cfa4a7071ba9 /sys
parent462fab84b8117ed7b88429235a54a524e5977325 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/cpuctl/cpuctl.c20
-rw-r--r--sys/sys/cpuctl.h2
2 files changed, 20 insertions, 2 deletions
diff --git a/sys/dev/cpuctl/cpuctl.c b/sys/dev/cpuctl/cpuctl.c
index f3257971c310..c3a2434835fe 100644
--- a/sys/dev/cpuctl/cpuctl.c
+++ b/sys/dev/cpuctl/cpuctl.c
@@ -158,6 +158,8 @@ cpuctl_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
case CPUCTL_RDMSR:
ret = cpuctl_do_msr(cpu, (cpuctl_msr_args_t *)data, cmd, td);
break;
+ case CPUCTL_MSRSBIT:
+ case CPUCTL_MSRCBIT:
case CPUCTL_WRMSR:
ret = priv_check(td, PRIV_CPUCTL_WRMSR);
if (ret != 0)
@@ -211,6 +213,7 @@ cpuctl_do_cpuid(int cpu, cpuctl_cpuid_args_t *data, struct thread *td)
static int
cpuctl_do_msr(int cpu, cpuctl_msr_args_t *data, u_long cmd, struct thread *td)
{
+ uint64_t reg;
int is_bound = 0;
int oldcpu;
int ret;
@@ -230,9 +233,22 @@ cpuctl_do_msr(int cpu, cpuctl_msr_args_t *data, u_long cmd, struct thread *td)
if (cmd == CPUCTL_RDMSR) {
data->data = 0;
ret = rdmsr_safe(data->msr, &data->data);
- } else {
+ } else if (cmd == CPUCTL_WRMSR) {
ret = wrmsr_safe(data->msr, data->data);
- }
+ } else if (cmd == CPUCTL_MSRSBIT) {
+ critical_enter();
+ ret = rdmsr_safe(data->msr, &reg);
+ if (ret == 0)
+ ret = wrmsr_safe(data->msr, reg | data->data);
+ critical_exit();
+ } else if (cmd == CPUCTL_MSRCBIT) {
+ critical_enter();
+ ret = rdmsr_safe(data->msr, &reg);
+ if (ret == 0)
+ ret = wrmsr_safe(data->msr, reg & ~data->data);
+ critical_exit();
+ } else
+ panic("[cpuctl,%d]: unknown operation requested: %lu", __LINE__, cmd);
restore_cpu(oldcpu, is_bound, td);
return (ret);
}
diff --git a/sys/sys/cpuctl.h b/sys/sys/cpuctl.h
index 57b5acf46e74..4bddb345611c 100644
--- a/sys/sys/cpuctl.h
+++ b/sys/sys/cpuctl.h
@@ -48,5 +48,7 @@ typedef struct {
#define CPUCTL_WRMSR _IOWR('c', 2, cpuctl_msr_args_t)
#define CPUCTL_CPUID _IOWR('c', 3, cpuctl_cpuid_args_t)
#define CPUCTL_UPDATE _IOWR('c', 4, cpuctl_update_args_t)
+#define CPUCTL_MSRSBIT _IOWR('c', 5, cpuctl_msr_args_t)
+#define CPUCTL_MSRCBIT _IOWR('c', 6, cpuctl_msr_args_t)
#endif /* _CPUCTL_H_ */