svn commit: r302136 - stable/10/sys/dev/cpuctl
Konstantin Belousov
kib at FreeBSD.org
Thu Jun 23 09:04:51 UTC 2016
Author: kib
Date: Thu Jun 23 09:04:50 2016
New Revision: 302136
URL: https://svnweb.freebsd.org/changeset/base/302136
Log:
MFC r301962:
Always allow loading of cpuctl(4).
Modified:
stable/10/sys/dev/cpuctl/cpuctl.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/cpuctl/cpuctl.c
==============================================================================
--- stable/10/sys/dev/cpuctl/cpuctl.c Thu Jun 23 09:03:52 2016 (r302135)
+++ stable/10/sys/dev/cpuctl/cpuctl.c Thu Jun 23 09:04:50 2016 (r302136)
@@ -67,9 +67,9 @@ static d_ioctl_t cpuctl_ioctl;
static int cpuctl_do_msr(int cpu, cpuctl_msr_args_t *data, u_long cmd,
struct thread *td);
-static void cpuctl_do_cpuid(int cpu, cpuctl_cpuid_args_t *data,
+static int cpuctl_do_cpuid(int cpu, cpuctl_cpuid_args_t *data,
struct thread *td);
-static void cpuctl_do_cpuid_count(int cpu, cpuctl_cpuid_count_args_t *data,
+static int cpuctl_do_cpuid_count(int cpu, cpuctl_cpuid_count_args_t *data,
struct thread *td);
static int cpuctl_do_update(int cpu, cpuctl_update_args_t *data,
struct thread *td);
@@ -171,8 +171,7 @@ cpuctl_ioctl(struct cdev *dev, u_long cm
ret = cpuctl_do_msr(cpu, (cpuctl_msr_args_t *)data, cmd, td);
break;
case CPUCTL_CPUID:
- cpuctl_do_cpuid(cpu, (cpuctl_cpuid_args_t *)data, td);
- ret = 0;
+ ret = cpuctl_do_cpuid(cpu, (cpuctl_cpuid_args_t *)data, td);
break;
case CPUCTL_UPDATE:
ret = priv_check(td, PRIV_CPUCTL_UPDATE);
@@ -181,9 +180,8 @@ cpuctl_ioctl(struct cdev *dev, u_long cm
ret = cpuctl_do_update(cpu, (cpuctl_update_args_t *)data, td);
break;
case CPUCTL_CPUID_COUNT:
- cpuctl_do_cpuid_count(cpu, (cpuctl_cpuid_count_args_t *)data,
- td);
- ret = 0;
+ ret = cpuctl_do_cpuid_count(cpu,
+ (cpuctl_cpuid_count_args_t *)data, td);
break;
default:
ret = EINVAL;
@@ -196,7 +194,7 @@ fail:
/*
* Actually perform cpuid operation.
*/
-static void
+static int
cpuctl_do_cpuid_count(int cpu, cpuctl_cpuid_count_args_t *data,
struct thread *td)
{
@@ -210,23 +208,30 @@ cpuctl_do_cpuid_count(int cpu, cpuctl_cp
bzero(data->data, sizeof(data->data));
DPRINTF("[cpuctl,%d]: retrieving cpuid lev %#0x type %#0x for %d cpu\n",
__LINE__, data->level, data->level_type, cpu);
+#ifdef __i386__
+ if (cpu_id == 0)
+ return (ENODEV);
+#endif
oldcpu = td->td_oncpu;
is_bound = cpu_sched_is_bound(td);
set_cpu(cpu, td);
cpuid_count(data->level, data->level_type, data->data);
restore_cpu(oldcpu, is_bound, td);
+ return (0);
}
-static void
+static int
cpuctl_do_cpuid(int cpu, cpuctl_cpuid_args_t *data, struct thread *td)
{
cpuctl_cpuid_count_args_t cdata;
+ int error;
cdata.level = data->level;
/* Override the level type. */
cdata.level_type = 0;
- cpuctl_do_cpuid_count(cpu, &cdata, td);
+ error = cpuctl_do_cpuid_count(cpu, &cdata, td);
bcopy(cdata.data, data->data, sizeof(data->data)); /* Ignore error */
+ return (error);
}
/*
@@ -249,6 +254,10 @@ cpuctl_do_msr(int cpu, cpuctl_msr_args_t
*/
DPRINTF("[cpuctl,%d]: operating on MSR %#0x for %d cpu\n", __LINE__,
data->msr, cpu);
+#ifdef __i386__
+ if ((cpu_feature & CPUID_MSR) == 0)
+ return (ENODEV);
+#endif
oldcpu = td->td_oncpu;
is_bound = cpu_sched_is_bound(td);
set_cpu(cpu, td);
@@ -291,7 +300,9 @@ cpuctl_do_update(int cpu, cpuctl_update_
("[cpuctl,%d]: bad cpu number %d", __LINE__, cpu));
DPRINTF("[cpuctl,%d]: XXX %d", __LINE__, cpu);
- cpuctl_do_cpuid(cpu, &args, td);
+ ret = cpuctl_do_cpuid(cpu, &args, td);
+ if (ret != 0)
+ return (ret);
((uint32_t *)vendor)[0] = args.data[1];
((uint32_t *)vendor)[1] = args.data[3];
((uint32_t *)vendor)[2] = args.data[2];
@@ -518,11 +529,6 @@ cpuctl_modevent(module_t mod __unused, i
switch(type) {
case MOD_LOAD:
- if ((cpu_feature & CPUID_MSR) == 0) {
- if (bootverbose)
- printf("cpuctl: not available.\n");
- return (ENODEV);
- }
if (bootverbose)
printf("cpuctl: access to MSR registers/cpuid info.\n");
cpuctl_devs = malloc(sizeof(*cpuctl_devs) * mp_ncpus, M_CPUCTL,
More information about the svn-src-all
mailing list