|
Lines 120-126
Link Here
|
| 120 |
set_cpu(int cpu, struct thread *td) |
120 |
set_cpu(int cpu, struct thread *td) |
| 121 |
{ |
121 |
{ |
| 122 |
|
122 |
|
| 123 |
KASSERT(cpu >= 0 && cpu < mp_ncpus && cpu_enabled(cpu), |
123 |
KASSERT(cpu >= 0 && cpu <= mp_maxid && cpu_enabled(cpu), |
| 124 |
("[cpuctl,%d]: bad cpu number %d", __LINE__, cpu)); |
124 |
("[cpuctl,%d]: bad cpu number %d", __LINE__, cpu)); |
| 125 |
thread_lock(td); |
125 |
thread_lock(td); |
| 126 |
sched_bind(td, cpu); |
126 |
sched_bind(td, cpu); |
|
Lines 133-139
Link Here
|
| 133 |
restore_cpu(int oldcpu, int is_bound, struct thread *td) |
133 |
restore_cpu(int oldcpu, int is_bound, struct thread *td) |
| 134 |
{ |
134 |
{ |
| 135 |
|
135 |
|
| 136 |
KASSERT(oldcpu >= 0 && oldcpu < mp_ncpus && cpu_enabled(oldcpu), |
136 |
KASSERT(oldcpu >= 0 && oldcpu <= mp_maxid && cpu_enabled(oldcpu), |
| 137 |
("[cpuctl,%d]: bad cpu number %d", __LINE__, oldcpu)); |
137 |
("[cpuctl,%d]: bad cpu number %d", __LINE__, oldcpu)); |
| 138 |
thread_lock(td); |
138 |
thread_lock(td); |
| 139 |
if (is_bound == 0) |
139 |
if (is_bound == 0) |
|
Lines 150-156
Link Here
|
| 150 |
int ret; |
150 |
int ret; |
| 151 |
int cpu = dev2unit(dev); |
151 |
int cpu = dev2unit(dev); |
| 152 |
|
152 |
|
| 153 |
if (cpu >= mp_ncpus || !cpu_enabled(cpu)) { |
153 |
if (cpu > mp_maxid || !cpu_enabled(cpu)) { |
| 154 |
DPRINTF("[cpuctl,%d]: bad cpu number %d\n", __LINE__, cpu); |
154 |
DPRINTF("[cpuctl,%d]: bad cpu number %d\n", __LINE__, cpu); |
| 155 |
return (ENXIO); |
155 |
return (ENXIO); |
| 156 |
} |
156 |
} |
|
Lines 201-207
Link Here
|
| 201 |
int is_bound = 0; |
201 |
int is_bound = 0; |
| 202 |
int oldcpu; |
202 |
int oldcpu; |
| 203 |
|
203 |
|
| 204 |
KASSERT(cpu >= 0 && cpu < mp_ncpus, |
204 |
KASSERT(cpu >= 0 && cpu <= mp_maxid, |
| 205 |
("[cpuctl,%d]: bad cpu number %d", __LINE__, cpu)); |
205 |
("[cpuctl,%d]: bad cpu number %d", __LINE__, cpu)); |
| 206 |
|
206 |
|
| 207 |
/* Explicitly clear cpuid data to avoid returning stale info. */ |
207 |
/* Explicitly clear cpuid data to avoid returning stale info. */ |
|
Lines 245-251
Link Here
|
| 245 |
int oldcpu; |
245 |
int oldcpu; |
| 246 |
int ret; |
246 |
int ret; |
| 247 |
|
247 |
|
| 248 |
KASSERT(cpu >= 0 && cpu < mp_ncpus, |
248 |
KASSERT(cpu >= 0 && cpu <= mp_maxid, |
| 249 |
("[cpuctl,%d]: bad cpu number %d", __LINE__, cpu)); |
249 |
("[cpuctl,%d]: bad cpu number %d", __LINE__, cpu)); |
| 250 |
|
250 |
|
| 251 |
/* |
251 |
/* |
|
Lines 296-302
Link Here
|
| 296 |
char vendor[13]; |
296 |
char vendor[13]; |
| 297 |
int ret; |
297 |
int ret; |
| 298 |
|
298 |
|
| 299 |
KASSERT(cpu >= 0 && cpu < mp_ncpus, |
299 |
KASSERT(cpu >= 0 && cpu <= mp_maxid, |
| 300 |
("[cpuctl,%d]: bad cpu number %d", __LINE__, cpu)); |
300 |
("[cpuctl,%d]: bad cpu number %d", __LINE__, cpu)); |
| 301 |
DPRINTF("[cpuctl,%d]: XXX %d", __LINE__, cpu); |
301 |
DPRINTF("[cpuctl,%d]: XXX %d", __LINE__, cpu); |
| 302 |
|
302 |
|
|
Lines 512-518
Link Here
|
| 512 |
int cpu; |
512 |
int cpu; |
| 513 |
|
513 |
|
| 514 |
cpu = dev2unit(dev); |
514 |
cpu = dev2unit(dev); |
| 515 |
if (cpu >= mp_ncpus || !cpu_enabled(cpu)) { |
515 |
if (cpu > mp_maxid || !cpu_enabled(cpu)) { |
| 516 |
DPRINTF("[cpuctl,%d]: incorrect cpu number %d\n", __LINE__, |
516 |
DPRINTF("[cpuctl,%d]: incorrect cpu number %d\n", __LINE__, |
| 517 |
cpu); |
517 |
cpu); |
| 518 |
return (ENXIO); |
518 |
return (ENXIO); |
|
Lines 531-545
Link Here
|
| 531 |
case MOD_LOAD: |
531 |
case MOD_LOAD: |
| 532 |
if (bootverbose) |
532 |
if (bootverbose) |
| 533 |
printf("cpuctl: access to MSR registers/cpuid info.\n"); |
533 |
printf("cpuctl: access to MSR registers/cpuid info.\n"); |
| 534 |
cpuctl_devs = malloc(sizeof(*cpuctl_devs) * mp_ncpus, M_CPUCTL, |
534 |
cpuctl_devs = malloc(sizeof(*cpuctl_devs) * (mp_maxid+1), M_CPUCTL, |
| 535 |
M_WAITOK | M_ZERO); |
535 |
M_WAITOK | M_ZERO); |
| 536 |
for (cpu = 0; cpu < mp_ncpus; cpu++) |
536 |
CPU_FOREACH(cpu) |
| 537 |
if (cpu_enabled(cpu)) |
537 |
if (cpu_enabled(cpu)) |
| 538 |
cpuctl_devs[cpu] = make_dev(&cpuctl_cdevsw, cpu, |
538 |
cpuctl_devs[cpu] = make_dev(&cpuctl_cdevsw, cpu, |
| 539 |
UID_ROOT, GID_KMEM, 0640, "cpuctl%d", cpu); |
539 |
UID_ROOT, GID_KMEM, 0640, "cpuctl%d", cpu); |
| 540 |
break; |
540 |
break; |
| 541 |
case MOD_UNLOAD: |
541 |
case MOD_UNLOAD: |
| 542 |
for (cpu = 0; cpu < mp_ncpus; cpu++) { |
542 |
CPU_FOREACH(cpu) { |
| 543 |
if (cpuctl_devs[cpu] != NULL) |
543 |
if (cpuctl_devs[cpu] != NULL) |
| 544 |
destroy_dev(cpuctl_devs[cpu]); |
544 |
destroy_dev(cpuctl_devs[cpu]); |
| 545 |
} |
545 |
} |